実装: classify-stage as Ansible task

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 と違ってステージは排他的という前提を元に振り分ける。 簡単なことをやりたいはずだったのに jinja2for,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
comments powered by Disqus