我陷入了这样一种情况,我有每个主机的变量文件,我想从一个 ansible 任务中的两个文件加载变量,一个是全局的,一个是特定于主机的。我想做这样的事情:
- name: Add Variable
ansible.builtin.include_vars:
files:
- 'variable_global.yaml'
- 'variable_{{ inventory_hostname }}.yaml'
请指教我如何做到这一点。
我尝试移动目录中的所有文件并从该目录加载变量,但它从所有主机文件加载变量。
我希望用户在执行过程中通过暂停剧本来填充变量值。因此无法在剧本执行之前加载它。
我希望用户在执行过程中通过暂停剧本来填充变量值。因此无法在剧本执行之前加载它。
您误解了 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