Ansible でターゲットホストのファイルをターゲットホスト内でコピーする

最近 Ansible ばっかり触ってます。こんにちは。Ansible のちょっとしたテクニックなど、ググったらまぁ大抵出てくることには出てくるんですけど、だいたい英語の記事しか出てこないので、日本語でナレッジを残していくという意味でアウトプットしていきたいと思います。Ansible 好きだし、広く使ってもらいたいので。

で、掲題の件ですよ。Ansible でファイルをコピーと言えば、コントロールホスト上にあるファイルをターゲットホストにコピーする copy モジュール を使いますよね。でも、そうじゃなくて、ターゲットホスト内にあるファイルを、ターゲットホスト内でコピーしたいときどうするのかっていう話です。

これだけじゃあまり伝わらないと思うのですが、例えば RPM ファイルに含まれる /usr/share/hogehoge/sample.conf みたいなサンプルの設定を、そのまま設定ファイルとして /etc/hogehoge/main.conf にコピーしたい、みたいなことってたまにあると思うんです。そういうことです。で、こういうことは copy モジュールだと実現できません。

さて、じゃあ何を使えばいいのかって言うと、synchronize モジュール を使います。synchronize モジュールは rsync の動きをするんですが、他のモジュールと違って、rsync をターゲットホスト上ではなく、コントロールホスト上で動かします。で、この synchronize モジュールをそのまま使うだけだと意図した動作を得られないのですが、ここで delegate_to というオプションを使います。具体的なコードは以下の通り。

- synchronize:
    src: /usr/share/hogehoge/sample.conf
    dest: /etc/hogehoge/main.conf
  delegate_to: "{{ inventory_hostname }}"

delegate_to オプションは このドキュメント に記載されてるんですが、任意のタスクを実行するホストを指定する、つまり処理の移譲先を指定するオプションなんですね。上の例だと、{{ inventory_hostname }} に対して処理を委譲しているので、ターゲットホストで synchronize モジュールを動かすことになります。

これによって、ターゲットホスト上で rsync を動かして、ターゲットホスト内のファイルをコピーするという動きが実現できるようになります。