Подтвердить что ты не робот

Ansible: не может получить значение словаря - получена ошибка: "dict object" не имеет атрибута

---
- hosts: test
  tasks:
    - name: print phone details
      debug: msg="user {{ item.key }} is {{ item.value.name }} ({{ item.value.telephone }})"
      with_dict: users
  vars:
    users:
      alice: "Alice"
      telephone: 123

Когда я запускаю эту пьесу, я получаю эту ошибку:

One or more undefined variables: 'dict object' has no attribute 'name' 

Это действительно работает просто отлично:

debug: msg="user {{ item.key }} is {{ item.value }}"

Что мне не хватает?

4b9b3361

Ответ 1

Это не тот же самый код. Если вы посмотрите внимательно на пример, вы увидите, что в разделе users у вас есть несколько dicts.

В вашем случае у вас есть два dicts, но только с одним ключом (alice или telephone) с соответствующими значениями "Алиса", 123.

Вы бы предпочли:

- hosts: localhost
  gather_facts: no
  tasks:
    - name: print phone details
      debug: msg="user {{ item.key }} is {{ item.value.name }} ({{ item.value.telephone }})"
      with_dict: users
  vars:
    users:
      alice:
        name: "Alice"
        telephone: 123

(обратите внимание, что я сменил хост на localhost, поэтому я могу легко запустить его и добавил gather_facts: no, так как здесь это не нужно. YMMV.)

Ответ 2

небольшая коррекция:

- name: print phone details
  debug: msg="user {{ item.key }} is {{ item.value.name }} ({{ item.value.telephone }})"
  with_dict: "{{ users }}" <<<<<<<<<<<<<<<<

Ответ 3

Вы хотите напечатать {{ item.value.name }}, но имя не определено.

users:
  alice: "Alice"
  telephone: 123

следует заменить на

users:
  name: "Alice"
  telephone: 123

Затем оба атрибута name и telephone определяются внутри dict (users).