Gestión Avanzada de Archivos con Ansible
En este paso final, exploraremos algunas técnicas avanzadas de gestión de archivos con Ansible, incluyendo permisos de archivos, creación condicional de archivos y el uso de múltiples módulos relacionados con archivos.
Establecimiento de Permisos y Propiedad de Archivos
Al crear archivos, a menudo necesita establecer permisos y propiedad específicos. Creemos un playbook que demuestre esto:
- Cree un nuevo archivo en el WebIDE:
- Navegue al directorio
~/project/ansible-files
- Haga clic con el botón derecho y seleccione "Nuevo archivo"
- Nombre el archivo
file_permissions.yml
- Agregue el siguiente contenido:
---
- name: Manage file permissions and ownership
hosts: local
tasks:
- name: Create a script file with execute permissions
copy:
dest: ~/project/script.sh
content: |
#!/bin/bash
echo "This script was created by Ansible"
echo "Current user: $(whoami)"
echo "Current directory: $(pwd)"
mode: "0755"
- name: Create a read-only configuration file
copy:
dest: ~/project/readonly.conf
content: |
## This is a read-only configuration file
setting1 = value1
setting2 = value2
mode: "0444"
En este playbook:
- El parámetro
mode se utiliza para establecer los permisos del archivo.
0755 significa lectura, escritura y ejecución para el propietario, y lectura y ejecución para el grupo y otros.
0444 significa solo lectura para todos.
- Ejecute el playbook:
cd ~/project/ansible-files
ansible-playbook file_permissions.yml
Debería ver una salida similar a:
PLAY [Manage file permissions and ownership] **********************************
TASK [Gathering Facts] *********************************************************
ok: [localhost]
TASK [Create a script file with execute permissions] **************************
changed: [localhost]
TASK [Create a read-only configuration file] **********************************
changed: [localhost]
PLAY RECAP *********************************************************************
localhost : ok=3 changed=2 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
- Comprobemos los permisos de los archivos creados:
ls -l ~/project/script.sh ~/project/readonly.conf
Debería ver una salida similar a:
-rwxr-xr-x 1 labex labex 118 Aug 15 12:34 /home/labex/project/script.sh
-r--r--r-- 1 labex labex 73 Aug 15 12:34 /home/labex/project/readonly.conf
- Verifiquemos que el script se puede ejecutar:
~/project/script.sh
Debería ver una salida similar a:
This script was created by Ansible
Current user: labex
Current directory: /home/labex/project/ansible-files
Creación Condicional de Archivos
A veces, necesita crear archivos solo cuando se cumplen ciertas condiciones. Creemos un playbook que demuestre la creación condicional de archivos:
- Cree un nuevo archivo en el WebIDE:
- Navegue al directorio
~/project/ansible-files
- Haga clic con el botón derecho y seleccione "Nuevo archivo"
- Nombre el archivo
conditional_file.yml
- Agregue el siguiente contenido:
---
- name: Conditional file creation
hosts: local
vars:
environment: "development"
create_debug_file: true
create_backup: false
tasks:
- name: Create environment-specific configuration
copy:
dest: "~/project/{{ environment }}_config.yml"
content: |
## Configuration for {{ environment }} environment
debug: {{ 'enabled' if environment == 'development' else 'disabled' }}
log_level: {{ 'DEBUG' if environment == 'development' else 'INFO' }}
- name: Create debug log file
copy:
dest: ~/project/debug.log
content: |
## Debug log file
## Created: {{ ansible_date_time.iso8601 }}
mode: "0644"
when: create_debug_file
- name: Create backup directory
file:
path: ~/project/backup
state: directory
mode: "0755"
when: create_backup
En este playbook:
- La directiva
when se utiliza para la ejecución condicional de tareas.
- Los condicionales Jinja2 se utilizan en el contenido del archivo para cambiar los valores según las variables.
- El módulo
file se utiliza para crear un directorio.
- Ejecute el playbook:
cd ~/project/ansible-files
ansible-playbook conditional_file.yml
Debería ver una salida similar a:
PLAY [Conditional file creation] **********************************************
TASK [Gathering Facts] *********************************************************
ok: [localhost]
TASK [Create environment-specific configuration] ******************************
changed: [localhost]
TASK [Create debug log file] **************************************************
changed: [localhost]
TASK [Create backup directory] ************************************************
skipped: [localhost]
PLAY RECAP *********************************************************************
localhost : ok=3 changed=2 unreachable=0 failed=0 skipped=1 rescued=0 ignored=0
Observe que la tarea "Create backup directory" se omitió porque create_backup se configuró en false.
- Examinemos los archivos creados:
cat ~/project/development_config.yml
cat ~/project/debug.log
ls -la ~/project/ | grep backup
Debería ver el contenido de los dos archivos que se crearon y confirmar que no se creó ningún directorio de respaldo.
Uso de Múltiples Módulos Relacionados con Archivos
Ansible proporciona varios módulos para la gestión de archivos. Creemos un playbook que demuestre el uso de múltiples módulos relacionados con archivos:
- Cree un nuevo archivo en el WebIDE:
- Navegue al directorio
~/project/ansible-files
- Haga clic con el botón derecho y seleccione "Nuevo archivo"
- Nombre el archivo
file_modules.yml
- Agregue el siguiente contenido:
---
- name: Demonstrate file-related modules
hosts: local
tasks:
- name: Create a directory
file:
path: ~/project/ansible_demo
state: directory
mode: "0755"
- name: Create a file using the copy module
copy:
dest: ~/project/ansible_demo/copied.txt
content: "This file was created using the copy module.\n"
- name: Create a symbolic link
file:
src: ~/project/ansible_demo/copied.txt
dest: ~/project/ansible_demo/link_to_copied.txt
state: link
- name: Create a file with blockinfile module
blockinfile:
path: ~/project/ansible_demo/block.txt
create: true
block: |
This is a block of text
that will be inserted
as a single unit.
marker: "## {mark} ANSIBLE MANAGED BLOCK"
En este playbook:
- El módulo
file se utiliza con state: directory para crear un directorio.
- El módulo
file se utiliza con state: link para crear un enlace simbólico.
- El módulo
blockinfile se utiliza para crear un archivo con un bloque de texto rodeado de comentarios de marcador.
- Ejecute el playbook:
cd ~/project/ansible-files
ansible-playbook file_modules.yml
Debería ver una salida similar a:
PLAY [Demonstrate file-related modules] ***************************************
TASK [Gathering Facts] *********************************************************
ok: [localhost]
TASK [Create a directory] *****************************************************
changed: [localhost]
TASK [Create a file using the copy module] ************************************
changed: [localhost]
TASK [Create a symbolic link] *************************************************
changed: [localhost]
TASK [Create a file with blockinfile module] **********************************
changed: [localhost]
PLAY RECAP *********************************************************************
localhost : ok=5 changed=4 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
- Verifiquemos los resultados:
ls -la ~/project/ansible_demo/
cat ~/project/ansible_demo/copied.txt
cat ~/project/ansible_demo/link_to_copied.txt
cat ~/project/ansible_demo/block.txt
Debería ver:
- Un directorio llamado
ansible_demo
- Un archivo llamado
copied.txt con el contenido especificado
- Un enlace simbólico llamado
link_to_copied.txt que apunta a copied.txt
- Un archivo llamado
block.txt con un bloque de texto rodeado de comentarios de marcador
La salida del último comando debería ser similar a:
## BEGIN ANSIBLE MANAGED BLOCK
This is a block of text
that will be inserted
as a single unit.
## END ANSIBLE MANAGED BLOCK
Esto demuestra la versatilidad de las capacidades de gestión de archivos de Ansible.