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}