在 Jinja 模板中迭代变量
Iterate over Variable in Jinja Template
我想在 ansible yaml 中迭代一个变量并在 jinja 模板中添加键和值
变量:
my:
variable:
- name: test
path: /etc/apt
cert: key.crt
我的模板
{% for key, value in item() %}
{{key}}: {{value}}
{% endfor %}
ansible yaml
- name: test
template:
force: yes
src: test.conf.j2
dest: /tmp/test.conf"
become: yes
with_items:
- "{{ my.variable }}"
我的 yaml 应该是什么样子:
path: /etc/apt
cert: key.crt
你的任务实际上有三个问题:
使用循环时,可能是 loop
或 with_*
的所有风格,您访问当前使用变量 item
循环的元素,所以不是您在任务中使用的函数 (item()
)
你正在做一个多余的list of list in
with_items:
- "{{ my.variable }}"
第一步是 with_items: "{{ my.variable }}"
。
一个更好的步骤是使用 loop
替换 with_*
语法 as suggested in the documentation
We added loop
in Ansible 2.5. It is not yet a full replacement for with_<lookup>
, but we recommend it for most use cases.
所以你最终会得到
loop: "{{ my.variable }}"
然后使用语法
在 Jinja 中访问字典的属性
{% for key, value in dict.items() %}
来源:https://jinja.palletsprojects.com/en/2.11.x/templates/#for
所以在你的情况下:
{% for key, value in item.items() %}
总而言之,证明这一点的工作手册是:
- hosts: all
gather_facts: no
tasks:
- debug:
msg: |
{% for key, value in item.items() %}
{{key}}: {{value}}
{% endfor %}
loop: "{{ my.variable }}"
vars:
my:
variable:
- name: test
path: /etc/apt
cert: key.crt
产生结果:
PLAY [all] *******************************************************************************************************
TASK [debug] *****************************************************************************************************
ok: [localhost] => (item={'name': 'test', 'path': '/etc/apt', 'cert': 'key.crt'}) => {
"msg": " name: test\n path: /etc/apt\n cert: key.crt\n"
}
PLAY RECAP *******************************************************************************************************
localhost : ok=1 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
现在您只需在模板和循环中重复使用它,您就会得到您期望的结果。
我想在 ansible yaml 中迭代一个变量并在 jinja 模板中添加键和值
变量:
my:
variable:
- name: test
path: /etc/apt
cert: key.crt
我的模板
{% for key, value in item() %}
{{key}}: {{value}}
{% endfor %}
ansible yaml
- name: test
template:
force: yes
src: test.conf.j2
dest: /tmp/test.conf"
become: yes
with_items:
- "{{ my.variable }}"
我的 yaml 应该是什么样子:
path: /etc/apt
cert: key.crt
你的任务实际上有三个问题:
使用循环时,可能是
loop
或with_*
的所有风格,您访问当前使用变量item
循环的元素,所以不是您在任务中使用的函数 (item()
)你正在做一个多余的list of list in
with_items: - "{{ my.variable }}"
第一步是
with_items: "{{ my.variable }}"
。
一个更好的步骤是使用loop
替换with_*
语法 as suggested in the documentationWe added
loop
in Ansible 2.5. It is not yet a full replacement forwith_<lookup>
, but we recommend it for most use cases.所以你最终会得到
loop: "{{ my.variable }}"
然后使用语法
在 Jinja 中访问字典的属性{% for key, value in dict.items() %}
来源:https://jinja.palletsprojects.com/en/2.11.x/templates/#for
所以在你的情况下:{% for key, value in item.items() %}
总而言之,证明这一点的工作手册是:
- hosts: all
gather_facts: no
tasks:
- debug:
msg: |
{% for key, value in item.items() %}
{{key}}: {{value}}
{% endfor %}
loop: "{{ my.variable }}"
vars:
my:
variable:
- name: test
path: /etc/apt
cert: key.crt
产生结果:
PLAY [all] *******************************************************************************************************
TASK [debug] *****************************************************************************************************
ok: [localhost] => (item={'name': 'test', 'path': '/etc/apt', 'cert': 'key.crt'}) => {
"msg": " name: test\n path: /etc/apt\n cert: key.crt\n"
}
PLAY RECAP *******************************************************************************************************
localhost : ok=1 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
现在您只需在模板和循环中重复使用它,您就会得到您期望的结果。