Cómo copiar archivos entre hosts remotos en ansible

  • 0

¿Cómo copiar archivos entre servidores remotos en Ansible?. es el propósito de este artículo. Todos los artículos que fui a leer me daban sugerencias pero nada práctico. Simplemente quería hacer Ansible rsync. Quería ejecutar rsync entre hosts remotos y copiar archivos entre hosts remotos.

Así que aquí está el artículo orientado al ejemplo. En este post, vamos a discutir las dos principales opciones disponibles para copiar los archivos entre servidores remotos o remotos a remotos.

Cuando queremos copiar archivos de un host a otro host, en general, lo primero que viene a nuestra mente es SCP y ansible tiene un módulo dedicado para el mismo nombre COPY

Si desea copiar un archivo de un maestro de control de Ansible a hosts remotos, el módulo COPY (scp) estaría bien. Pero necesitamos algo más cuando queremos copiar los archivos entre los hosts remotos o copiar archivos entre remoto a remoto.

Vamos a utilizar algunos de los módulos de ansible como copy, fetch, synchronize para cumplir con el requisito de copiar los archivos entre hosts en ansible.

Mientras que ya somos conscientes de lo que es el módulo Ansible Copy se utiliza para.

Aquí está la introducción simple a Ansible Fetch y Ansible Synchronize.

Ansible Fetch es para tirar de los archivos desde el servidor remoto a la máquina de control.

Ansible Synchronize se utiliza para copiar los archivos entre los servidores remotos (o) hosts de destino. Esto es más como realizar RSYNC con ayuda de Ansible.

Tabla de contenidos

El índice

  1. El plan / El requisito
  2. Método1: Copiar archivos entre hosts remotos usando el módulo fetch
  3. Método2: Copiar archivo entre hosts remotos usando el módulo synchronize
    1. Synchronize Push
    2. Synchronize Pull
  4. La salida de la ejecución
  5. Referencias y otros artículos relacionados.

El Plan / El Requerimiento

Para empezar, definamos nosotros mismos algún requerimiento para que, podamos relacionarnos y estar en la misma página.

Tenemos dos servidores llamados así

  1. mwiappi01
  2. mwiapp02

El requerimiento es copiar un archivo de mwiapp01 a mwiapp02. Antes de proceder, Este es el diagrama de la infraestructura de nuestra configuración.

No se confunda por el nombre Maestro. Es sólo una máquina de control. Recuerde que Ansible es menos agente. así que no hay maestro y esclavo.

Método1: Copiar de app01 a app02 usando el módulo fetch

No se requiere autenticación SSH entre los nodos remotos para este método

Esta es la mejor y más fácil opción para transferir archivos entre los nodos remotos cuando no se tiene habilitada la autenticación basada en clave SSH entre los nodos remotos. Aunque, no es el camino más corto (o) beeline. Funciona bien cuando nuestro enfoque principal es conseguir el trabajo hecho cualquiera que sea el enfoque.

es un proceso de dos pasos cuando se trata de este método.

Paso 1: Obtener el archivo desde el servidor remoto (fuente) al maestro ansible

Paso 2: Empujar (Copiar) el archivo desde el maestro ansible al servidor remoto ( destino)

Aquí el maestro actúa como un buffer donde los archivos son almacenados temporalmente y luego transferidos.

Considera el siguiente playbook que realiza estas dos tareas mencionadas.

--- - hosts: app tasks: - name: Fetch the file from the mwiapp01 to master run_once: yes fetch: src=/tmp/app01-to-app02.jar dest=buffer/ flat=yes when: "{{ inventory_hostname == 'mwiapp01' }}" - name: Copiar el archivo del maestro a mwiapp02 copy: src=buffer/app01-to-app02.jar dest=/tmp/ when: "{{ inventory_hostname == 'mwiapp02' }}"

aquí usamos "when" para realizar la ejecución basada en condiciones y inventory_hostname es la variable incorporada de ansible que apuntará el nombre del host remoto de ejecución actual.

A veces puede ser necesario utilizar ansible_hostname en lugar de inventory_hostname

Básicamente estamos instruyendo al Ansible para que ejecute la tarea Fetch sólo en el servidor mwiapp01 y la tarea copy sólo cuando el mwiapp02 es el host de ejecución remota actual.

Método 2: Copiar de app01 a app02 usando el módulo synchronize

La autenticación basada en clave SSH debe estar habilitada entre los hosts remotos

Para que el módulo Synchronize funcione sin problemas, la autenticación basada en clave SSH debe estar habilitada entre los nodos remotos. De lo contrario, la tarea de sincronización se atascará y también su juego Ansible.

En otras palabras, los nodos remotos deben ser capaces de iniciar sesión entre sí sin tener que introducir la contraseña manualmente. Logramos esto principalmente con la ayuda de la clave SSH.

Como se dijo anteriormente. Ansible Synchronize es más como Ansible RSYNC. la característica típica rsync de Linux.

Para saber cómo habilitar la autenticación basada en clave en cuestión de segundos, consulte el siguiente artículo

