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

11

Estou tentando criar um conjunto de chaves SSH autorizadas para um conjunto de usuários no Ansible. Eu tenho uma variável users configurada da seguinte forma:

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

Na mesma função, também tenho um conjunto de arquivos de chaves autorizados em um diretório files/public_keys , 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.1 contém a string literal "lookup('fileglob', 'public_keys/*')" , não cada caminho de arquivo em files/public_keys .

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

    
por mipadi 06.12.2014 / 22:32

2 respostas

6

O truque é transformar o valor de retorno do conjunto de lóbulos em uma lista por meio da função split , 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 nuas, sem {{ e }} , para with_items foi preterido no Ansible v2.

    
por 06.04.2016 / 02:17
0

Você pode ter que reescrever seu comando de maneira significativa, mas existe uma provisão para passar por cima de fileglobos

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 na verdade é ilustrado por chaves SSH

    
por 07.12.2014 / 09:24

Tags