LoginSignup
4
11

More than 5 years have passed since last update.

AnsibleのRoleで任意のディレクトリを指定する

Last updated at Posted at 2017-03-30

はじめに

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を利用

roles/role_name/tasks/main.yml
---
- name: sample1
  template:
    src: "{{ inventory_dir }}/../SRC_DIR/SRC_FILES"
    dest: /path/to/dest

マジック変数inventory_dirにはansible-playbook実行時に指定したインベントリファイルのディレクトリ(例では./hosts)がセットされています。
ここからの相対パスを指定することで任意のディレクトリを指定できます。

マジック変数inventory_dir+ dirnameフィルタを利用

roles/role_name/tasks/main.yml
---
- name: sample2
  template:
    src: "{{ inventory_dir | dirname }}/SRC_DIR/SRC_FILES"
    dest: /path/to/dest

また、inventory_dirに対してdirnameフィルタを適用することでinventory_dirの一階層上のディレクトリを指定することもできます。

dirnameフィルタはパスからディレクトリを抽出することができますが、ディレクトリパスに対して適用すると最下層ディレクトリがファイル名として扱われ、結果的に一階層上のディレクトリを抽出することができます。

公式ドキュメント

まとめ

環境などに依存するファイルをRoleの外に置けるため、Roleの汎用性を保つのに役立つと思います。

4
11
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
11