2 つのリモート ノード間でファイルをコピーする必要があります。
- ノードAはファイルが存在する管理対象ノードである
- ノードBは、ファイルをコピーする管理対象ノードです。
すべての Ansible タスクを実行するコントロール ノードは、上記のノードのいずれでもないことに注意してください。
私は次のことを試しました:
scp
Ansibleのシェルモジュールでコマンドを使用する
- hosts: machine2
user: user2
tasks:
- name: Copy file from machine1 to machine2
shell: scp user1@machine1:/path-of-file/file1 /home/user2/file1
このアプローチはいつまでも続くことはありません。
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
このアプローチでは、次のようなエラーが発生します。
ファイル /Users//.ansible/cp/ansible-ssh-machine2-22- にアクセス中にエラーが発生しました。エラーは次のとおりです: [Errno 102] ソケットでは操作がサポートされていません: u'/Users//.ansible/cp/ansible-ssh-machine2-22-'
どうすればこれを実現できるでしょうか?
ベストアンサー1
として@ant31がすでに指摘している、あなたはsynchronize
モジュールはこれに対応しています。デフォルトでは、モジュールは制御マシンと現在のリモートホスト(inventory_host
)の間でファイルを転送しますが、delegate_to
タスクのパラメータ(これはタスク(モジュールのものではありません)。
タスクは または のどちらにも配置できますServerA
がServerB
、それに応じて転送の方向を調整する必要があります (mode
のパラメータを使用synchronize
)。
タスクを配置する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
これはデフォルトの を使用するmode: push
ため、ファイルはデリゲート ( ServerA
) から現在のリモート ( ServerB
) に転送されます。
これは奇妙に見えるかもしれません。なぜなら、タスクはServerB
(経由hosts: ServerB
)に配置されているためです。しかし、タスクは実際には委任されたホストで実行されるこの場合は です。したがって、からServerA
にプッシュすることは確かに正しい方向です。また、単に委任しないことを選択することはできないことに注意してください。そうすると、転送が と の間で行われることになります。ServerA
ServerB
制御ノードそしてServerB
。
タスクを配置する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
これは、mode: pull
転送方向を反転するために を使用します。繰り返しますが、タスクは実際には で実行されるServerB
ため、プルが正しい選択であることに留意してください。