Ansibleでよく使うファイル操作モジュール
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をつけることで再帰的に同期が実行されます。
まとめ
今回は私がよく使うモジュールについてまとめてみました。この他にも様々なモジュールがあるので公式ドキュメントを眺めながら気になるモジュールをチェックしていくのが良いと思います。