在 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

你的任务实际上有三个问题:

  1. 使用循环时,可能是 loopwith_* 的所有风格,您访问当前使用变量 item 循环的元素,所以不是您在任务中使用的函数 (item())

  2. 你正在做一个多余的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 }}"
    
  3. 然后使用语法

    在 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   

现在您只需在模板和循环中重复使用它,您就会得到您期望的结果。