A menudo, Ansible las obras contienen varios conjuntos de variables. Las tareas a realizar utilizando estas variables varían según la naturaleza de estas variables. Y aquí es donde Declaraciones condicionales Entra. Las declaraciones condicionales se utilizan principalmente en los libros de jugadas de Ansible, donde hay una combinación de diferentes variables, cada una de las cuales representa diferentes entidades, como paquetes de software, servidores, dispositivos de red, etc. En esta guía, demostraremos cómo usar varios cuando declaraciones condicionales en una configuración con servidores que ejecutan diferentes sistemas operativos.
Usando la declaración condicional ‘cuando’
El lenguaje de programación tradicional generalmente usa la declaración if-else cuando se espera más de un resultado. En Ansible, la declaración ‘cuando’ se usa en su lugar para determinar el resultado de una variable. Entonces, en lugar de usar la declaración if-else, define lo que quiere que suceda. La sintaxis es como se muestra a continuación:
Tareas . . .
cuando: condición
Tomemos un ejemplo de una configuración con un nodo de control Ansible y dos servidores como se muestra a continuación:
- IP del servidor CentOS 7: 173.82.115.165
- IP del servidor Ubuntu 18.04: 173.82.202.239
- IP del nodo de control de Ansible: 173.82.120.14
Usando el nodo de Ansible Control que ya se ha configurado y configurado para comunicarse con los dos servidores.
La tarea en cuestión será instalar el servidor web Apache en ambos servidores web utilizando un solo libro de jugadas.
Pero aquí está la trampa,
La instalación de Apache en CentOS, que es una variante de Red Hat, difiere de Ubuntu, que es una variante de Debian. Ambos usan diferentes administradores de paquetes y el paquete de Apache también difiere en ambos casos. En tal escenario, donde tenemos diferentes variables en juego, una declaración condicional es crucial.
Dadas las diferencias mencionadas, vamos a utilizar el ‘Cuándo‘ declaración condicional para instalar el servidor web Apache como se muestra en el libro de jugadas como se muestra:
--- - name: install Apache Web-Server hosts: all tasks: - name: Install Apache on CentOS Server yum: name=httpd state=present become: yes when: ansible_os_family == "RedHat" - name: Install Apache on Ubuntu Server apt:name=apache2 state=present become: yes when: ansible_os_family == "Debian"
Cuando ejecute el libro de jugadas, obtendrá el siguiente resultado
Desglosemos esto:
La primera tarea o juego ejecuta la instalación del paquete httpd, coloquialmente conocido como el servidor web Apache, en el host CentOS remoto utilizando el administrador de paquetes yum, que es el administrador de paquetes para Distribuciones RHEL. Debido a que hemos definido todos los sistemas host en nuestro inventario, la instalación del paquete httpd junto con otras dependencias solo se realizará para los servidores que pertenecen a la familia Red Hat. Esto ha sido definido por la variable incorporada ansible_os_familia. En efecto, se salta la instalación en el servidor de Ubuntu, lo cual se evidencia con la línea “salto a la comba [173.82.202.239]”
Debido a que el servidor Ubuntu se ha omitido en la primera jugada, es necesario definir otra jugada. El segundo juego ejecuta la instalación del paquete Apache2 utilizando el administrador de paquetes apt, que es el administrador de paquetes nativo para la familia del sistema operativo Debian. Esto implica que el paquete apache2 se instalará en todos los sistemas que pertenecen a la familia Debian, de la que Ubuntu forma parte.
En última instancia, el servidor web Apache se instalará en servidores basados en Red Hat y Debian.
Usando ‘cuando’ con el operador lógico AND
Puede refinar aún más su libro de jugadas y reducirlo a los detalles. Suponga que solo desea que Ansible instale el servidor web apache en servidores Ubuntu cuya versión es 18.04, ¿cómo lo haría?
En este caso, definirá otra variable que restringirá la instalación de Apache a servidores Ubuntu en la versión 18.04. Así es como se vería jugar.
--- - name: install Apache webserver hosts: all tasks: - name: Install Apache on Ubuntu Server apt: name=apache2 state=present become: yes when: ansible_os_family == "Debian" and ansible_distribution_version == "18.04"
Como ha visto, hemos utilizado el operador lógico AND seguido de otra variable integrada de Ansible conocida como ansible_distribution_version a la que se le ha asignado el valor “18.04”
Para que esta jugada sea ejecutada, ambas condiciones tienen que ser CIERTO, es decir, el sistema host debe pertenecer a la categoría de sistema operativo Debian y la versión debe ser 18.04. Como sabemos, solo Ubuntu se ajusta a la descripción, es decir, Ubuntu 18.04. Si alguna de las condiciones no se cumple, la reproducción falla y la instalación de Apache fallará.
Usando ‘cuando’ con el operador lógico OR
Con el operador lógico OR, la jugada se ejecuta cuando se cumplen una o todas las condiciones.
Consideremos otro libro de jugadas:
--- - name: Check disk space usage hosts: all tasks: - name: Check disk space usage on servers shell: df -Th register: result - debug: var: result.stdout_lines when: ansible_os_family == "Debian" or ansible_os_family == "RedHat"
El libro de jugadas anterior muestra las métricas de uso del disco en los servidores de la configuración que se encuentran en las distribuciones Debian o Red Hat o en ambas. Dado que ambos servidores en nuestra configuración pertenecen a las familias de sistemas operativos mencionadas anteriormente, el libro de jugadas mostrará el uso del disco para ambos servidores.
Las declaraciones condicionales son esenciales en una configuración de múltiples sistemas operativos donde existen variaciones en la administración de paquetes y la configuración del servidor. Esperamos que ahora pueda usar cómodamente la declaración condicional when para realizar varias tareas de acuerdo con la distribución de su servidor.
Leer también : Cómo descargar y usar los roles de Ansible Galaxy en Ansible Playbook
Leer también : Cómo usar variables en Ansible Playbook