如何在 ansible 中从两个文件加载变量,给定一个文件名本身就有变量?

问题描述 投票:0回答:1

我陷入了这样一种情况,我有每个主机的变量文件,我想从一个 ansible 任务中的两个文件加载变量,一个是全局的,一个是特定于主机的。我想做这样的事情:

 - name: Add Variable
   ansible.builtin.include_vars:
     files:
       - 'variable_global.yaml'
       - 'variable_{{ inventory_hostname }}.yaml'

请指教我如何做到这一点。

我尝试移动目录中的所有文件并从该目录加载变量,但它从所有主机文件加载变量。

我希望用户在执行过程中通过暂停剧本来填充变量值。因此无法在剧本执行之前加载它。

variables ansible
1个回答
0
投票

我希望用户在执行过程中通过暂停剧本来填充变量值。因此无法在剧本执行之前加载它。

您误解了 Ansible 如何通过 jinja2 模板解析变量值。每次 used 时都会评估变量内容,而不是 declared 时。因此,您绝对可以在开始时定义一个变量,该变量依赖于您稍后将在运行时创建/填充的另一个变量。您只需要谨慎设置默认值和/或在实际正确解释之前不使用该 var。

话虽如此,您正在尝试重新发明轮子,因为 Ansible 中的一切都可以开箱即用地解决您的问题。

注意:在下面的示例中,我使用

vars_prompt
在运行时创建/填充变量,但结果将等同于在任务中使用
pause
prompt
set_fact
对于给定主机甚至
register
来捕获任务输出。

测试文件结构:

.
├── inventories
│   └── test
│       ├── group_vars
│       │   └── all.yml
│       ├── hosts.yml
│       └── host_vars
│           └── test1.yml
└── playbook.yml

hosts.yml
库存:

---
all:
  hosts:
    test1:
    test2:

all.yml
组变量:

---
a_global_var: "{{ some_runtime_global_var }}"

test1.yml
具体变量:

---
a_host_var: "value for host 1"

鉴于以上清单,以下登录

playbook.yml

---
- name: Organize vars demo
  hosts: all
  gather_facts: false

  vars_prompt:
    - name: some_runtime_global_var
      prompt: "What is the value of some_runtime_global_var"
      private: no

  tasks:
    - name: Debug global var
      ansible.builtin.debug:
        var: a_global_var

    - name: Debug host var
      ansible.builtin.debug:
        var: a_host_var | d('Var is not defined for host {{ inventory_hostname }}')

给予:

$ ansible-playbook -i inventories/test/ playbook.yml 
What is the value of some_runtime_global_var: value enterred at runtime

PLAY [Organize vars demo] ********************************************

TASK [Debug global var] **********************************************
ok: [test1] => {
    "a_global_var": "value enterred at runtime"
}
ok: [test2] => {
    "a_global_var": "value enterred at runtime"
}

TASK [Debug host var] ************************************************
ok: [test1] => {
    "a_host_var | d('Var is not defined for host test1')": "value for host 1"
}
ok: [test2] => {
    "a_host_var | d('Var is not defined for host test2')": "Var is not defined for host test2"
}

PLAY RECAP ***********************************************************
test1                      : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
test2                      : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0 
© www.soinside.com 2019 - 2024. All rights reserved.