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


Tal vez pueda interesarte


Compartí este artículo