我怎样才能有一个带有 fileglob 模式的嵌套循环?

mip*_*adi 15 ansible

我正在尝试为 Ansible 中的一组用户创建一组授权的 SSH 密钥。我有一个users像这样设置的变量:

users:
  - { username: root, name: 'root' }
  - { username: user, name: 'User' }
Run Code Online (Sandbox Code Playgroud)

在同一个角色中,我在一个files/public_keys目录中还有一组授权密钥文件,每个授权密钥一个文件:

roles/common/files/public_keys/home
roles/common/files/public_keys/work
Run Code Online (Sandbox Code Playgroud)

我想将每个公钥复制给每个用户。

我尝试使用以下任务:

- name: copy authorized keys
  authorized_key: user={{ item.0.username }} key={{ item.1 }}
  with_nested:
    - users
    - lookup('fileglob', 'public_keys/*')
Run Code Online (Sandbox Code Playgroud)

但是,item.1包含文字字符串"lookup('fileglob', 'public_keys/*')",而不是files/public_keys.

有没有办法获得files/public_keys目录列表并将每个公钥复制给每个用户?

con*_*sch 9

诀窍是通过split函数将 fileglob 返回值转换为列表,以便您可以迭代这些值:

- name: copy authorized keys
  authorized_key: 
    user: "{{ item.0.username }}"
    key: "{{ lookup('file', item.1) }}"
  with_nested:
    - "{{ users }}"
    - "{{ lookup('fileglob', 'public_keys/*').split(',') }}"
Run Code Online (Sandbox Code Playgroud)

请注意,在 Ansible v2 中不推荐使用没有{{}}, for 的裸变量with_items

  • 这应该被接受的答案 (2认同)

Tom*_*nor 0

您可能必须大幅重写命令,但可以循环遍历文件团

从例子来看:

- copy: src={{ item }} dest=/etc/fooapp/ owner=root mode=600
  with_fileglob:
    - /playbooks/files/fooapp/*
Run Code Online (Sandbox Code Playgroud)

其他有前途的选项是循环子元素,这实际上是通过 SSH 密钥来说明的

  • 我知道你可以使用 `with_fileglob` 循环文件 glob;我只是不确定如何将其与嵌套循环结合使用。循环子元素_可以_工作,但我希望我不必手动指定我想要复制的整个键列表,因为我_应该_能够将其作为列表获取(使用“with_fileglob”)。 (3认同)