Habilitar la autenticación basada en clave SSH usando Ansible

Una vez que estamos listos con la autenticación basada en clave SSH. Estamos listos para reproducir la obra. ( playbook).

Hay dos métodos para copiar archivos usando el módulo Synchronize

  1. Synchronize Pull
  2. Synchronize Push

Considera los siguientes playbooks que copian el archivo de mwiapp01 a mwiapp02 usando tanto el método Synchronize Pull como Synchronize Push

Synchronize Pull

Dirigido a: Source Server (mwiapp01)

Delegated to and Executed on: Servidor de destino (mwiapp02)

Explicación: Como se está ejecutando en el servidor de destino donde tiene que llegar el archivo. La tarea consiste en tirar del archivo desde el servidor de origen (o).

Aquí está el playbook que se ejecuta en el servidor de destino mwiapp02 con ayuda de la delegación y pulls el archivo de mwiapp01 a mwiapp02

---- name: Sync Pull task - Executed on the Destination host "{{groups}}" hosts: "{{groups}}" user: wlsusr tasks: - name: Copy the file from mwiapp01 to mwiapp02 using Method Pull tags: sync-pull synchronize: src: "{{ item }}" dest: "{{ item }}" mode: pull delegate_to: "{{groups}}" register: syncfile run_once: true with_items: - "/tmp/app01-to-app02.jar"

Se podría pensar que el playbook está configurado para ejecutarse en el primer servidor ya que la directiva hosts está dirigida al primer servidor. hosts: "{{group}}" mwiapp01

Pero tienes que notar que en realidad estamos ejecutando esta tarea en el segundo servidor mwiapp02 con la ayuda de delegate_to

Mira el siguiente registro de pantalla para entenderlo mejor.

Sincronizar Push

Objetivo: Destination Server (mwiapp02)

Delegated to and Executed on: Servidor Origen (mwiapp01)

Explicación: Como se está ejecutando en el servidor de origen donde el archivo ya está presente. La tarea es empujar el archivo al servidor de destino

Aquí está el libro de jugadas que se ejecuta en el servidor de origen mwiapp01 y pushes el archivo de 01 a 02

- nombre: Tarea de empuje de sincronización - Ejecutado en el host de origen "{{groups}}" hosts: "{{groups}}" user: wlsusr tasks: - name: Copiar el archivo de mwiapp01 a mwiapp02 usando el método Push tags: sync-push synchronize: src: "{{ item }}" dest: "{{ item }}" mode: push delegate_to: "{{groups}}" register: syncfile with_items: - "/tmp/app01-to-app02.jar"

Se podría pensar que el playbook está configurado para ejecutarse en el segundo servidor ya que la directiva hosts está dirigida al primer servidor. hosts: "{{group}}" mwiapp02

Pero tienes que notar que en realidad estamos ejecutando esta tarea en el primer servidor mwiapp01 con la ayuda de delegate_to

El Playbook se compone de dos listas de tareas basadas en el host. La primera se ejecuta usando Synchronize Pull se ejecutará en mwiapp02y la segunda con Synchronize Push se ejecutará en mwiapp01

Aunque el playbook es inteligible ( fácil de entender). Creo que hay algunas líneas peculiares que necesitan más explicación, como "{{groups}}"

Representa el primer elemento (o) servidor del grupo de host llamado «app» al igual que un array

Espero que la siguiente imagen lo aclare.

Otras dos líneas importantes en el archivo son las siguientes

  • modo Representa el modelo del Synchronize. Ya sea Synchronize pull o Synchronize push
  • delegate_to Le dice a ansible, donde la tarea (o) el comando debe ser realmente ejecutado.

Espero que usted podría haber conseguido por ahora. delegate_to y el hosts junto con mode en ansible-playbook, trabajan juntos para hacer posible la ejecución remota (o) la copia entre nodos remotos.

Salida de la ejecución

En la captura de pantalla anterior, hemos ejecutado 3 comandos. El primero y el último es un comando ad-hoc de Ansible para comprobar la disponibilidad del archivo bajo el directorio /tmpen mwiapp02servidor

usamos --limitpara ejecutar el comando en un solo servidor, aunque usamos el hostgroup que contiene dos servidores.

hemos copiado con éxito un archivo de mwiapp01 a mwiapp02 utilizando los módulos Fetch y Synchronize.

Conclusión

En este post, hemos aprendido y ejecutado con éxito cómo copiar archivos entre hosts remotos utilizando los módulos ansible copy y fetch. Hemos aprendido dos métodos para copiar los archivos entre hosts usando ansible.

Espero que encuentres este artículo útil.

  1. Referencia del módulo Ansible Copy
  2. Referencia del módulo Ansible Fetch
  3. Referencia del módulo Ansible Synchronize
  4. Cómo copiar o intercambiar la clave SSH entre múltiples hosts – Ansible
  5. Cómo intercambiar la IP y actualizar el archivo /etc/hosts en múltiples hosts – Ansible

Espero que este artículo ayude. Si te gusta este artículo, por favor compártelo