Cómo utilizar el módulo de registro de Ansible

En Ansible, puede ejecutar cualquier comando de shell en sus hosts de Ansible, los hosts que configurará con Ansible. Estos comandos de shell pueden tener salidas. De forma predeterminada, la salida se ignora. Si desea almacenar la salida en una variable y usarla más tarde, puede usar el módulo de registro de Ansible . Este artículo le mostrará cómo usar el módulo de registro de Ansible para almacenar la salida del comando en una variable y acceder a ella más adelante en su libro de jugadas de Ansible.

Prerrequisitos

Si desea probar los ejemplos de este artículo, debe:

1) Tenga Ansible instalado en su computadora.

2) Tener un host Ubuntu configurado para la automatización de Ansible.

Hay muchos artículos sobre dedicados a instalar Ansible y configurar hosts para la automatización de Ansible. Puede consultar estos artículos si es necesario.

Configurar un directorio de proyectos

Antes de continuar, configure un nuevo directorio de proyectos de Ansible, solo para mantener las cosas un poco organizadas.

Para crear el directorio del proyecto register-demo / y todos los subdirectorios necesarios (en su directorio de trabajo actual), ejecute el siguiente comando:

$ mkdir -pv register-demo/playbooks

Una vez que se crea el directorio del proyecto, navegue hasta el directorio del proyecto, de la siguiente manera:

$ cd register-demo/

Cree un archivo de inventario de hosts , de la siguiente manera:

$ nano hosts

Agregue la IP del host o el nombre DNS de su host Ubuntu en el archivo de inventario (un host por línea), como se muestra en la captura de pantalla a continuación.

Aquí, he agregado mi host Ubuntu 20.04 LTS vm3.nodekite.com en el grupo ubuntu20 .

Una vez que haya terminado, guarde el archivo presionando &ltCtrl&gt + X , seguido de Y e &ltEnter&gt .

Cree un archivo de configuración Ansible ansible.cfg en el directorio de su proyecto, de la siguiente manera:

$ nano ansible.cfg

A continuación, escriba las siguientes líneas en el archivo ansible.cfg :

[defaults]
inventory          = hosts
host_key_checking  = False

Una vez que haya terminado, guarde el archivo ansible.cfg presionando &ltCtrl&gt + X , seguido de Y e &ltEnter&gt .

Ahora, intente hacer ping a su host de Ubuntu, de la siguiente manera:

$ ansible ubuntu20 -u ansible -m ping

Como puede ver, mi host Ubuntu 20.04 vm3.nodekite.com es accesible.

Ejemplo 1: Conceptos básicos

En este ejemplo, le mostraré algunos de los conceptos básicos del módulo de registro de Ansible . Usaré Ansible para generar una contraseña aleatoria en mi host Ubuntu 20.04 usando el comando pwgen , almacenaré la contraseña en una variable usando el módulo de registro e imprimiré la contraseña en la pantalla.

Primero, cree el nuevo playbook generate_pass.yaml en el directorio playbooks / , de la siguiente manera:

$ nano playbooks/generate_pass.yaml

Escriba las siguientes líneas en el archivo generate_pass.yaml :

– hosts: ubuntu20
  user
: ansible
  become
: True
  tasks
:
    – name
: Ensure pwgen is installed
      apt
:
         name
: pwgen
         state
: present
         update_cache
: True
    – name
: Generate password
      shell
: pwgen -N 1 -s 30
      register
: mypass
    – name
: Print the generated password
      debug
:
      msg
: “The password is {{ mypass }}”

Una vez que haya terminado, presione &ltCtrl&gt + X , seguido de Y e &ltEnter&gt , para guardar el archivo generate_pass.yaml .

La siguiente línea le dice a Ansible que ejecute el libro de jugadas generate_pass.yaml en cada host del grupo ubuntu20 . En mi caso, el libro de jugadas se ejecutará en el host vm3.nodekite.com .

En este manual de estrategias, definiré tres tareas.

La primera tarea asegurará que el paquete pwgen esté instalado.

La segunda tarea generará una contraseña aleatoria de 30 caracteres mediante el comando pwgen . Usaré el módulo de registro para almacenar la contraseña generada en la variable mypass .

La tercera tarea imprimirá la variable mypass utilizando el módulo de depuración de Ansible .

