Ansible: ¿Cómo iterar sobre los resultados de fileglobs que se llaman para cada elemento de una lista?

Ansible: ¿Cómo iterar sobre los resultados de fileglobs que se llaman para cada elemento de una lista?

Quiero hacer algo muy similar a lo mencionado en¿Cómo puedo tener un bucle anidado con un patrón fileglob?excepto que la lista de archivos es un patrón global que se refiere a los elementos del bucle externo.

Mi código (fallido) hasta ahora:

    - name: Deploy authorized_keys files for users
      authorized_key:
        user: "{{ item }}"
        key: "{{ query('fileglob', 'ssh-pub-keys/{{ item }}/*.pub') }}"
      with_list:
        - user1
        - user2

El directorio ssh-pub-keystiene el siguiente aspecto:

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

El mensaje de error se ve así:

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', …]"}

Parece que no puedo usarlo with_nestedporque no puedo referirme de una lista a otra.

También probé filtros Ansible/Jinja2 como loop: {{ ['user1','user2'] | product(query(('fileglob', 'ssh-pub-keys/{{ ??? }}/*.pub'')) | list }}, pero no descubrí cómo hacer referencia a los elementos de la primera lista dentro product(…)...

Otro intento fue usar dos tareas y la segunda se refería a la salida registrada de la primera, pero no descubrí cómo convertir la salida del shell en una estructura de datos adecuada (salida dividida por espacio, pero manteniendo la información de qué elemento de entrada se usó) de nuevo:

    - name: Enumerate all authorized_keys files for all users
      shell: "echo ssh-pub-keys/{{ item }}/*.pub"
      with_list:
        - user1
        - user2
      register: keyfiles

¿Alguien sabe cómo se implementan correctamente este tipo de tareas?

PD: uso de Ansible 2.7.7 disponible en Debian 10 Buster (versión estable actual de Debian).

Respuesta1

Es posible concatenar las claves. Citando declave_autorizada:

Se pueden especificar varias claves en un único valor de cadena de clave separándolas mediante nuevas líneas.

Por ejemplo

- 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

información relacionada