我对vars的循环有个问题,
- hosts: all
become: yes
vars:
user:
- name: "neito"
pubkey: "{{ lookup('file', '~/.ssh/vsphere_vm.pub') }}"
privkey: "{{ lookup('file', '~/.ssh/vsphere_vm') }}"
tasks:
- name: "Add SSH public key"
authorized_key:
user: "{{ item.name }}"
key: "{{ item.pubkey }}"
loop:
- "{{ user }}"当运行这个剧本时,我有以下错误:The error was: 'list object' has no attribute 'name'
{{ item.name }}似乎没有为Ansible定义,我想我在这里遗漏了一些明显的东西,但我找不到什么。(我在关注this get started post
编辑1:
通过声明vars,如下所示,它是有效的:
vars:
user:
{
name: "neito",
pubkey: "{{ lookup('file', '~/.ssh/vsphere_vm.pub') }}",
privkey: "{{ lookup('file', '~/.ssh/vsphere_vm') }}",
}还有没有人能告诉我为什么第一个语法不起作用?
发布于 2020-11-14 21:08:00
您可以在变量文件中定义该列表,或者在您的游戏的“vars”部分中定义该列表,然后在任务中引用该列表的名称:
循环:"{{ somelist }}“
如果您将原始任务修改为:
tasks:
- name: "Add SSH public key"
authorized_key:
user: "{{ item.name }}"
key: "{{ item.pubkey }}"
loop: "{{ user }}"你应该可以走了。
发布于 2020-11-14 21:12:32
问题出在"{{ user }}"前面的-破折号
loop:
- "{{ user }}"需要满足以下条件:
loop: "{{ user }}"发布于 2020-11-14 21:12:20
最初,您将user定义为包含1个元素的列表。开头的小破折号(-)表示列表的一个元素。
user:
- name: "neito"
pubkey: "{{ lookup('file', '~/.ssh/vsphere_vm.pub') }}"
privkey: "{{ lookup('file', '~/.ssh/vsphere_vm') }}"
# in YAML, the below is equivalent to the above
user:
[
{
name: "neito",
pubkey: "{{ lookup('file', '~/.ssh/vsphere_vm.pub') }}",
privkey: "{{ lookup('file', '~/.ssh/vsphere_vm') }}"
}
]方括号是破折号的替代语法。同样,大括号也是在新行上指定每个属性的一种替代方法,增加了缩进量。所以你可以用下面的方式重写你的第二个例子:
user:
name: "neito"
pubkey: "{{ lookup('file', '~/.ssh/vsphere_vm.pub') }}"
privkey: "{{ lookup('file', '~/.ssh/vsphere_vm') }}" """)由于方括号和大括号在YAML中也是有效的,您实际上可以将JSON文件解析为YAML,它将100%工作(但不是反过来)。
https://stackoverflow.com/questions/64834097
复制相似问题