Ejecute el libro de jugadas generate_pass.yaml con el siguiente comando:

$ ansible-playbook playbooks/generate_pass.yaml

Como puede ver, el libro de jugadas se ejecutó correctamente. También se ha generado una contraseña.

Pero, ¿por qué la variable mypass imprimió tantos elementos?

Bueno, la variable mypass es un objeto que contiene algunas propiedades importantes.

Las propiedades más importantes de cada una de las variables de registro son las siguientes:

cmd : el comando que se ejecutó para generar la salida.

stdout : la salida del comando.

stderr : la salida de error del comando.

inicio : la fecha y hora en que el comando comenzó a ejecutarse.

end : la fecha y hora en que el comando terminó de ejecutarse.

delta : el tiempo necesario para ejecutar el comando. Ésta es la diferencia entre las propiedades finales y iniciales .

stdout_lines : una matriz que contiene cada línea de salida del comando. Igual que stdout , pero stdout separa las líneas usando caracteres de nueva línea ( n) en lugar de matrices.

stderr_lines : una matriz que contiene cada línea de salida de error del comando. Igual que stderr , pero stderr separa las líneas usando caracteres de nueva línea ( n) en lugar de matrices.

Si solo desea imprimir / acceder a la cadena de contraseña (lo cual es muy probable), puede imprimir / acceder a la propiedad stdout de la variable mypass en su libro de jugadas, como se indica en la captura de pantalla a continuación.

$ nano playbooks/generate_pass.yaml

Una vez que haya terminado, ejecute el libro de jugadas generate_pass.yaml nuevamente. Solo se imprimirá la cadena de contraseña, como puede ver en la captura de pantalla a continuación.

Eso cubre los conceptos básicos del módulo de registro de Ansible .

Ejemplo 2: contenido del directorio de tiendas

En este ejemplo, le mostraré cómo almacenar el contenido de un directorio en una variable usando el módulo de registro de Ansible , así como también cómo iterar sobre ellos.

Primero, cree el nuevo libro de jugadas get_dir_contents.yaml en el directorio playbooks / .

$ nano playbooks/get_dir_contents.yaml

A continuación, escriba las siguientes líneas en el libro de jugadas get_dir_contents.yaml :

– hosts: ubuntu20
  user
: ansible
  become
: True
  tasks
:
    – name
: List all files and directories in /home/ansible
      shell
: ls /home/ansible
      register
: dir_contents
    – name
: Print directory contents using loops
      debug
:
        msg
: “{{ item }}”
      loop
: “{{ dir_contents.stdout_lines }}”

Una vez que haya terminado, presione &ltCtrl&gt + X , seguido de Y e &ltEnter&gt , para guardar el archivo generate_pass.yaml .

En este libro de jugadas, definiré dos tareas.

La primera tarea enumera todos los contenidos del directorio / home / ansible y los almacena en la variable dir_contents .

La segunda tarea imprime la variable dir_contents .

Ejecute el libro de jugadas get_dir_contents.yaml , de la siguiente manera.

$ ansible-playbook playbooks/get_dir_contents.yaml

Como puede ver, la propiedad stdout_lines almacenaba el contenido del directorio como una matriz. La propiedad stdout también se almacena en el contenido del directorio. Estas propiedades están separadas por caracteres de nueva línea ( n). En este ejemplo, es fácil trabajar con la propiedad stdout_lines .

A continuación, repita el contenido del directorio mediante un bucle.

Para hacer esto, abra el libro de jugadas get_dir_contents.yaml y cambie la segunda tarea, como se indica en la captura de pantalla a continuación.

$ nano playbooks/get_dir_contents.yaml

Aquí, estoy iterando sobre la matriz dir_contents.stdout_lines usando un bucle e imprimiendo los elementos de la matriz usando el módulo de depuración de Ansible . En esta tarea, la variable de elemento es una variable de bucle que se utiliza para iterar sobre los elementos de la matriz.

Ejecute el libro de jugadas get_dir_contents.yaml , de la siguiente manera:

$ ansible-playbook playbooks/get_dir_contents.yaml

Como puede ver, el contenido del directorio / home / ansible se imprime en la pantalla.

Ejemplo 3: copia de seguridad del directorio

