Назад | Перейти на главную страницу

Ansible: как перебирать результаты файловых глобусов, которые вызываются для каждого элемента списка?

Я хочу сделать что-то очень похожее, как упомянуто в Как создать вложенный цикл с шаблоном файлового глобуса? за исключением того, что список файлов является шаблоном глобуса, который относится к элементам из внешнего цикла.

Мой (неудачный) код на данный момент:

    - 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