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
またそのオプションの多さからかバグ報告数が比較的多い気がするので期待通りの動きをしないことが割とある、かもしれない。



  1. ただしこれはデフォルトのmode=pushの場合であり、mode=pullを指定した場合は「操作対象ホスト」から「rsync起動ホスト」にコピーが実行される。 

  2. ちなみにrsync起動ホストと操作対象ホストが別である場合は、どちらにもrsyncがインストールされている必要がある。 

TOP