En este ejemplo, le mostraré cómo hacer una copia de seguridad de un directorio utilizando los módulos de registro , archivo y copia de Ansible .

Primero, cree el nuevo libro de jugadas backup_home_dir.yaml en el directorio playbooks / , de la siguiente manera:

$ nano playbooks/backup_home_dir.yaml

A continuación, escriba las siguientes líneas en el archivo backup_home_dir.yaml .

– hosts: ubuntu20
  user
: ansible
  become
: True
  tasks
:
    – name
: Get home directory /home/ansible contents
      shell
: ls /home/ansible
      register
: dir_contents
    – name
: Create a new directory /tmp/ansible
      file
:
        path
: /tmp/ansible
        state
: directory
    – name
: Backup home directory /home/ansible to /tmp/ansible
      copy
:
        src
: /home/ansible/{{ item }}
        dest
: /tmp/ansible/
        remote_src
: True
      loop
: “{{ dir_contents.stdout_lines }}

Una vez que haya terminado, presione &ltCtrl&gt + X , seguido de Y e &ltEnter&gt , para guardar el archivo backup_home_dir.yaml .

En este manual de estrategias, definiré tres tareas.

La primera tarea almacena el contenido del directorio / home / ansible (el directorio del que haré una copia de seguridad) en la variable dir_contents usando el módulo de registro de Ansible .

La segunda tarea crea un nuevo directorio / tmp / ansible usando el módulo de archivo Ansible . Este es el directorio donde se almacenará la copia de seguridad.

La tercera tarea recorre la matriz dir_contents.stdout_lines y usa el módulo de copia de Ansible para copiar cada directorio al directorio / tmp / ansible / .

Ejecute el libro de jugadas backup_home_dir.yaml , de la siguiente manera:

$ ansible-playbook playbooks/backup_home_dir.yaml

Como puede ver, en mi host Ubuntu 20.04 LTS, la copia de seguridad se realizó correctamente.

Ejemplo 4: ejecutar u omitir tareas

En este ejemplo, le mostraré cómo ejecutar u omitir tareas, según la variable que haya registrado, utilizando el módulo de registro .

Primero, cree el nuevo playbook register_conditions.yaml en el directorio playbooks / de la siguiente manera:

$ nano playbooks/register_conditions.yaml

A continuación, escriba las siguientes líneas en el archivo register_conditions.yaml .

– hosts: ubuntu20
  user
: ansible
  become
: True
  tasks
:
    – name
: List directory contents
      shell
: ls /home/ansible/test3
      register
: dir_contents
    – name
: Check if directory is empty
      debug
:
        msg
: “Directory is empty.”
     when
: dir_contents.stdout==

Una vez que haya terminado, presione &ltCtrl&gt + X , seguido de Y e &ltEnter&gt , para guardar el archivo register_conditions.yaml .

En este libro de jugadas, he definido dos tareas.

La primera tarea almacena el contenido del directorio / home / ansible / test3 en la variable dir_contents .

La segunda tarea verifica si dir_contents.stdout es una cadena vacía o si el directorio / home / ansible / test3 está vacío. Si el directorio está vacío, se imprimirá el mensaje Directorio vacío .

Ejecute el libro de jugadas register_conditions.yaml , de la siguiente manera:

$ ansible-playbook playbooks/register_conditions.yaml

Como puede ver, el libro de jugadas se ejecutó correctamente.

Dado que el directorio / home / ansible / test3 está vacío, el libro de jugadas imprimió el mensaje Directorio está vacío .

A continuación, cree un nuevo archivo en el directorio / home / ansible / test3 .

$ touch test3/myfile

Dado que el directorio / home / ansible / test3 ya no está vacío, se omite la tarea Comprobar si el directorio está vacío , como puede ver en la captura de pantalla a continuación.

$ ansible-playbook playbooks/register_conditions.yaml

Conclusión

El módulo de registro de Ansible es muy útil para la automatización de servidores. Este artículo le mostró los conceptos básicos del módulo de registro , incluidos ejemplos del uso del módulo de registro de Ansible para el almacenamiento y la copia de seguridad de directorios, y para ejecutar tareas de directorio.

Leave a Comment

Your email address will not be published. Required fields are marked *

Hazlo Linux