when
例えばOSによって処理を分けたいとき、以下のように条件式で分岐する。
- include: hoge.yml
when:
- ansible_distribution == "CentOS"
※ansible_distributionで構成管理対象OS名が取得可能
条件分岐のないrole切り替え
ansibleのwhenは、プログラミングにおけるif文なので増えるほど複雑さが増します。
個人的にはwhenは出来るだけ書きたくないなぁと思ったので以下のような書き方を考えてみました。
playbooks/main.yaml
- hosts: all
tasks:
- name: update tasks
include_role:
name: "{{ ansible_distribution }}"
最初はinclude_roleではなく、roleで実現しようと思いましたが、そこではansible_distribution変数が読めなかったのでこのように実現しました。
ansible変数のスコープがまだ良くわかっておりません。
ちなみにroles配下は以下のようになっており、各種ディストリビューションに合わせたディレクトリを切っています。
roles
├── CentOS
│ └── tasks
│ └── main.yaml
└── Ubuntu
└── tasks
└── main.yaml
メリット
- 他のディストリビューションを後から追加する場合も
playbooks/main.yaml
を変更する必要はありません。roles
配下に新たなディレクトリを切ればOK - 保守性の高いPlaybookとなります
その他
調べててもこういう書き方があんまり出回っているように見えなかったので、実用性があるのか?ないのか?わかりません。
複雑な条件分岐がある場合だとroles
配下のディレクトリの切り方を工夫したり、変数と変数を組み合わせるみたいなことが起きそう(つらそう)
roleの命名規則を定めないと運用できないかも。