Итерация с Ansible with_dict над списком словарей - PullRequest
0 голосов
/ 07 июня 2018

Я застрял в переборе списка словаря.Пример vars.yml и минимальный playbook ниже.

---
- 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 голосов
/ 07 июня 2018

users - это не словарь, это переменная списка словарей.

Если вы хотите проанализировать эту переменную в цикле, вы можете использовать:

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

hopeэто помогает

ОБНОВЛЕНИЕ

Теперь я заметил, что при включении файла var вы также передаете инструкцию name: users.это приводит к тому, что все переменные файла помещаются в переменную users.Таким образом, чтобы обратиться к списку users, который определен в файле переменных, вам нужно использовать users.users.

, обновив with_items до:

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