ステージングや本番の環境をAnsibleで管理しているときに、新しい修正を段階的に適用したいことがあります。
なにか設定を変更するときに、まずはステージング環境に適用して動作確認をして、問題がないことが確認できてから本番環境に適用するということをしています。
もし、ステージング環境での確認に時間がかかってしまうと、他の修正を先に本番に出さなければいけない様なことが発生して面倒なことになってしまいます。
こういった変更箇所の環境ごとの出し分けを、以下のような方法で管理したらどうかと考えてみました。(まだ実践では使ってません)
- 機能別のOn/Offを
feature
というdictionary構造で管理 -
group_vars
内の各グループの設定として、feature
のOn/Offを設定 - 修正箇所を
feature['xxx']
の条件にて制御する-
tasks
の適用条件(when
)やテンプレートの条件
-
group_vars/production
feature:
f001: false
f002: false
group_vars/staging
feature:
f001: true
f002: false
templates/file.txt.j2
Sample Text
{% if feature['f002'] %}
feature/f002
{% endif %}
main.yml
- hosts: all
connection: local
roles:
- file01
tasks:
- debug: var=feature
- name: f001
debug: msg="Do feature/001"
when: feature['f001']
- name: make file
template: src=templates/file.txt.j2 dest=./file.txt
こうしておけば、修正内容の適用可否を環境別に細かく制御できます。
また、feature
の値を見ればどの環境にどの修正を反映しているかが一目でわかります。
feature
に列挙している項目を行の有無ではなくtrue/false
にしてあるのは、ファイルをgitなどで管理しているときにdiffの表示などが綺麗にみえることを期待してのことです。