Я хочу сделать что-то очень похожее, как упомянуто в Как создать вложенный цикл с шаблоном файлового глобуса? за исключением того, что список файлов является шаблоном глобуса, который относится к элементам из внешнего цикла.
Мой (неудачный) код на данный момент:
- name: Deploy authorized_keys files for users
authorized_key:
user: "{{ item }}"
key: "{{ query('fileglob', 'ssh-pub-keys/{{ item }}/*.pub') }}"
with_list:
- user1
- user2
Каталог ssh-pub-keys
выглядит следующим образом:
ssh-pub-keys
├── user1
│ ├── hostA_id_ecdsa.pub
│ ├── hostA_id_ed25519.pub
│ ├── hostB_id_ecdsa.pub
│ ├── hostB_id_ed25519.pub
│ └── hostB_id_rsa.pub
└── user2
├── hostC_id_ecdsa.pub
├── hostC_id_rsa.pub
├── hostD_id_ecdsa.pub
└── hostD_id_ed25519.pub
Сообщение об ошибке выглядит так:
failed: [somehost] (item=user1) => {"changed": false, "item": "user1", "msg": "invalid key specified: ['…/ssh-pub-keys/user1/hostA_id_ecdsa.pub', '…/ssh-pub-keys/user1/hostA_id_ed25519.pub', …]"}
failed: [somehost] (item=user2) => {"changed": false, "item": "user2", "msg": "invalid key specified: ['…/ssh-pub-keys/user2/hostC_id_ecdsa.pub', '…/ssh-pub-keys/user2/hostC_id_rsa.pub', …]"}
Кажется, я не могу использовать with_nested
поскольку я не могу сослаться из одного списка в другой.
Также пробовал фильтры Ansible / Jinja2, например loop: {{ ['user1','user2'] | product(query(('fileglob', 'ssh-pub-keys/{{ ??? }}/*.pub'')) | list }}
, но не понял, как ссылаться на элементы из первого списка внутри product(…)
…
Еще одна попытка заключалась в использовании двух задач, причем вторая относилась к зарегистрированному выходу первой, но я не понял, как преобразовать вывод оболочки в правильную структуру данных (вывод разделен по пробелам, но с сохранением информации о том, какой элемент ввода был использован) очередной раз:
- name: Enumerate all authorized_keys files for all users
shell: "echo ssh-pub-keys/{{ item }}/*.pub"
with_list:
- user1
- user2
register: keyfiles
Кто-нибудь знает, как правильно реализуются подобные задачи?
P.S .: Использование Ansible 2.7.7, доступного в Debian 10 Buster (текущий стабильный выпуск Debian).
Можно объединить ключи. Цитата из авторизованный_key:
В одном значении строки ключа можно указать несколько ключей, разделив их символами новой строки.
Например
- name: Deploy authorized_keys files for users
authorized_key:
user: "{{ item }}"
key: |
{% for fn in lookup('fileglob', 'ssh-pub-keys/' ~ item ~ '/*.pub', wantlist=True) %}
{{ lookup('file', fn) }}
{% endfor %}
loop:
- user1
- user2