Ansible 初学者 - 列表对象没有属性“名称”

Nei*_*oFR 2 ansible

我在 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 }}"
Run Code Online (Sandbox Code Playgroud)

运行此剧本时出现以下错误: The error was: 'list object' has no attribute 'name'

Ansible似乎{{ item.name }}没有定义,我想我在这里遗漏了一些明显的东西,但我找不到什么。(我正在关注这个入门帖子

编辑1:

通过像下面这样声明变量,它可以工作:

vars:
    user:
      {
        name: "neito",
        pubkey: "{{ lookup('file', '~/.ssh/vsphere_vm.pub') }}",
        privkey: "{{ lookup('file', '~/.ssh/vsphere_vm') }}",
      }
Run Code Online (Sandbox Code Playgroud)

有人还能指出为什么第一个语法不起作用吗?

Nei*_*oFR 6

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

loop:
  - "{{ user }}"
Run Code Online (Sandbox Code Playgroud)

需要是 :

loop: "{{ user }}"
Run Code Online (Sandbox Code Playgroud)

  • 这个答案指出了真正的问题。这将是公认的答案。 (2认同)

ili*_*-sp 5

请检查循环文档

\n
\n

您可以在变量文件中或在 play 的 \xe2\x80\x98vars\xe2\x80\x99 部分中定义列表,然后在任务中引用列表的名称:

\n
loop: "{{ somelist }}"\n
Run Code Online (Sandbox Code Playgroud)\n
\n

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

\n
tasks:\n  - name: "Add SSH public key"\n    authorized_key:\n      user: "{{ item.name }}"\n      key: "{{ item.pubkey }}"\n    loop: "{{ user }}"\n
Run Code Online (Sandbox Code Playgroud)\n

你应该可以走了。

\n

  • `with_items: "{{whatever }}"` 等价于 `loop: "{{whatever | flatten(levels=1) }}"`。这就是为什么如果你传递一个列表列表它就会起作用。Loop 本身不会接受这一点。请参阅 https://docs.ansible.com/ansible/latest/user_guide/playbooks_loops.html#with-items (4认同)