如何才能拥有一个具有 fileglob 模式的嵌套循环?

如何才能拥有一个具有 fileglob 模式的嵌套循环?

我正在尝试在 Ansible 中为一组用户创建一组授权的 SSH 密钥。我users设置了一个变量,如下所示:

users:
  - { username: root, name: 'root' }
  - { username: user, name: 'User' }

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

roles/common/files/public_keys/home
roles/common/files/public_keys/work

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

我曾尝试使用以下任务:

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

但是,item.1包含文字字符串"lookup('fileglob', 'public_keys/*')",而不是下的每个文件路径files/public_keys

有什么方法可以让我获取目录列表files/public_keys并将每个公钥复制给每个用户?

答案1

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

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

请注意,在 Ansible v2 中已弃用使用不带{{and}}的裸变量。with_items

答案2

您可能需要大量重写命令,但可以循环遍历文件

从示例中:

- copy: src={{ item }} dest=/etc/fooapp/ owner=root mode=600
  with_fileglob:
    - /playbooks/files/fooapp/*

其他有希望的选择是循环遍历子元素这实际上是通过 SSH 密钥来说明的

答案3

对我来说这只在这种形式下有效

    - name: Set up authorized keys for root
      authorized_key:
        user: root
        state: present
        key: "{{ lookup('file', item) }}"
      with_fileglob: 'public_keys/*.pub'

相关内容