J'ai besoin de copier la machine de forme de fichier A sur la machine B alors que ma machine de contrôle depuis laquelle je lance toutes mes tâches ansibles est la machine C (machine locale).
J'ai essayé ce qui suit:
tilisez la commande scp dans le module Shell d'ansible
hosts: machine2
user: user2
tasks:
- name: Copy file from machine1 to machine2
Shell: scp user1@machine1:/path-of-file/file1 /home/user2/file1
Cette approche continue sans fin.
tilisez les modules fetch & copy
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
Cette approche me jette une erreur comme suit:
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>'
Toute suggestion serait utile.
Pour copier des fichiers distants, vous pouvez utiliser le module synchroniser avec le mot clé '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
Ce livret peut être exécuté à partir de votre machineC.
Comme ant31 l'a déjà indiqué, vous pouvez utiliser le module synchronize
pour cela. Par défaut, le module transfère des fichiers entre la machine de contrôle et l'hôte distant actuel (_inventory_Host
_), mais cela peut être modifié à l'aide du paramètre delegate_to
de la tâche (il est important de noter qu'il s'agit d'un paramètre de la tâche et non du module).
Vous pouvez placer la tâche sur ServerA
ou ServerB
, mais vous devez ajuster la direction du transfert en conséquence (à l'aide du paramètre mode
de synchronize
).
Placer la tâche sur 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
_
Ceci utilise la valeur par défaut _mode: Push
_ afin que le fichier soit transféré du délégué (ServerA
) à la télécommande actuelle (ServerB
).
Cela peut sembler étrange, puisque la tâche a été placée sur ServerB
(via _hosts: ServerB
_). Cependant, il faut garder à l'esprit que la tâche est réellement exécutée sur l'hôte délégué , qui dans ce cas est ServerA
. Donc, appuyer (de ServerA
à ServerB
) est bien la bonne direction. Rappelez-vous également que nous ne pouvons pas simplement choisir de ne pas déléguer du tout, car cela signifierait que le transfert a lieu entre la machine de contrôle et ServerB
.
Placer la tâche sur 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
_
Ceci utilise _mode: pull
_ pour inverser le sens du transfert. Encore une fois, gardez à l’esprit que la tâche est réellement exécutée sur ServerB
. Tirer est donc le bon choix.
Si vous avez besoin de synchroniser des fichiers entre deux nœuds distants via ansible, vous pouvez utiliser ceci:
- 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 }}"
lorsque vous êtes sur remote_server
, vous devez démarrer rsync avec le mode démon. Exemple 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
J'ai pu résoudre ce problème en utilisant local_action to scp to file de machineA à machineC puis en copiant le fichier sur machineB.
Vous pouvez aussi utiliser deletgate
avec scp
:
- name: Copy file to another server
become: true
Shell: "scp -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null admin@{{ inventory_hostname }}:/tmp/file.yml /tmp/file.yml"
delegate_to: other.example.com
En raison de delegate
, la commande est exécutée sur l'autre serveur et il scp
le fichier pour lui-même.
Si vous voulez utiliser rsync et utiliser un utilisateur et une clé ssh personnalisés, vous devez écrire cette clé dans les options de rsync.
---
- name: rsync
hosts: serverA,serverB,serverC,serverD,serverE,serverF
gather_facts: no
vars:
ansible_user: Oracle
ansible_ssh_private_key_file: ./mykey
src_file: "/path/to/file.txt"
tasks:
- name: Copy Remote-To-Remote from serverA to server{B..F}
synchronize:
src: "{{ src_file }}"
dest: "{{ src_file }}"
rsync_opts:
- "-e ssh -i /remote/path/to/mykey"
delegate_to: serverA
Un moyen simple d'utiliser le module de copie pour transférer le fichier d'un serveur à un autre
Voici playbook
---
- 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}