Ansible:无法访问字典值 - 得到错误:'dict object'没有属性

时间:2014-10-29 19:49:22

标签: dictionary ansible

---
- 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 }}"

我错过了什么?

4 个答案:

答案 0 :(得分:14)

这不是完全相同的代码。如果你仔细看一下这个例子,你会在users下看到你有几个词。

在您的情况下,您有两个词,但只有一个键(alicetelephone),其值分别为" Alice",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。)

答案 1 :(得分:0)

小修正:

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

答案 2 :(得分:0)

您要打印{{ item.value.name }},但未定义名称。

users:
  alice: "Alice"
  telephone: 123

应替换为

users:
  name: "Alice"
  telephone: 123

然后在字典(用户)中定义nametelephone属性。

答案 3 :(得分:0)

我发现使用 dict 仅在提供内联 dict 时才有效。从 vars 中获取时不会。

- name: ssh config
  lineinfile:
    dest: /etc/ssh/sshd_config
    regexp: '^#?\s*{{item.key}}\s'
    line: '{{item.key}} {{item.value}}'
    state: present
  with_dict: 
    LoginGraceTime: "1m"
    PermitRootLogin: "yes"
    PubkeyAuthentication: "yes"
    PasswordAuthentication: "no"
    PermitEmptyPasswords: "no"
    IgnoreRhosts: "yes"
    Protocol: 2

如果你想从变量中获取它,变量也可以在全局或其他地方定义,你可以使用查找。

- name: ssh config
  lineinfile:
    dest: /etc/ssh/sshd_config
    regexp: '^#?\s*{{item.key}}\s'
    line: '{{item.key}} {{item.value}}'
    state: present
  loop: "{{ lookup('dict', sshd_config) }}"
  vars:
    sshd_config:
      LoginGraceTime: "1m"
      PermitRootLogin: "yes"
      PubkeyAuthentication: "yes"
      PasswordAuthentication: "no"
      PermitEmptyPasswords: "no"
      IgnoreRhosts: "yes"
      Protocol: 2