在 Ansible 中动态生成复杂的数据结构
Dynamically generating complex data structures in Ansible
我想出的方法是:
- name: ...
set_fact:
_forwards: '{% set _r = [] %}{%
for _g in _guests %}{{
_r.append({
"p_from_interface": "!lxcbr0",
"p_from_port": hostvars[_g].ansible_port,
"p_to_host": _g,
"p_to_port": 22,
}) }}{%
endfor %}{{
_r
}}'
vars:
_guests: '{{
hostvars
| dictselectattr("location", "eq", inventory_hostname)
| list
}}'
这里我为下面的任务准备数据,这些任务会添加相应的iptables
规则。有没有办法让它更具可读性?
我认为:
我认为您的部分问题是线路噪声与实际问题 "meat" 混合在一起;将其与类似的东西进行对比:
_forwards: |
{%- set r = [] -%}
{%- for g in guests %}{%
set _ = r.append({
"p_from_interface": "!lxcbr0",
"p_from_port": hostvars[g].ansible_port,
"p_to_host": g,
"p_to_port": 22,
})
%}{% endfor -%}
{{ r }}
我还想指出 jinja vars 是块范围的,所以你不需要在它们前面加上下划线来防止它们 "leaking" 在你的 jinja 模板中; r
和 g
将无法在其他任何地方使用。
我想出的方法是:
- name: ...
set_fact:
_forwards: '{% set _r = [] %}{%
for _g in _guests %}{{
_r.append({
"p_from_interface": "!lxcbr0",
"p_from_port": hostvars[_g].ansible_port,
"p_to_host": _g,
"p_to_port": 22,
}) }}{%
endfor %}{{
_r
}}'
vars:
_guests: '{{
hostvars
| dictselectattr("location", "eq", inventory_hostname)
| list
}}'
这里我为下面的任务准备数据,这些任务会添加相应的iptables
规则。有没有办法让它更具可读性?
我认为:
我认为您的部分问题是线路噪声与实际问题 "meat" 混合在一起;将其与类似的东西进行对比:
_forwards: |
{%- set r = [] -%}
{%- for g in guests %}{%
set _ = r.append({
"p_from_interface": "!lxcbr0",
"p_from_port": hostvars[g].ansible_port,
"p_to_host": g,
"p_to_port": 22,
})
%}{% endfor -%}
{{ r }}
我还想指出 jinja vars 是块范围的,所以你不需要在它们前面加上下划线来防止它们 "leaking" 在你的 jinja 模板中; r
和 g
将无法在其他任何地方使用。