首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Ansible beginner List对象没有属性'name‘

Ansible beginner List对象没有属性'name‘
EN

Stack Overflow用户
提问于 2020-11-14 20:52:37
回答 3查看 975关注 0票数 2

我对vars的循环有个问题,

代码语言:javascript
复制
- 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,如下所示,它是有效的:

代码语言:javascript
复制
vars:
    user:
      {
        name: "neito",
        pubkey: "{{ lookup('file', '~/.ssh/vsphere_vm.pub') }}",
        privkey: "{{ lookup('file', '~/.ssh/vsphere_vm') }}",
      }

还有没有人能告诉我为什么第一个语法不起作用?

EN

回答 3

Stack Overflow用户

发布于 2020-11-14 21:08:00

请检查loops documentation

您可以在变量文件中定义该列表,或者在您的游戏的“vars”部分中定义该列表,然后在任务中引用该列表的名称:

循环:"{{ somelist }}“

如果您将原始任务修改为:

代码语言:javascript
复制
tasks:
  - name: "Add SSH public key"
    authorized_key:
      user: "{{ item.name }}"
      key: "{{ item.pubkey }}"
    loop: "{{ user }}"

你应该可以走了。

票数 4
EN

Stack Overflow用户

发布于 2020-11-14 21:12:32

问题出在"{{ user }}"前面的-破折号

代码语言:javascript
复制
loop:
  - "{{ user }}"

需要满足以下条件:

代码语言:javascript
复制
loop: "{{ user }}"
票数 2
EN

Stack Overflow用户

发布于 2020-11-14 21:12:20

最初,您将user定义为包含1个元素的列表。开头的小破折号(-)表示列表的一个元素。

代码语言:javascript
复制
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') }}"
    }
  ]

方括号是破折号的替代语法。同样,大括号也是在新行上指定每个属性的一种替代方法,增加了缩进量。所以你可以用下面的方式重写你的第二个例子:

代码语言:javascript
复制
user:
  name: "neito"
  pubkey: "{{ lookup('file', '~/.ssh/vsphere_vm.pub') }}"
  privkey: "{{ lookup('file', '~/.ssh/vsphere_vm') }}" """)

由于方括号和大括号在YAML中也是有效的,您实际上可以将JSON文件解析为YAML,它将100%工作(但不是反过来)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64834097

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档