Introducción
Una vez que el inventario y el acceso funcionan correctamente, una tarea común es la implementación de archivos base (baseline files). Estos archivos pueden incluir banners, fragmentos de servicios o marcadores de cumplimiento que deben ser consistentes en todos los hosts, pero que a su vez deben contener valores específicos para cada uno.
En este laboratorio, creará un pequeño inventario multi-host, definirá variables de grupo, escribirá una plantilla, ejecutará un playbook y verificará los archivos base generados para cada host.
Crear el proyecto de implementación base
En este paso, creará un proyecto que contenga el inventario, las plantillas, los archivos y los playbooks. Esta estructura permite separar el contenido fuente reutilizable de la lógica del playbook.
Cree el proyecto y acceda a él.
cd /home/labex/project
mkdir -p rhce-ansible/{inventory/group_vars,playbooks,files,templates,managed}
cd rhce-ansible
Cree el archivo ansible.cfg.
cat > ansible.cfg <<'EOF'
[defaults]
inventory = ./inventory/hosts
retry_files_enabled = False
interpreter_python = auto_silent
EOF
Los directorios separan los roles en el flujo de trabajo: files contiene el contenido que se copia sin cambios, templates contiene el contenido renderizado con variables, playbooks alberga la lógica de automatización y managed mostrará el resultado final para cada host.
Crear el inventario y las variables base
En este paso, definirá dos alias de hosts gestionados y variables base compartidas. Estas variables se utilizarán más adelante en una plantilla.
Antes de ejecutar los comandos en este paso, regrese al directorio del proyecto de Ansible. Esto garantiza la estabilidad de los comandos incluso cuando LabEx ejecuta cada paso por separado.
cd /home/labex/project/rhce-ansible
Cree el inventario.
cat > inventory/hosts <<'EOF'
[managed]
node1 ansible_connection=local
node2 ansible_connection=local
EOF
Los dos alias permiten que un solo playbook genere dos salidas gestionadas independientes. Aunque ambos alias se ejecutan en la misma máquina virtual, Ansible renderiza inventory_hostname de forma distinta para cada host.
Cree variables de grupo para los hosts gestionados.
cat > inventory/group_vars/managed.yml <<'EOF'
baseline_owner: labex
baseline_environment: training
EOF
Estas variables se aplican a todos los hosts del grupo managed. Representan valores que deben compartirse en toda la configuración base, mientras que el nombre del host seguirá siendo específico para cada uno.
Crear el archivo fuente y la plantilla
En este paso, creará el contenido fuente. El archivo plano se copiará sin cambios. La plantilla Jinja2 utilizará variables como inventory_hostname y baseline_environment para generar una salida específica para cada host.
Antes de ejecutar los comandos en este paso, regrese al directorio del proyecto de Ansible.
cd /home/labex/project/rhce-ansible
Cree un archivo de banner compartido.
cat > files/banner.txt <<'EOF'
Managed by RHCE Ansible Prep
EOF
El banner es contenido fuente plano. Se copiará exactamente como está escrito, por lo que es útil para texto que no debe variar según el host.
Cree una plantilla.
cat > templates/baseline.conf.j2 <<'EOF'
host={{ inventory_hostname }}
environment={{ baseline_environment }}
owner={{ baseline_owner }}
EOF
La plantilla contiene expresiones Jinja2. Cuando Ansible la renderiza, inventory_hostname se convierte en node1 o node2, mientras que las variables base provienen de inventory/group_vars/managed.yml.
Escribir el playbook de implementación base
En este paso, escribirá un playbook que crea un directorio por cada alias de host e implementa tanto el banner compartido como la plantilla renderizada. Debido a que el playbook se almacena en playbooks, las rutas de origen utilizan ../files y ../templates.
Antes de ejecutar los comandos en este paso, regrese al directorio del proyecto de Ansible.
cd /home/labex/project/rhce-ansible
Cree el playbook.
cat > playbooks/deploy-baseline.yml <<'EOF'
---
- name: Deploy baseline files to managed aliases
hosts: managed
gather_facts: false
tasks:
- name: Create per-host baseline directory
ansible.builtin.file:
path: "/home/labex/project/rhce-ansible/managed/{{ inventory_hostname }}"
state: directory
mode: '0755'
- name: Copy shared banner
ansible.builtin.copy:
src: ../files/banner.txt
dest: "/home/labex/project/rhce-ansible/managed/{{ inventory_hostname }}/banner.txt"
mode: '0644'
- name: Render baseline configuration
ansible.builtin.template:
src: ../templates/baseline.conf.j2
dest: "/home/labex/project/rhce-ansible/managed/{{ inventory_hostname }}/baseline.conf"
mode: '0644'
EOF
Considere las tres tareas como una secuencia de implementación completa. Primero se crea el directorio de destino para cada alias de host, luego se copia el banner estático y, finalmente, se renderiza la plantilla en un archivo de configuración específico para el host.
Ejecute una comprobación de sintaxis.
ansible-playbook playbooks/deploy-baseline.yml --syntax-check
La comprobación de sintaxis debería imprimir una línea playbook:. Esto confirma que Ansible puede analizar las rutas de origen relativas antes de que el playbook escriba cualquier archivo gestionado.
Ejecutar y verificar la implementación base
En este paso, ejecutará el playbook e inspeccionará los archivos renderizados. La configuración renderizada debe diferir según el nombre del host, manteniendo los mismos valores compartidos de entorno y propietario.
Antes de ejecutar los comandos en este paso, regrese al directorio del proyecto de Ansible.
cd /home/labex/project/rhce-ansible
Ejecute el playbook.
ansible-playbook playbooks/deploy-baseline.yml
La primera ejecución debería informar cambios, ya que los directorios y archivos gestionados aún no existen. Un resumen exitoso con failed=0 significa que cada alias de host recibió la configuración base.
Inspeccione los archivos implementados.
find managed -maxdepth 3 -type f -print
cat managed/node1/banner.txt managed/node1/baseline.conf managed/node2/banner.txt managed/node2/baseline.conf
Los archivos banner.txt deben ser idénticos entre sí. Los archivos baseline.conf deben compartir los mismos valores de environment y owner, pero diferir en la línea host=.
Resumen
Ha implementado archivos base en alias de hosts gestionados utilizando variables de inventario, un archivo fuente compartido y una plantilla Jinja2. Esto completa la base para realizar cambios de estado repetibles en nodos gestionados.


