使用 jinja 附加到 Ansible 中的事实
Using jinja to append to a fact in Ansble
我正在尝试追加到列表中:
- name: Set found
set_fact:
found: |
{% set j2found = [ 'hi' ] %}
{%- for user in "1", "2" -%}
{% set j2found = j2found + [ user ] %}
{%- endfor %}
{{ j2found }}
- name: Show found
debug:
msg: "WHAT I FOUND: {{ item }}"
loop: "{{ found }}"
found
仅包含 'hi'。为什么不附加该变量?我正在做一些明显错误的事情,但我找不到它。
谢谢。
编辑:下面的答案显示了添加到我的列表中的更可取和更简单的方法,并且 larsks 对变量的范围是正确的。所以没有办法用 set
语句来做到这一点。但是可以这样附加到 jinja2 中的列表:
set junk = j2found.append(user)
junk
,当然,没有什么有用的,被忽略了。
查看 assignments 上的 Jinja 文档。引用:
Please keep in mind that it is not possible to set variables inside a block and have them show up outside of it. This also applies to loops.
for
循环中的 {% set j2found = j2found + [ user ] %}
的范围是循环体; j2found
的任何更改在循环外是不可见的。
您通常执行此类操作的方式是通过 Ansible 循环:
- hosts: localhost
gather_facts: false
tasks:
- name: Set found
set_fact:
found: "{{ found + [item] }}"
loop:
- 1
- 2
vars:
found: ["hi"]
- name: Show found
debug:
msg: "WHAT I FOUND: {{ item }}"
loop: "{{ found }}"
将输出:
PLAY [localhost] ***************************************************************
TASK [Set found] ***************************************************************
ok: [localhost] => (item=1)
ok: [localhost] => (item=2)
TASK [Show found] **************************************************************
ok: [localhost] => (item=hi) => {
"msg": "WHAT I FOUND: hi"
}
ok: [localhost] => (item=1) => {
"msg": "WHAT I FOUND: 1"
}
ok: [localhost] => (item=2) => {
"msg": "WHAT I FOUND: 2"
}
PLAY RECAP *********************************************************************
localhost : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
只需添加列表即可。例如
- name: Set found
set_fact:
found: "{{ j2found + users }}"
vars:
j2found: ['hi']
users: [1, 2]
- name: Show found
debug:
msg: "WHAT I FOUND: {{ item }}"
loop: "{{ found }}"
给予
msg: 'WHAT I FOUND: hi'
msg: 'WHAT I FOUND: 1'
msg: 'WHAT I FOUND: 2'
我正在尝试追加到列表中:
- name: Set found
set_fact:
found: |
{% set j2found = [ 'hi' ] %}
{%- for user in "1", "2" -%}
{% set j2found = j2found + [ user ] %}
{%- endfor %}
{{ j2found }}
- name: Show found
debug:
msg: "WHAT I FOUND: {{ item }}"
loop: "{{ found }}"
found
仅包含 'hi'。为什么不附加该变量?我正在做一些明显错误的事情,但我找不到它。
谢谢。
编辑:下面的答案显示了添加到我的列表中的更可取和更简单的方法,并且 larsks 对变量的范围是正确的。所以没有办法用 set
语句来做到这一点。但是可以这样附加到 jinja2 中的列表:
set junk = j2found.append(user)
junk
,当然,没有什么有用的,被忽略了。
查看 assignments 上的 Jinja 文档。引用:
Please keep in mind that it is not possible to set variables inside a block and have them show up outside of it. This also applies to loops.
for
循环中的 {% set j2found = j2found + [ user ] %}
的范围是循环体; j2found
的任何更改在循环外是不可见的。
您通常执行此类操作的方式是通过 Ansible 循环:
- hosts: localhost
gather_facts: false
tasks:
- name: Set found
set_fact:
found: "{{ found + [item] }}"
loop:
- 1
- 2
vars:
found: ["hi"]
- name: Show found
debug:
msg: "WHAT I FOUND: {{ item }}"
loop: "{{ found }}"
将输出:
PLAY [localhost] ***************************************************************
TASK [Set found] ***************************************************************
ok: [localhost] => (item=1)
ok: [localhost] => (item=2)
TASK [Show found] **************************************************************
ok: [localhost] => (item=hi) => {
"msg": "WHAT I FOUND: hi"
}
ok: [localhost] => (item=1) => {
"msg": "WHAT I FOUND: 1"
}
ok: [localhost] => (item=2) => {
"msg": "WHAT I FOUND: 2"
}
PLAY RECAP *********************************************************************
localhost : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
只需添加列表即可。例如
- name: Set found
set_fact:
found: "{{ j2found + users }}"
vars:
j2found: ['hi']
users: [1, 2]
- name: Show found
debug:
msg: "WHAT I FOUND: {{ item }}"
loop: "{{ found }}"
给予
msg: 'WHAT I FOUND: hi'
msg: 'WHAT I FOUND: 1'
msg: 'WHAT I FOUND: 2'