En Ansible, las variables y los hechos, junto con las plantillas, son herramientas fundamentales para crear flujos de trabajo de automatización flexibles. Las variables le permiten administrar y cambiar sus configuraciones dinámicamente. Los hechos son un subconjunto especial de variables que Ansible recopila de los sistemas remotos y proporciona información específica del contexto.
Las plantillas permiten la generación de archivos de configuración controlados por variables, lo que hace que sus manuales se adapten a diversos entornos y escenarios.
Estas herramientas hacen que los manuales sean reutilizables y adaptables, lo que le permite evitar valores codificados y permitir la personalización para diferentes entornos.
Las variables permiten modificar los parámetros sin alterar la lógica central del libro de jugadas.
Booleano: valores verdaderos o falsos.
Lista: una colección ordenada de elementos.
Diccionario: pares clave-valor para estructuras de datos complejas.
Variables registradas: captura el resultado de las tareas para utilizarlas más adelante en su libro de jugadas.
Hechos: variables recopiladas automáticamente que brindan detalles sobre los sistemas remotos que administra.
NB: Evite conflictos en los nombres de las variables utilizando notación entre corchetes.
- name: Print the distribution of the target hosts: all vars: curr_time: "{{ now() }}" tasks: - name: Distro Check ansible.builtin.debug: msg: "The target system is {{ ansible_facts['distribution'] }}. Timestamp: {{ curr_time }}"
Las plantillas en Ansible usan el lenguaje de plantillas Jinja2 para crear archivos dinámicamente usando interpolación de variables, bucles y condicionales.
- name: Write distro name hosts: all tasks: - name: Write distro name ansible.builtin.template: src: distro.j2 dest: /root/distro.txt mode: '644' # src: location of jinja2 template file # dest: location it will be copied to # permissions that will be granted to the file
Usaremos la familia de sistemas operativos para determinar si instalar NGINX de Lighttpd y luego implementaremos una página de inicio personalizada en el host remoto que contiene NGINX, todo sin codificar nombres de host.
git clone https://github.com/perplexedyawdie/ansible-learn.git
2. Cambie el directorio a hechos y plantillas
cd ansible-learn/facts-and-templates
3. Mejora el entorno usando Docker-Compose
docker compose up -d --build
4. SSH en el servidor Ansible
ssh -o StrictHostKeyChecking=no -o NoHostAuthenticationForLocalhost=yes root@localhost -p 2200 # password: test123
5. Cree un libro de estrategias llamado server_setup.yaml
. Aquí, configuraremos NGINX y Lighttpd y luego generaremos el nombre de la distribución para cada host remoto.
- name: Install NGINX on Debian & Lighttpd on RedHat hosts: all vars: dev1: "Debian" dev2: "RedHat" tasks: - name: Install NGINX for Debian-based systems ansible.builtin.apt: name: nginx state: present when: ansible_facts['os_family'] == dev1 - name: Install Lighttpd for RedHat-based systems ansible.builtin.yum: name: lighttpd state: present when: ansible_facts['os_family'] == dev2 - name: Display the distribution ansible.builtin.debug: msg: "The server is running {{ ansible_facts['distribution'] }}"
6. Ejecute ansible-lint.
ansible-lint server_setup.yaml
7. Ejecute el libro de jugadas.
ansible-playbook --key-file /root/.ssh/id_rsa_ansible -u root -i inventory.yaml server_setup.yaml
8. Confirme que la configuración fue exitosa.
ssh -i /root/.ssh/id_rsa_ansible root@server3 nginx -V ssh -i /root/.ssh/id_rsa_ansible root@server2 lighttpd -v ssh -i /root/.ssh/id_rsa_ansible root@server1 lighttpd -v
9. Cree un archivo de plantilla Jinja2 llamado index.html.j2
Se completará automáticamente con la familia y distribución del sistema operativo.
<html> <head> <title>Welcome to {{ ansible_facts['os_family'] }}</title> </head> <body> <h1>Server running on {{ ansible_facts['distribution'] }}</h1> </body> </html>
10. Cree un libro de estrategias llamado custom_homepage.yaml.
Estamos implementando la página de inicio personalizada creada anteriormente en NGINX y luego reiniciamos el servidor.
- name: Deploy Custom Homepage and restart hosts: all vars: dev1: "Debian" dev2: "RedHat" tasks: - name: Create Homepage with Jinja2 Template for NGINX ansible.builtin.template: src: index.html.j2 dest: /var/www/html/index.html mode: '644' when: ansible_facts['os_family'] == dev1 notify: restart nginx handlers: - name: Restart NGINX listen: "restart nginx" ansible.builtin.service: name: nginx state: restarted when: ansible_facts['os_family'] == dev1
11. Ejecute el linter.
ansible-lint custom_homepage.yaml
12. Ejecute el libro de jugadas.
ansible-playbook --key-file /root/.ssh/id_rsa_ansible -u root -i inventory.yaml custom_homepage.yaml
13. Confirme la implementación visitando http://localhost:2203
en su navegador.
¡Esfuerzo impresionante! 🙌 Aprendimos cómo usar variables y hechos en un libro de estrategias además de cómo crear archivos dinámicos usando plantillas. A continuación, veremos la modularización y el manejo de errores. ¡Hasta entonces, cuídate!