Selección de Hosts con Patrones Básicos y Comodines
En este paso, aprenderá los fundamentos para dirigir hosts específicos en su automatización de Ansible. El núcleo de esto es el archivo de inventario de Ansible, que enumera los servidores que administra, y la directiva hosts dentro de un playbook, que especifica contra cuáles de esos servidores se deben ejecutar un conjunto de tareas. Comenzaremos instalando Ansible, creando un inventario y un playbook básicos, y luego exploraremos cómo seleccionar hosts utilizando nombres de grupo y patrones de comodín.
Primero, asegúrese de que Ansible esté instalado en su entorno. Ansible no está instalado por defecto, por lo que necesita instalarlo usando el gestor de paquetes DNF. El paquete ansible-core proporciona las herramientas esenciales de línea de comandos de Ansible, incluido ansible-playbook. Ejecute el siguiente comando:
sudo dnf install -y ansible-core
Debería ver una salida similar a esta:
...
Installed:
ansible-core-2.16.x-x.el9.x86_64
...
Complete!
A continuación, creemos un directorio dedicado para este ejercicio para mantener nuestros archivos organizados. Todas las acciones subsiguientes en este paso se llevarán a cabo dentro de este nuevo directorio:
mkdir -p ~/project/ansible_patterns
cd ~/project/ansible_patterns
Ahora, cree un archivo de inventario. Un inventario es un archivo de texto que define los hosts y grupos de hosts sobre los cuales operan los comandos, módulos y tareas de Ansible. Utilizaremos el formato INI por su simplicidad.
Use el editor nano para crear un archivo llamado inventory:
nano inventory
Agregue el siguiente contenido al archivo inventory. Esto define dos grupos, webservers y dbservers, cada uno con dos hosts:
[webservers]
web1.example.com
web2.example.com
[dbservers]
db1.lab.net
db2.lab.net
Guarde el archivo y salga de nano presionando Ctrl+X, luego Y, y Enter.
Con nuestro inventario listo, creemos un playbook simple. Este playbook utilizará el módulo ansible.builtin.debug para imprimir un mensaje, confirmando en qué host se está ejecutando la tarea. Esta es una excelente manera de probar patrones de hosts sin realizar ningún cambio real en el sistema.
Cree un nuevo archivo llamado playbook.yml:
nano playbook.yml
Agregue el siguiente contenido YAML. Inicialmente, se dirige a todos los hosts del grupo webservers:
---
- name: Test Host Patterns
hosts: webservers
gather_facts: false
tasks:
- name: Display the inventory hostname
ansible.builtin.debug:
msg: "This task is running on {{ inventory_hostname }}"
Guarde y salga del editor. Ahora, ejecute el playbook usando ansible-playbook. La bandera -i especifica nuestro archivo de inventario personalizado:
ansible-playbook playbook.yml -i inventory
La salida debería verse así:
PLAY [Test Host Patterns] ******************************************************
TASK [Display the inventory hostname] ******************************************
ok: [web1.example.com] => {
"msg": "This task is running on web1.example.com"
}
ok: [web2.example.com] => {
"msg": "This task is running on web2.example.com"
}
PLAY RECAP *********************************************************************
web1.example.com : ok=1 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
web2.example.com : ok=1 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
Como puede ver, solo se dirigieron los hosts del grupo webservers. Ahora, modifiquemos el playbook para usar un comodín (*). Los comodines permiten una coincidencia de patrones más flexible.
Edite playbook.yml y cambie la línea hosts a hosts: "*.lab.net". Recuerde encerrar los patrones que contienen comodines entre comillas:
---
- name: Test Host Patterns
hosts: "*.lab.net"
gather_facts: false
tasks:
- name: Display the inventory hostname
ansible.builtin.debug:
msg: "This task is running on {{ inventory_hostname }}"
Ejecute el playbook nuevamente:
ansible-playbook playbook.yml -i inventory
Debería ver una salida similar a esta:
PLAY [Test Host Patterns] ******************************************************
TASK [Display the inventory hostname] ******************************************
ok: [db1.lab.net] => {
"msg": "This task is running on db1.lab.net"
}
ok: [db2.lab.net] => {
"msg": "This task is running on db2.lab.net"
}
PLAY RECAP *********************************************************************
db1.lab.net : ok=1 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
db2.lab.net : ok=1 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
Esta vez, la ejecución se realizó solo en los hosts cuyos nombres terminan en .lab.net. Finalmente, usemos la palabra clave especial all para dirigirnos a todos los hosts definidos en el inventario.
Edite playbook.yml una última vez y cambie la línea hosts a hosts: all:
---
- name: Test Host Patterns
hosts: all
gather_facts: false
tasks:
- name: Display the inventory hostname
ansible.builtin.debug:
msg: "This task is running on {{ inventory_hostname }}"
Ejecute el playbook para ver el resultado:
ansible-playbook playbook.yml -i inventory
La salida mostrará que se están dirigiendo todos los hosts:
PLAY [Test Host Patterns] ******************************************************
TASK [Display the inventory hostname] ******************************************
ok: [web1.example.com] => {
"msg": "This task is running on web1.example.com"
}
ok: [web2.example.com] => {
"msg": "This task is running on web2.example.com"
}
ok: [db1.lab.net] => {
"msg": "This task is running on db1.lab.net"
}
ok: [db2.lab.net] => {
"msg": "This task is running on db2.lab.net"
}
PLAY RECAP *********************************************************************
db1.lab.net : ok=1 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
db2.lab.net : ok=1 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
web1.example.com : ok=1 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
web2.example.com : ok=1 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
El playbook ahora se ejecuta en los cuatro hosts de su inventario, lo que demuestra el poder del patrón all.