---
- 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 }}"
我错过了什么?
答案 0 :(得分:14)
这不是完全相同的代码。如果你仔细看一下这个例子,你会在users
下看到你有几个词。
在您的情况下,您有两个词,但只有一个键(alice
或telephone
),其值分别为" 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
然后在字典(用户)中定义name
和telephone
属性。
答案 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