Muszę skopiować plik z komputera A na komputer B, podczas gdy moją maszyną sterującą, z której uruchamiam wszystkie moje zadania ansible, jest komputer C (komputer lokalny)
Próbowałem następujących rzeczy:
Użyj polecenia scp w module powłoki ansibla
hosts: machine2
user: user2
tasks:
- name: Copy file from machine1 to machine2
shell: scp user1@machine1:/path-of-file/file1 /home/user2/file1
To podejście po prostu trwa i nigdy się nie kończy.
użyj modułów pobierania i kopiowania
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
Takie podejście generuje następujący błąd:
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>'
Wszelkie sugestie byłyby pomocne.
Odpowiedzi:
Aby skopiować pliki zdalne na zdalne, możesz użyć modułu synchronizacji ze
delegate_to: source-server
słowem kluczowym „ ”:Ten podręcznik można uruchomić z poziomu komputera C.
źródło
config.ssh.insert_key = false
aby zmusić Vagrant do użycia JEDNEGO insecure_key w celu uzyskania dostępu do wszystkich maszyn. Ale teraz nawet nie dostaję komunikatu o błędzie (czeka wiecznie). Również błąd github.com/ansible/ansible/issues/7250 mówi, że nie można kopiować ze zdalnego na zdalny.mode=push
(lubdelegate_to: serverB
, ale nie obu).mode=push
należy użyć, ale w tej sytuacjidelegate_to: serverB
nie można go użyć, ponieważ spowodowałobyserverB
to źródło i cel.Jak już wskazał ant31, możesz użyć
synchronize
do tego modułu. Domyślnie moduł przesyła pliki między maszyną sterującą a bieżącym zdalnym hostem (inventory_host
), jednak można to zmienić za pomocądelegate_to
parametru zadania (należy zauważyć, że jest to parametr zadania , a nie modułu).Możesz umieścić zadanie na albo
ServerA
lubServerB
, ale musisz odpowiednio dostosować kierunek transferu (za pomocąmode
parametrusynchronize
).Włączanie zadania
ServerB
Używa wartości domyślnej
mode: push
, więc plik zostanie przesłany z delegate (ServerA
) do bieżącego remote (ServerB
).Może to brzmieć dziwnie, ponieważ zadanie zostało umieszczone na
ServerB
(viahosts: ServerB
). Należy jednak pamiętać, że zadanie jest faktycznie wykonywane na hoście delegowanym , którym w tym przypadku jestServerA
. Zatem pchanie (odServerA
doServerB
) jest rzeczywiście właściwym kierunkiem. Pamiętaj również, że nie możemy po prostu zrezygnować z delegowania w ogóle, ponieważ oznaczałoby to, że transfer odbywa się między maszyną sterującą aServerB
.Włączanie zadania
ServerA
Służy
mode: pull
do odwrócenia kierunku transferu. Ponownie pamiętaj, że zadanie jest faktycznie wykonywaneServerB
, więc ciągnięcie jest właściwym wyborem.źródło
Warning: Identity file /Users/myuser/.ssh/id_servers not accessible
.Jeśli chcesz zsynchronizować pliki między dwoma zdalnymi węzłami za pośrednictwem ansible, możesz użyć tego:
kiedy jest włączony
remote_server
, musisz uruchomić rsync w trybie demona. Prosty przykład:źródło
Udało mi się rozwiązać ten problem, używając lokalnego polecenia scp do pliku z komputera A do komputera C, a następnie kopiując plik do komputera B.
źródło
Prosty sposób wykorzystania modułu kopiowania do przesłania pliku z jednego serwera na drugi
Oto poradnik
źródło
Jeśli chcesz wykonać rsync i użyć niestandardowego użytkownika i niestandardowego klucza ssh, musisz wpisać ten klucz w opcjach rsync.
źródło
Możesz użyć również
deletgate
zscp
:Ponieważ
delegate
polecenie jest uruchamiane na innym serwerze i jestscp
plikiem dla siebie.źródło