includeとwhenでOSに依存したタスクを定義する
渡辺です。
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に依存したタスクを実行するような場合で特に有効な構成です。