我有一种正在循环的配置变量文件,
checks:
- name: "x"
setting: "y"
eval: "{{ 'OK' if var == 'x' else 'NOK' }}"
main.yml
- hosts: all
tasks:
- name: Loop
include_tasks: do.yml
loop: "{{ checks }}"
现在的问题是 eval 在进入循环时被模板化/扩展......
在 do.yml 中
---
- debug:
var: item
# (shows eval as NOK)
- name: Do stuff
shell:
register: var
- name: Save stuff
set_fact
result: "{{ result | d([]) + [ res ] }}"
vars:
res:
name: "{{ item.name }}"
setting: "{{ item.setting }}"
result: "{{ item.eval }}"
如何在注册 var 后重新评估
item.eval
?checks.yml
文件中使用大括号,那么它将在循环内进行模板化。我就是无法让它发挥作用。
发生的情况是,eval 部分在进入循环之前就被模板化,然后它使用模板化值而不是在
Save stuff
任务发生时评估变量引用。
问:“
eval
在进入循环时被模板化/扩展”
对,这就是设计和预期的行为。
问:“在循环内进行模板化”
当时只是模板。
一个最小的示例手册
---
- hosts: localhost
become: false
gather_facts: false
vars:
checks:
- name: "x"
setting: "y"
- name: "y"
setting: "x"
tasks:
- name: Loop
debug:
msg: "{{ result | d([]) + [ res ] }}"
vars:
res:
name: "{{ item.name }}"
setting: "{{ item.setting }}"
eval: "{{ 'OK' if item.name == 'x' else 'NOK' }}"
loop: "{{ checks }}"
将产生
的输出TASK [Loop] **********************************************
ok: [localhost] => (item={'name': 'x', 'setting': 'y'}) =>
msg:
- eval: OK
name: x
setting: y
ok: [localhost] => (item={'name': 'y', 'setting': 'x'}) =>
msg:
- eval: NOK
name: y
setting: x