Anteriormente expliqué cómo obtener información desde múltiples servidores en paralelo utilizando comandos personalizados con Ansible. Ahora voy a demostrar cómo extraer información directamente desde variables de Ansible, particularmente cómo obtener el detalle de todos los sistemas de archivos y puntos de montaje de todos los servidores en paralelo, utilizando un simple playbook.
La variable de ansible_mounts
es una de las tantas descubiertas de cada host (facts). Esta incluye información de todos los sistemas de archivos montados. Mediante el siguiente playbook (al que he llamado info_discos.yml
), se cicla por cada sistema de archivos montado para obtener el dispositivo, punto de montaje, tipo de sistema de archivos, tamaño total y tamaño disponible:
# Playbook para extraer infon de discos y sistemas de archivos --- #- hosts: test.linuxito.com - hosts: all become: yes tasks: - name: Extraer info de sistemas de archivos set_fact: fs_item: "{{ item.device }};{{ item.mount }};{{ item.fstype }};{{ item.size_total }};{{ item.size_available }}" with_items: - "{{ ansible_mounts }}" no_log: True register: fs_result - name: Crear una lista de sistemas de archivos por host set_fact: fs: "{{ fs_result.results | map(attribute='ansible_facts.fs_item') | list }}" no_log: True - name: Mostrar los resultados debug: msg="{{ fs }}"
Para ciclar por todos los sistemas de archivos listados en la variable ansible_mounts
se utiliza un bucle simple (with_items
):
- name: Extraer info de sistemas de archivos set_fact: fs_item: "{{ item.device }};{{ item.mount }};{{ item.fstype }};{{ item.size_total }};{{ item.size_available }}" with_items: - "{{ ansible_mounts }}" no_log: True register: fs_result
Por cada item
de la variable ansible_mounts
se define el fact fs_item
. Luego se registran todos los ítems en la variable fs_result
. Tal vez parezca redundante, pero esto permite registrar sólo la información que deseamos obtener (en lugar de toda la información contenida en la variable ansible_mounts
) en un formato personalizado.
Al finalizar de recolectar información de todos los filesystems montados, se convierte la salida contenida en la varaible fs_result
en una lista:
- name: Crear una lista de sistemas de archivos por host set_fact: fs: "{{ fs_result.results | map(attribute='ansible_facts.fs_item') | list }}" no_log: True
Ambas tareas utilizan la configuración no_log
para no mostrar salida innecesaria por pantalla. Finalmente, se muestra el resultado obtenido por pantalla:
- name: Mostrar los resultados debug: msg="{{ fs }}"
Ejemplo de prueba corriendo sobre un único host:<7p>
admin@bastion:~/ansible_playbooks$ ansible-playbook info_discos.yml PLAY [test.linuxito.com] ******************************************************* TASK [Gathering Facts] ********************************************************* ok: [test.linuxito.com] TASK [Extraer info de sistemas de archivos] ************************************ ok: [test.linuxito.com] => (item=(censored due to no_log)) ok: [test.linuxito.com] => (item=(censored due to no_log)) ok: [test.linuxito.com] => (item=(censored due to no_log)) ok: [test.linuxito.com] => (item=(censored due to no_log)) ok: [test.linuxito.com] => (item=(censored due to no_log)) ok: [test.linuxito.com] => (item=(censored due to no_log)) TASK [Crear una lista de sistemas de archivos por host] ************************ ok: [test.linuxito.com] TASK [Mostrar resultados] ****************************************************** ok: [test.linuxito.com] => { "msg": [ "/dev/mapper/debian-root;/;ext4;9775022080;8182673408", "/dev/sda1;/boot;ext2;240661504;199895040", "/dev/mapper/debiang-tmp;/tmp;ext2;495560704;493039616", "/dev/mapper/debian-var;/var;ext4;5266722816;3789488128", "/dev/mapper/apps-usrlocal;/usr/local;ext4;52773224448;48064819200", "/dev/mapper/apps-db;/data;xfs;53676605440;44672933888" ] } PLAY RECAP ********************************************************************* test.linuxito.com : ok=4 changed=0 unreachable=0 failed=0
El formato para cada item depende de nuestras necesidades. En mi caso necesitaba obtenerlo en un formato apto para pasar a una planilla de cálculo (CSV).
Referencias
- Standard Loops - Ansible Documentation
- set_fact – Set host facts from a task - Ansible Documentation
- debug – Print statements during execution - Ansible Documentation
- Variables - Ansible Documentation