Ansibleでよく使うファイル操作モジュール

2015.03.11

Ansibleにはファイル操作のためのモジュールがいくつか用意されています。

その中でも、私の利用頻度が高いのは以下のモジュールたちです。

  • file
  • copy
  • template
  • synchronize

どういう時に何を使えばよいのか悩むことがあったので、それぞれ使い方を簡単にまとめておきます。

copy: ローカルのファイルをリモートにコピーする

copyモジュールは、ローカル(Ansibleコマンド実行端末)に存在するファイルをリモート(Ansible実行対象のサーバ)に配置するためのモジュールです。以下のような形で使います。

- copy: >
    src=foo.txt    
    dest=/tmp/foo.txt
    owner=root
    group=root
    mode=0755

srcにはコピー元のファイルを指定します。指定方法には2種類あります。まずひとつが絶対パスで指定する方法です。もう一つは公式ページのディレクトリ構成に従っていれば、ファイル名を指定するだけで動作します。
その他、所有者やパーミッションを指定することも可能です。

file: リモートのファイルの設定変更を行う

fileモジュールはリモートのファイル/ディレクトリの設定を実施するモジュールです。具体的には、シンボリックリンクの作成やファイルのパーミッション変更などが実施できます。
シンボリックリンクを作成する方法は以下の通りです。

- file: >
    src=/usr/local/foo.txt    
    dest=/opt/foo.txt
    owner=root
    group=root
    mode=0755
    state=link

ポイントはstateの部分でlinkと記載するところです。これで/usr/local/foo.txtから/opt/foo.txtへのシンボリックリンクが作られます。stateにはこの他にも以下の値を設定できます。

  • file: ファイルが存在することを確認する。ファイルが無ければエラーになる。
  • directory: ディレクトリを作成する。別途recurse: no を記載しておくと再帰的にディレクトリが作成される.
  • touch: 空のファイルを作成する。
  • hard: ハードリンクを作成する
  • absent: ファイルが存在していれば削除する。ない場合は何もしない。

こちらも、詳細な内容はドキュメントを確認下さい。

template: 埋め込んだ変数を置換してファイルをリモートに配置する

templateモジュールはcopyと似ています。異なる点としてはtemplateに指定するファイルにはプレースホルダ的なものを記述しておくことができるので、ホスト名などのようにサーバによって記載する内容が変わるものを処理するのに有用です。Chefのtemplateとほぼ同じものになります。
使い方は以下のような感じです。

template: >
  src=template.j2 
  dest=/opt/file.conf 
  owner=root 
  group=root 
  mode=0644

fileモジュールと同様に、srcには絶対パスと指定するか、推奨のディレクトリ構成におけるtemplateディレクトリの配下に置いたファイル名を指定します。拡張子の.j2は、Ansibleのテンプレートエンジンとして使われているJinja2の拡張子です。

synchronize: rsyncでディレクトリごと同期する

synchronizeモジュールは、その名の通りローカルとリモートの間でディレクトリの同期を行うモジュールです。内部的にはrsyncが使われているようです。

synchronize: >
  src=source_dir
  dest=/tmp/target_dir
  recursive=yes

srcには、絶対パスか、Ansible実行ディレクトリからの相対パスで指定します。recursive=yesをつけることで再帰的に同期が実行されます。

まとめ

今回は私がよく使うモジュールについてまとめてみました。この他にも様々なモジュールがあるので公式ドキュメントを眺めながら気になるモジュールをチェックしていくのが良いと思います。