Uso de hechos recopilados en tareas condicionales
Uno de los usos más poderosos de los hechos recopilados es la implementación de lógica condicional en sus playbooks. En este paso, crearemos un playbook que utiliza hechos para tomar decisiones sobre qué tareas ejecutar.
Comprensión de las tareas condicionales en Ansible
Ansible le permite usar la palabra clave when para ejecutar tareas condicionalmente basadas en variables, hechos o resultados de tareas. Esto le permite crear playbooks más dinámicos y adaptables.
Creación de un playbook con tareas condicionales
Creemos un playbook que realice diferentes acciones según el sistema operativo:
- En el WebIDE, navegue hasta el directorio
/home/labex/project/ansible
- Cree un nuevo archivo llamado
conditional_facts_playbook.yml
- Agregue el siguiente contenido:
---
- name: Conditional Tasks Based on Facts
hosts: local
gather_facts: true
tasks:
- name: Display OS information
debug:
msg: "Running on {{ ansible_distribution }} {{ ansible_distribution_version }}"
- name: Task for Ubuntu systems
debug:
msg: "This is an Ubuntu system. Would run apt commands here."
when: ansible_distribution == "Ubuntu"
- name: Task for CentOS systems
debug:
msg: "This is a CentOS system. Would run yum commands here."
when: ansible_distribution == "CentOS"
- name: Task for systems with at least 2GB RAM
debug:
msg: "This system has {{ ansible_memtotal_mb }} MB RAM, which is sufficient for our application."
when: ansible_memtotal_mb >= 2048
- name: Task for systems with less than 2GB RAM
debug:
msg: "This system has only {{ ansible_memtotal_mb }} MB RAM, which may not be sufficient."
when: ansible_memtotal_mb < 2048
Este playbook:
- Recopila todos los hechos sobre el sistema
- Muestra la información del sistema operativo
- Ejecuta condicionalmente tareas basadas en el tipo de sistema operativo
- Ejecuta condicionalmente tareas basadas en la cantidad de RAM
Ejecución del playbook condicional
Ejecutemos el playbook para ver las tareas condicionales en acción:
cd ~/project/ansible
ansible-playbook -i hosts conditional_facts_playbook.yml
Dado que estamos ejecutando en Ubuntu, debería ver una salida similar a esta:
PLAY [Conditional Tasks Based on Facts] **************************************
TASK [Gathering Facts] *******************************************************
ok: [localhost]
TASK [Display OS information] ************************************************
ok: [localhost] => {
"msg": "Running on Ubuntu 22.04"
}
TASK [Task for Ubuntu systems] ***********************************************
ok: [localhost] => {
"msg": "This is an Ubuntu system. Would run apt commands here."
}
TASK [Task for CentOS systems] ***********************************************
skipping: [localhost]
TASK [Task for systems with at least 2GB RAM] ********************************
ok: [localhost] => {
"msg": "This system has 3907 MB RAM, which is sufficient for our application."
}
TASK [Task for systems with less than 2GB RAM] *******************************
skipping: [localhost]
PLAY RECAP *******************************************************************
localhost : ok=4 changed=0 unreachable=0 failed=0 skipped=2 rescued=0 ignored=0
Observe cómo algunas tareas se ejecutan mientras que otras se omiten en función de las condiciones. La tarea de CentOS se omite porque estamos ejecutando en Ubuntu, y la tarea "menos de 2GB RAM" se omite porque nuestro sistema tiene más de 2GB de RAM.
Creación de un ejemplo más práctico
Ahora, creemos un ejemplo más práctico que podría usarse en un entorno real:
- En el WebIDE, cree un nuevo archivo llamado
practical_conditional_playbook.yml
- Agregue el siguiente contenido:
---
- name: Practical Conditional Playbook
hosts: local
gather_facts: true
vars:
app_dir: "/home/labex/project/app"
tasks:
- name: Create application directory
file:
path: "{{ app_dir }}"
state: directory
mode: "0755"
- name: Configure for production environment
copy:
dest: "{{ app_dir }}/config.yml"
content: |
environment: production
memory_limit: high
debug: false
when: ansible_memtotal_mb >= 4096
- name: Configure for development environment
copy:
dest: "{{ app_dir }}/config.yml"
content: |
environment: development
memory_limit: low
debug: true
when: ansible_memtotal_mb < 4096
- name: Display configuration
command: cat {{ app_dir }}/config.yml
register: config_content
- name: Show configuration
debug:
msg: "{{ config_content.stdout_lines }}"
Este playbook:
- Crea un directorio para una aplicación
- Escribe un archivo de configuración diferente según la memoria del sistema disponible
- Muestra la configuración resultante
Ejecute el playbook práctico:
ansible-playbook -i hosts practical_conditional_playbook.yml
Este ejemplo demuestra cómo puede usar los hechos recopilados para adaptar automáticamente las configuraciones en función de las características del sistema.