Как я могу иметь вложенный цикл с шаблоном fileglob?

13

Я пытаюсь создать набор авторизованных ключей SSH для группы пользователей в Ansible. У меня есть 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каталогов и скопировать каждый открытый ключ каждому пользователю?

mipadi
источник

Ответы:

8

Хитрость заключается в том, чтобы преобразовать возвращаемое значение 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(',') }}"

Обратите внимание, что использование пустых переменных без {{и }}для with_itemsне рекомендуется в Ansible v2.

conorsch
источник
Это должен быть принят ответ
Бейерс
0

Возможно, вам придется значительно переписать вашу команду, но есть возможность зацикливаться на файловых глобах

из примера:

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

Другими многообещающими вариантами являются Looping over Subelements, который на самом деле иллюстрируется SSH-ключами.

Том О'Коннор
источник
3
Я знаю, что вы можете перебирать файловые глобусы, используя with_fileglob; Я просто не уверен, как использовать это в сочетании с вложенным циклом. Циклы по подэлементам могут работать, но я надеюсь, что мне не нужно вручную указывать весь список ключей, которые я хочу скопировать, так как я должен просто иметь возможность получить его в виде списка (используя with_fileglob).
Mipadi
Я тоже не уверен. Следующее лучшее предложение поп в #ansibleна irc.freenode.netи посмотреть , если гуру там есть какие - либо яркие идеи.
Том О'Коннор