dev,stage,prod といったステージを動的に判断したかった。
ansible-utilにタスクを追加した。
動きとしては stage,prod は明示的にコントロールしどれにも所属してなければ、 dev に所属させる。
使い方は playbook の先頭で all 向けに実施する。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
---
- set_fact:
not_staged: |
{%- set trued = [] -%}
{%- for group_name in classifir_stages -%}
{%- if group_name in groups and classifir_target in groups[group_name] -%}
{%- set _ = trued.append(group_name) -%}
{%- endif -%}
{%- endfor -%}
{%- if trued|length > 0 -%}{{ false }}{%- else -%}{{ true }}{%- endif -%}
- add_host:
name: "{{ classifir_target }}"
groups: "{{ classifir_default_stage }}"
when: not_staged
|
web,db と違ってステージは排他的という前提を元に振り分ける。
簡単なことをやりたいはずだったのに jinja2 の for,if,set を使うという少し重めなものが出来上がってしまった。
ステージやデフォルトの定義は下のようにしているので上書きして使える。
1
2
3
|
classifir_target: "{{ inventory_hostname }}"
classifir_stages: [ prod, stage, dev ]
classifir_default_stage: dev
|
使い方
下みたいに呼び出す。
1
2
3
4
5
6
7
8
9
10
11
12
13
|
---
- hosts: all
tasks:
- include_role:
name: masu_mi.util
tasks_from: classify-stages
private: true
vars:
classifir_stages:
- develop
- staging
- production
classifir_default_stage: develop
|