この記事は公開されてから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に依存したタスクを実行するような場合で特に有効な構成です。