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

Referencia

https://docs.ansible.com/

Scroll al inicio