使用 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'