Implementar archivos base en nodos gestionados

AnsibleBeginner
Practicar Ahora

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.