
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-keys
tiene 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_nested
porque 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