使用Ansible with_dict迭代字典列表

时间:2018-06-07 15:13:52

标签: ansible yaml

我被困在迭代字典列表中。示例vars.yml和最小的剧本如下。

---
- hosts: localhost
  connection: local
  gather_facts: false
  become: false
  vars:
    csvfile: "{{ lookup('file', 'vars/users.csv') }}"
  tasks:
    - name: Convert CSV to YAML
      template:
        src: "./users_csv.j2"
        dest: "vars/users.yml"
      run_once: true

    - name: Include users from users.yml to users variable
      include_vars:
        file: vars/users.yml
        name: users

    - debug:
        msg: "{{ users.value }}"
      with_dict:
        - "{{ users }}"

我的Jinja2模板以YAML格式生成字典列表,如下所示:

--
users:
  - username: Auser1
    group: Admin
  - username: Auser2
    group: Admin
  - username: Auser3
    group: User

无论如何,当我迭代字典时,我无法获得例如用户名或组。

到目前为止,我得到的是一条致命的错误消息:

fatal: [localhost]: FAILED! => {"msg": "with_dict expects a dict"}

我知道如何遍历列表,但我不知道为什么它在这里失败了。

1 个答案:

答案 0 :(得分:2)

users不是字典,而是字典的列表变量。

如果要在循环中解析此变量,可以使用:

- debug:
    msg: "username: {{ item.username }}, group: {{ item.group }}"
  with_items:
    - "{{ users.users }}"

希望有所帮助

<强>更新

我现在注意到,当包含var文件时,您也会传递name: users指令。这会导致文件的所有变量都放在users变量下。因此,要引用变量文件中定义的users列表,您需要使用users.users

with_items更新为:

  with_items:
    - "{{ users.users }}"