Introducción
Una automatización fiable de archivos distingue el origen del controlador, las copias administradas y los artefactos recopilados de vuelta para inspeccionarlos. Los nombres de archivo correctos por sí solos no demuestran la integridad del contenido, los permisos ni la identidad del host.
Desplegarás un mensaje, inspeccionarás sus metadatos SHA-256 reales con stat y register, generarás informes operativos por host y recopilarás esos informes con fetch en rutas separadas del controlador. El entorno SSH preparado de dos hosts y el modelo de privilegios son los mismos que has practicado antes.
Distribuir un archivo con permisos administrados explícitos
En este paso, copiarás un archivo de origen privado del controlador a un directorio administrado protegido y elegirás explícitamente la propiedad y los permisos remotos.
Abre el Terminal y entra en el proyecto:
cd /home/labex/project
Crea el archivo de origen reutilizable del controlador, incluido su salto de línea final:
printf 'Managed service banner\n' > site-banner.txt
chmod cambia los permisos de un archivo local. Los permisos 0600 conceden a su propietario lectura y escritura y ningún acceso a su grupo ni al resto. Mantén privado este origen del controlador mientras eliges deliberadamente otros permisos administrados:
chmod 0600 site-banner.txt
Escribe un playbook de distribución:
cat > deploy-banner.yml <<'EOF'
- name: Distribute the managed banner
hosts: all
gather_facts: false
become: true
tasks:
- name: Prepare the managed site directory
ansible.builtin.file:
path: /srv/ansible-site
state: directory
owner: root
group: automation
mode: "0750"
- name: Copy the controller banner with explicit managed permissions
ansible.builtin.copy:
src: /home/labex/project/site-banner.txt
dest: /srv/ansible-site/banner.txt
owner: root
group: automation
mode: "0640"
EOF
become a nivel de play solicita elevación en los nodos administrados, donde es necesaria para escribir bajo /srv y asignar la propiedad a root. No convierte el proceso de lectura del origen del controlador en un inicio de sesión como root.
El directorio pertenece a root, tiene el grupo automation y permisos 0750. El mensaje pertenece a root, tiene el grupo automation y permisos 0640. Esto permite a la cuenta normal automation atravesar el directorio y leer el mensaje sin concederle acceso de escritura. Los permisos administrados explícitos son independientes de los permisos 0600 del origen del controlador.
Comprueba y aplica el playbook:
ansible-playbook deploy-banner.yml --syntax-check
ansible-playbook deploy-banner.yml
Ambos hosts deberían terminar sin fallos. Prueba el acceso de lectura normal sin become:
ansible all -m ansible.builtin.command -a 'cat /srv/ansible-site/banner.txt'
Cada host debería imprimir Managed service banner. Esto demuestra el acceso remoto de lectura del grupo previsto, manteniendo el origen y las copias administradas como archivos separados.
Registrar y consumir metadatos estructurados de archivos
En este paso, inspeccionarás el mensaje administrado real y escribirás un informe operativo por host a partir de sus metadatos.
El módulo stat devuelve información del archivo en lugar de copiarlo. checksum_algorithm: sha256 selecciona SHA-256 para verificar el contenido. register guarda el resultado de esa tarea para tareas posteriores en el mismo host; su campo stat contiene los metadatos del archivo.
Crea un playbook de inspección:
cat > inspect-and-collect.yml <<'EOF'
- name: Inspect the banner and prepare host reports
hosts: all
gather_facts: true
tasks:
- name: Inspect managed content and permissions
ansible.builtin.stat:
path: /srv/ansible-site/banner.txt
checksum_algorithm: sha256
register: banner_info
- name: Display the structured file metadata
ansible.builtin.debug:
var: banner_info.stat
- name: Write the per-host report from real metadata
become: true
ansible.builtin.copy:
dest: /srv/ansible-site/node-report.txt
content: |
host={{ inventory_hostname }}
distribution={{ ansible_facts.distribution }}
banner_sha256={{ banner_info.stat.checksum }}
owner: root
group: automation
mode: "0640"
EOF
El módulo debug muestra una variable existente con var, por lo que banner_info.stat revela campos como exists, mode, nombres de propietario y grupo, size y checksum. Mostrar metadatos no crea un archivo ni demuestra que una operación posterior haya tenido éxito.
La tarea copy consume banner_info.stat.checksum junto con inventory_hostname y el dato de distribución. Su become a nivel de tarea es necesario para escribir el informe propiedad de root. Las propias tareas de inspección usan el acceso de lectura normal.
Ejecuta la inspección y la generación de informes:
ansible-playbook inspect-and-collect.yml
Los metadatos deberían identificar un archivo normal con permisos 0640, propietario root y grupo automation. Cada informe tiene su propio nombre de host y un valor SHA-256 derivado del mensaje remoto real.
sha256sum calcula el resumen SHA-256 de un archivo local y lo imprime seguido de su nombre. Compara el resumen del origen del controlador con los valores de los metadatos y los informes:
sha256sum site-banner.txt
Lee ambos informes remotos:
ansible all -m ansible.builtin.command -a 'cat /srv/ansible-site/node-report.txt'
Cada resultado debería contener host=web1 o host=web2, distribution=Ubuntu y banner_sha256 seguido del resumen coincidente de 64 caracteres. Mantén las observaciones ligadas a cada host real en lugar de sustituirlas por un mensaje debug constante.
Recopilar informes separados de vuelta al controlador
En este paso, recopilarás ambos informes administrados sin sobrescribir el resultado de un host con el del otro.
copy normalmente envía un origen del controlador a un destino administrado. fetch funciona en la dirección contraria: su src está en el nodo administrado y su dest es un directorio del controlador. Con flat false, fetch incluye el nombre de host del inventario y la ruta remota debajo de dest.
Añade esta tarea al playbook de inspección existente. Mantén su sangría alineada con las otras entradas de tareas; >> añade sin sustituir las tareas anteriores de stat, register e informe:
cat >> inspect-and-collect.yml <<'EOF'
- name: Collect each managed report without flattening host paths
ansible.builtin.fetch:
src: /srv/ansible-site/node-report.txt
dest: /home/labex/project/reports/
flat: false
EOF
Ejecuta el flujo completo de inspección y recopilación:
ansible-playbook inspect-and-collect.yml
La primera ejecución de fetch debería crear las dos copias del controlador. Se ejecuta como la cuenta normal automation en cada destino porque los permisos de grupo del informe ya permiten leerlo.
Inspecciona localmente cada artefacto recopilado:
cat reports/web1/srv/ansible-site/node-report.txt
cat reports/web2/srv/ansible-site/node-report.txt
Las rutas conservan la identidad independiente de los hosts. El campo host de cada informe debería coincidir con su ruta, y ambos campos de checksum deberían coincidir con el origen desplegado. Aplanar ambos resultados en un único nombre de archivo compartido haría perder el artefacto de un host.
Repite el flujo completo:
ansible-playbook inspect-and-collect.yml
Si el origen, los datos recopilados y el estado de los archivos no cambian, ambos hosts deberían informar changed=0 y ningún resultado de fallo o inaccesibilidad. Ahora tienes informes recopilados de forma independiente respaldados por metadatos administrados reales.
Resumen
Has mantenido separados los estados de archivos del controlador y de los nodos administrados, declarado la propiedad y los permisos remotos y consumido metadatos de stat registrados en lugar de limitarte a imprimir un mensaje de éxito. Los informes por host registraron información real de integridad SHA-256, y fetch conservó los artefactos de ambos hosts en rutas separadas del controlador con una ejecución repetida estable.



