Ansibleにおいて操作対象ホスト上でファイルやディレクトリをコピーすることはcopyモジュールではできないが、synchronizeモジュールではできるようになっている。
synchronizeモジュールはrsyncを実行させるモジュールであり、他のモジュールにないちょっと特殊な動きをする。
というのもsynchronizeモジュールは通常、”操作対象ホスト”ではなく”Ansibleの実行ホスト”でrsyncが起動されるのだが、にもかかわらずdelegate_toアトリビュートを指定すれば”Ansibleの実行ホスト”でもなく”delegate_toで指定されたホスト”でrsyncが起動されるようにすることができるのである。
synchronizeモジュールは「rsync起動ホスト」から「操作対象ホスト」へのファイルやディレクトリのコピーを行う。1
つまりdelegate_toを使って「rsync起動ホスト」を「操作対象ホスト」と同じものにしてやれば、操作対象ホスト上でファイルやディレクトリをコピーすることができる、というわけである。
操作対象ホストはplaybook中ではinventory_hostnameで取得することができる。
よって以下のようなtaskが操作対象ホスト上でコピーを行う一番単純な形である。
- synchronize:
src: /from_dir/
dest: /to_dir
delegate_to: "{{ inventory_hostname }}"
コピーではなく移動するならrsync_optsオプションで–remove-source-filesを付ければ良い。
- synchronize:
src: /from_dir/
dest: /to_dir
rsync_opts:
- --remove-source-files
delegate_to: "{{ inventory_hostname }}"
ただし–remove-source-filesでは移動元のファイルは消えるがディレクトリは消えず空ディレクトリが残るので、それも消したければさらにfileモジュールを使って削除する。
(synchronizeモジュールはrsyncを呼び出すため、srcのパスの最後にスラッシュを付けた場合と付けない場合の動作の違いに注意。付けた場合は「/from_dir/*」と見なされることになる)
- synchronize:
src: /from_dir
dest: /to_dir
rsync_opts:
- --remove-source-files
delegate_to: "{{ inventory_hostname }}"
- file:
path: /from_dir
state: absent
なお、synchronizeモジュールはrsync起動ホストにrsyncがインストールされていないと当然動作しない。2
またそのオプションの多さからかバグ報告数が比較的多い気がするので期待通りの動きをしないことが割とある、かもしれない。