Guía Ansible: Gestionar archivos con Ansible
En esta guía, te mostraré cómo gestionar archivos utilizando módulos Ansible. Aprenderás a copiar, editar, insertar, descargar y reemplazar archivos utilizando Ansible.
¿Qué haremos?
- Copiar archivos utilizando los módulos ‘copy’ y ‘templates
- Descargar archivos con el módulo «fetch
- Editar archivos utilizando los módulos ‘blockinfile’, ‘lineinfile’ y ‘replace
- Gestionar los atributos del archivo
Copiar archivos con los módulos «copiar» y «plantillas» de Ansible
Ansible proporciona algunos módulos para copiar archivos del directorio local a las máquinas de destino remotas, se trata de los módulos ‘copiar’ y ‘plantillas’.
La diferencia entre el módulo «copiar» y el módulo «plantilla» es que el módulo «copiar» copiará el archivo del directorio «archivos» y el módulo «plantilla» copiará la plantilla Jinja2 del directorio «plantillas» de los playbooks de Ansible.
El módulo «copiar» es bueno para copiar archivos persistentes, como certificados, mientras que «plantilla» es más útil para configuraciones reutilizables, como la configuración del host virtual, etc.
1. Copiar archivo de la máquina de destino local a la remota
Copia la configuración ‘sources.list’ del directorio local ‘files’ a la máquina remota ‘/etc/apt/sources.list’. Cuando haya una configuración, se reemplazará y se hará una copia de seguridad basada en las marcas de tiempo.
- name: Copy from Local to Remote Target Machine with 'copy' copy: src: sources.list dest: /etc/apt/sources.list backup: yes
2. Copia el archivo de la máquina remota a otro directorio
Copia la configuración de sudoers ‘/etc/sudoers.d/hakase’ de la máquina remota al otro directorio ‘/home/hakase/hakase-suoers.txt’. Se puede hacer con la opción ‘remote_src’.
- name: Copy file from one directory to other on the Remote Machine copy: src: /etc/sudoers.d/hakase dest: /home/hakase/hakase-sudoers.txt remote_src: yes
3. Copia el archivo y cambia el permiso y el propietario del archivo
Copia el archivo bash en el directorio ‘files’ a la máquina del servidor remoto y haz que el permiso por defecto del archivo sea ‘0755’ y el propietario del archivo sea ‘hakase’.
- name: Copy file and set up the permission and owner of the file copy: src: simple.sh dest: /home/hakase/simple.sh owner: hakase group: hakase mode: 0755
4. Copia el archivo con el módulo Plantilla
Copia la configuración de la plantilla Jinja2 para el host virtual nginx del directorio ‘templates’ al directorio ‘/etc/sites-enabled/’ de la máquina remota. Con la plantilla Jinja2, podemos crear variables para nuestra configuración y hacerla más reutilizable.
- name: Copy file using 'template' module template: src: default.j2 dest: /etc/nginx/sites-enabled/ backup: yes owner: root group: root mode: 0644
Descargar un archivo utilizando el módulo Fetch en Ansible
Para descargar un archivo de la máquina remota a nuestro nodo ansible local, podemos utilizar el módulo ansible llamado ‘fetch’.
1. Descargar de una máquina remota a la local
Descarga el archivo de configuración nginx ‘nginx.conf’ del servidor remoto al directorio local del nodo ansible ‘/home/hakase/backup’ para crear una copia de seguridad. Y el módulo de obtención por defecto incluirá las estructuras de directorios.
- name: Download file from Remote Machine to Local ansible-node directory become: yes fetch: src: /etc/nginx/nginx.conf dest: /home/hakase/backup/
2. Descargar de remoto a local sin estructuras de directorios
Descarga desde la máquina remota al nodo-ansible local sin estructuras de directorios añadiendo la opción ‘plana’.
- name: Download file from Remote Machine to Local ansible node without directory structures become: yes fetch: src: /etc/nginx/nginx.conf dest: /home/hakase/backup/ flat: yes
Editar archivos con Ansible
Ahora vamos a editar archivos utilizando los módulos de Ansible. Hay algunos módulos que debes conocer para editar archivos utilizando Ansible, como blockinfile, lineinfile y replace.
El blockinfile insertará/eliminará varias líneas del archivo. El lineinfile es para una sola línea, y el módulo replace se puede utilizar para reemplazar cadenas.
1. Insertar varias líneas en un archivo utilizando «blockinfile
Añade la configuración de múltiples líneas a la configuración ssh ‘sshd_config’ utilizando el módulo ‘blockinfile’. Y la configuración por defecto insertará la nueva configuración al final de las líneas.
- name: Insert multiple lines and Backup blockinfile: path: /etc/ssh/sshd_config backup: yes block: | ClientAliveInterval 360 ClientAliveCountMax 0
2. Insertar varias líneas utilizando las opciones de marcador
O si quieres insertar a la línea específica, puedes utilizar la opción marcador y seguir por ‘insertafter’ o ‘insertbefore’ y Regex, o puedes utilizar ambas.
El siguiente libro de jugadas insertará una nueva configuración adicional en el archivo ‘sshd_config’. La configuración adicional se añadirá antes de la línea ‘UserPAM’ rodeada por el marcador por defecto ‘# BEGIN ANSIBLE MANAGED BLOCK’.
- name: Insert after regex, backup, and validate blockinfile: path: /etc/ssh/sshd_config backup: yes marker: "# {mark} ANSIBLE MANAGED BLOCK " insertbefore: '^UsePAM ' block: | AllowUsers hakase vagrant PermitEmptyPasswords no PermitRootLogin no validate: '/usr/sbin/sshd -T -f %s'
3. Eliminar/Eliminar los alrededores del bloque de líneas múltiples dentro de los marcadores
Elimina el bloque de líneas rodeado por el marcador ansible ‘# BEGIN ANSIBLE MANAGED BLOCK’.
- name: Remote text block surrounding by markers blockinfile: path: /etc/ssh/sshd_config marker: "# {mark} ANSIBLE MANAGED BLOCK" content: "" backup: yes
4. Insertar una nueva línea en el archivo
Inserta una nueva línea de configuración ‘PasswordAuthentication no’ bajo la línea regex ‘#PermitEmptyPasswords’ a la configuración ssh ‘/etc/ssh/sshd_config’.
- name: Insert New Line under the Regex configuration lineinfile: path: /etc/ssh/sshd_config backup: yes regexp: '^PasswordAuthentication ' insertafter: '^#PermitEmptyPasswords ' line: 'PasswordAuthentication no' validate: '/usr/sbin/sshd -T -f %s'
5. Elimina la línea del archivo utilizando el módulo lineinfile
Para eliminar/borrar una línea del archivo, puedes utilizar la opción ‘estado: ausente’ y seguir por la expresión Regular de la línea como a continuación.
- name: Remove a line from the file lineinfile: path: /etc/ssh/sshd_config state: absent regexp: '^PasswordAuthentication'
6. Reemplazar cadenas de patrones con la expresión regular y el módulo Reemplazar
Ahora vamos a reemplazar una cadena utilizando el módulo ‘reemplazar’. El módulo replace requiere la expresión regular como backend-reference para reemplazar cadenas de tipo.
Cambia el nombre del host en el archivo ‘/etc/hosts’ utilizando el módulo replace.
- name: Replace the default replace: path: /etc/hosts regexp: '(\s+)node\.provision\.labs(\s+.*)?$' replace: '\1box.hakase.labs\2' backup: yes
7. Descomentar configuraciones
El módulo replace puede utilizarse para descomentar la configuración en el sistema Linux. De forma sencilla, podemos eliminar la cadena de comentario ‘#’ al principio de línea utilizando el módulo replace.
Descomenta la configuración de la línea ‘server_tokens’ en el archivo ‘/etc/nginx/nginx.conf’.
- name: Uncomment configuration replace: path: /etc/nginx/nginx.conf regexp: '#(\s+)server_tokens' replace: 'server_tokens' backup: yes
8. Comenta la línea de configuración
A continuación, comenta la línea de configuración añadiendo el ‘#’ al principio de la línea.
- name: Comment Line configuration replace: path: /etc/nginx/nginx.conf regexp: '(\s+)gzip on' replace: '\n\t#gzip on' backup: yes
Establecer atributos de archivos utilizando el módulo file en Ansible
El módulo archivo se puede utilizar para establecer atributos de los propios archivos, como cambiar el propietario, el grupo y el permiso, crear un enlace simbólico, crear un nuevo directorio y eliminar un enlace simbólico, archivo o directorio.
1. Crear enlace simbólico de archivo
Crea un archivo symlink en el host remoto para la configuración del host virtual nginx llamado ‘vhost’ al directorio ‘/etc/nginx/sites-enabled/’.
- name: Create Symlink of file file: src: /etc/nginx/sites-available/vhost dest: /etc/nginx/sites-enabled/vhost owner: root group: root state: link
2. Crear un nuevo directorio utilizando el módulo de archivos
Para crear un nuevo directorio utilizando el módulo file, necesitamos utilizar la opción state con el valor ‘directory’ como se indica a continuación.
- name: Create a New Directory using file file: path: /etc/nginx/ssl state: directory owner: root group: root mode: 0755