はじめに
Ansibleでは各PlaybookをRoleとして独立させることで、汎用性が高まります。
しかし、Role内でのcopyモジュールやtemplateモジュールのsourceディレクトリは、Roleディレクトリ配下のfiles,templatesに限定されてしまいます。
フルパスで指定もできますが、gitなどで管理する都合上、フルパスは現実的ではありません。
そこで、Role内で任意のディレクトリを相対パスで指定する方法を紹介します。
sample
ディレクトリ構成
site.yml
hosts/inventory_file
roles/
|--role_name/
| |--tasks/
| | |--main.yml
SRC_DIR/
|--SRC_FILES
Role
例として、templateモジュールで任意のディレクトリに置いたテンプレートファイルを指定します。
ここではrolesディレクトリと同じ階層にあるSRC_DIRディレクトリを指定することにします。
マジック変数inventory_dirを利用
---
- name: sample1
template:
src: "{{ inventory_dir }}/../SRC_DIR/SRC_FILES"
dest: /path/to/dest
マジック変数inventory_dir
にはansible-playbook実行時に指定したインベントリファイルのディレクトリ(例では./hosts)がセットされています。
ここからの相対パスを指定することで任意のディレクトリを指定できます。
マジック変数inventory_dir+ dirnameフィルタを利用
---
- name: sample2
template:
src: "{{ inventory_dir | dirname }}/SRC_DIR/SRC_FILES"
dest: /path/to/dest
また、inventory_dir
に対してdirname
フィルタを適用することでinventory_dir
の一階層上のディレクトリを指定することもできます。
dirname
フィルタはパスからディレクトリを抽出することができますが、ディレクトリパスに対して適用すると最下層ディレクトリがファイル名として扱われ、結果的に一階層上のディレクトリを抽出することができます。
まとめ
環境などに依存するファイルをRoleの外に置けるため、Roleの汎用性を保つのに役立つと思います。