Como posso ter um loop aninhado com um padrão de filtro de arquivos?

13

Estou tentando criar um conjunto de chaves SSH autorizadas para um conjunto de usuários no Ansible. Eu tenho uma usersvariável configurada assim:

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

Na mesma função, também tenho um conjunto de arquivos de chave autorizados em um files/public_keysdiretório, um arquivo por chave autorizada:

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

Eu quero copiar cada chave pública para cada usuário.

Eu tentei usar a seguinte tarefa:

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

No entanto, item.1contém a cadeia literal "lookup('fileglob', 'public_keys/*')", não cada caminho de arquivo abaixo files/public_keys.

Existe uma maneira de obter uma lista do files/public_keysdiretório e copiar cada chave pública para cada usuário?

mipadi
fonte

Respostas:

8

O truque é transformar o valor de retorno do arquivo de filas em uma lista por meio da splitfunção, para que você possa iterar sobre os valores:

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

Observe que o uso de variáveis ​​simples, sem {{e }}, para with_itemsfoi preterido no Ansible v2.

conorsch
fonte
Resposta deve ser aceita #
Beyers
0

Pode ser necessário reescrever seu comando de forma significativa, mas há provisões para fazer um loop sobre os filtros de arquivos

do exemplo:

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

Outras opções promissoras são Looping over Subelements, que é realmente ilustrado pelas teclas SSH

Tom O'Connor
fonte
3
Eu sei que você pode fazer um loop sobre globs de arquivos usando with_fileglob; Só não sei como usá-lo em conjunto com um loop aninhado. Fazer um loop sobre subelementos pode funcionar, mas espero não precisar especificar manualmente toda a lista de chaves que quero copiar, já que eu deveria conseguir isso como uma lista (usando with_fileglob).
Mipadi
Também não tenho certeza. A próxima melhor sugestão é pop em #ansibleon irc.freenode.nete ver se os gurus não tem nenhum idéias brilhantes.
Tom O'Connor