when tutorial run playbook how files español define arquitectura ansible

tutorial - arquitectura ansible



Cómo copiar archivos entre dos nodos usando ansible (5)

Necesito copiar el archivo de la máquina A a la máquina B mientras que mi máquina de control desde donde ejecuto todas mis tareas posibles es la máquina C (máquina local)

He probado lo siguiente:

Usa el comando scp en el modulo de shell de ansible

hosts: machine2 user: user2 tasks: - name: Copy file from machine1 to machine2 shell: scp user1@machine1:/path-of-file/file1 /home/user2/file1

Este enfoque sigue y sigue nunca termina.

usar módulos de captura y copia

hosts: machine1 user: user1 tasks: - name: copy file from machine1 to local fetch: src=/path-of-file/file1 dest=/path-of-file/file1 hosts: machine2 user: user2 tasks: - name: copy file from local to machine2 copy: src=/path-of-file/file1 dest=/path-of-file/file1

Este enfoque me lanza un error de la siguiente manera:

error while accessing the file /Users/<myusername>/.ansible/cp/ansible-ssh-machine2-22-<myusername>, error was: [Errno 102] Operation not supported on socket: u''/Users/<myusername>/.ansible/cp/ansible-ssh-machine2-22-<myusername>''

Cualquier sugerencia sería útil.


Como ant31 ya señaló, puede usar el módulo de synchronize para esto. De forma predeterminada, el módulo transfiere archivos entre la máquina de control y el host remoto actual ( inventory_host ), sin embargo, se puede cambiar utilizando el parámetro delegate_to la tarea (es importante tener en cuenta que este es un parámetro de la tarea , no del módulo).

Puede colocar la tarea en ServerA o ServerB , pero debe ajustar la dirección de la transferencia en consecuencia (utilizando el parámetro de mode de synchronize ).

Colocando la tarea en ServerB

- hosts: ServerB tasks: - name: Transfer file from ServerA to ServerB synchronize: src: /path/on/server_a dest: /path/on/server_b delegate_to: ServerA

Esto utiliza el mode: push predeterminado mode: push , por lo que el archivo se transfiere desde el delegado ( ServerA ) al control remoto actual ( ServerB ).

Esto puede ServerB extraño, ya que la tarea se ha colocado en ServerB (a través de hosts: ServerB ). Sin embargo, hay que tener en cuenta que la tarea se ejecuta realmente en el host delegado , que en este caso es ServerA . Así que empujar (de ServerA a ServerB ) es de hecho la dirección correcta. También recuerde que no podemos simplemente elegir no delegar en absoluto, ya que eso significaría que la transferencia se produce entre la máquina de control y ServerB .

Colocando la tarea en ServerA

- hosts: ServerA tasks: - name: Transfer file from ServerA to ServerB synchronize: src: /path/on/server_a dest: /path/on/server_b mode: pull delegate_to: ServerB

Esto usa el mode: pull para invertir la dirección de transferencia. Nuevamente, tenga en cuenta que la tarea se ejecuta realmente en ServerB , por lo que tirar es la opción correcta.


Para copiar archivos de remoto a remoto, puede usar el módulo de synchronize con la palabra clave '' delegate_to: source-server '':

- hosts: serverB tasks: - name: Copy Remote-To-Remote (from serverA to serverB) synchronize: src=/copy/from_serverA dest=/copy/to_serverB delegate_to: serverA

Este libro de jugadas puede ejecutarse desde tu machineC.


Pude resolver esto usando local_action to scp para archivar desde machineA a machineC y luego copiando el archivo a machineB.


Si necesita sincronizar archivos entre dos nodos remotos a través de ansible, puede usar esto:

- name: synchronize between nodes environment: RSYNC_PASSWORD: "{{ input_user_password_if_needed }}" synchronize: src: rsync://user@remote_server:/module/ dest: /destination/directory/ // if needed rsync_opts: - "--include=what_needed" - "--exclude=**/**" mode: pull delegate_to: "{{ inventory_hostname }}"

cuando se encuentra en el remote_server , debe iniciar rsync con el modo daemon. Ejemplo simple:

pid file = /var/run/rsyncd.pid lock file = /var/run/rsync.lock log file = /var/log/rsync.log port = port [module] path = /path/to/needed/directory/ uid = nobody gid = nobody read only = yes list = yes auth users = user secrets file = /path/to/secret/file


Una forma sencilla de utilizar el módulo de copia para transferir el archivo de un servidor a otro

Aquí está el libro de jugadas

--- - hosts: machine1 {from here file will be transferred to another remote machine} tasks: - name: transfer data from machine1 to machine2 copy: src=/path/of/machine1 dest=/path/of/machine2 delegate_to: machine2 {file/data receiver machine}