ansibleからwhenを消す。またはwhenのないrole切り替えについて


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の命名規則を定めないと運用できないかも。