includeとwhenでOSに依存したタスクを定義する

2015.10.07

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

渡辺です。

Roleを利用するとplaybookのタスクを適切な粒度に分割して整理することができます。 今回は特定のミドルウェアをOSによってインストール方法が異なる場合に有効な構成パターンを紹介します。

whenステートメント

Ansibleでは組み込み変数の「ansible_os_family」を参照し、whenステートメントを使うことでOSを判定してタスクを実行することができます。

---
- name: Install apache2 (RedHat).
  yum: name=httpd
  when: "ansible_os_family == 'RedHat'"
 
- name: Install apache2 (Debian).
  apt: name=apache2
  when: "ansible_os_family == 'Debian'"

このように、tasks/main.ymlに記述すれば、RedHatとDebianを判定してそれぞれのタスクを実行できます。

しかし、次のように各条件で複数のタスクを実行するような場合、非常に可読性が悪くなります...。

# main.yml
---
- hoge: hoge (RedHat).
  when: "ansible_os_family == 'RedHat'"

- huga: huga (RedHat).
  when: "ansible_os_family == 'RedHat'"

- hoge: hoge (Debian).
  when: "ansible_os_family == 'Debian'"

- huga: huga (Debian).
  when: "ansible_os_family == 'Debian'"

Includeステートメント

includeステートメントは、名前の通り、他のymlを取り込むステートメントです。

---
- include: setup.yml

OS毎のセットアップタスクを分割して定義する

whenステートメントとincludeステートメントを組み合わせると、OS毎のセットアップタスクを分割して定義し、実行させることができます。

# main.yml
---
- include: setup-RedHat.yml
  when: "ansible_os_family == 'RedHat'"
 
- include: setup-Debian.yml
  when: "ansible_os_family == 'Debian'"

setup-RedHat.ymlとsetup-Debian.ymlには、それぞれ環境に対応したタスクを定義します。 include自体がwhenステートメントで条件付けられているため、それぞれのsetup-RedHat.ymlとsetup-Debian.ymlにはwhenステートメントは不要です。

# setup-RedHat.yml
---
- hoge: hoge (RedHat).
- huga: huga (RedHat).
# setup-Debian.yml
---
- hoge: hoge (Debian).
- huga: huga (Debian).

ディレクトリ構成を見ても、どこに何が定義されているかが一目瞭然ですね。

rolse/xxxx/tasks
  main.yml
  setup-RedHat.yml
  setup-Debian.yml

まとめ

タスクはwhenステートメントで条件付けを行うことができます。 しかし、複数のタスクをまとめて条件付けする場合は、includeステートメントを併用します。 これは、RoleでOSに依存したタスクを実行するような場合で特に有効な構成です。