【Ansible🤢🤮】Python😚のリストや辞書を使って変数宣言してみた

f:id:hira98:20190810171022p:plain

【結論】

  • Ansibleの強みを活かせない案件に参画しているせいで、Ansible🤢🤮になった人が書いたブログです。

  • Ansibleでも、リストやキーバリュー形式で変数を宣言し動的に切り替えることは可能。

【目次】

はじめに

以前、次のようなブログを書きました。

hira98.hatenablog.com

ブログを書いた当時はAnsible🤢🤮について詳しくなくて、💩コードしか書けませんでした。

しかし、Ansible🤢🤮でもリストやキーバリュー形式で変数を宣言して使うことできることが分かったので、備忘録程度に載せておきます。

やりたいこと

現在、Ansibleでホットスタンバイ方式で構成された機器への設定を行うプレイブックを開発しています。

制御対象の機器は、Active状態とStandby状態が自動で切り替わる仕様です。

よって、設定を行う前に、現在どちらがActive状態にあるかを判断して、接続先を分岐する必要があります。

この処理をフローで表すと下図のようになります。

f:id:hira98:20190810171110p:plain

引用:過去の自分😊

辞書型を使った場合

Python😚で書いた場合】

SERVER_INFO_DIC = {
  "HOST1":{
    "IP":       "111.111.111.111",
    "USERNAME": "admin_1",
    "PASSWORD": "hoge_1",
  },
  "HOST2":{
    "IP":       "222.222.222.222",
    "USERNAME": "admin_2",
    "PASSWORD": "hoge_2",
  },
}

# 仮で変数設定
# 本番では1系と2系より情報しActive機器を判定する関数を呼び出す
active_host_num = 1

active_host_name = f"HOST{active_host_num}"

print(SERVER_INFO_DIC[active_host_name]["IP"])
print(SERVER_INFO_DIC[active_host_name]["USERNAME"])
print(SERVER_INFO_DIC[active_host_name]["PASSWORD"])

【Ansible🤢🤮で書いた場合】

---
- hosts: localhost  # 自分自身に接続する
  tasks:
  - name: 接続先情報の定義
    set_fact:
      SERVER_INFO_DIC:
        HOST1:
          IP:       "111.111.111.111"
          USERNAME: "admin_1"
          PASSWORD: "hoge_1" 
        HOST2:
          IP:       "222.222.222.222"
          USERNAME: "admin_2"
          PASSWORD: "hoge_2"

  # 仮で変数設定
  # 本番では1系と2系より情報しActive機器を判定する.ymlを呼び出す
  - set_fact:
      active_host_num: 1
  
  - set_fact:
      active_host_name: "{{ 'HOST%d' | format(active_host_num) }}"

  - name: Active機器の情報を取得
    set_fact:
      ip:       "{{ SERVER_INFO_DIC[active_host_name].IP }}"
      username: "{{ SERVER_INFO_DIC[active_host_name].USERNAME }}"
      password: "{{ SERVER_INFO_DIC[active_host_name].PASSWORD }}"

  - debug:
      msg: "ip:{{ip}} username:{{username}} password:{{password}}"

リストを使った場合

Python😚で書いた場合】

SERVER_INFO_LIST= [
    {
      "IP":       "111.111.111.111",
      "USERNAME": "admin_1",
      "PASSWORD": "hoge_1",
    },{ 
      "IP":       "222.222.222.222",
      "USERNAME": "admin_2",
      "PASSWORD": "hoge_2",
    }
]

# 仮で変数設定
# 本番では1系と2系より情報しActive機器を判定する関数を呼び出す
active_host_num = 2

active_host_num -= 1

print(SERVER_INFO_LIST[active_host_num]["IP"])
print(SERVER_INFO_LIST[active_host_num]["USERNAME"])
print(SERVER_INFO_LIST[active_host_num]["PASSWORD"])

【Ansible🤢🤮で書いた場合】

---
- hosts: localhost  # 自分自身に接続する
  tasks:
  - name: 接続先情報の定義
    set_fact:
      SERVER_INFO_LIST:
        - {
            IP:       "111.111.111.111",
            USERNAME: "admin_1",
            PASSWORD: "hoge_1",
          }
        - { 
            IP:       "222.222.222.222",
            USERNAME: "admin_2",
            PASSWORD: "hoge_2",
          }

  # 仮で変数設定
  # 本番では1系と2系より情報しActive機器を判定する.ymlを呼び出す
  - set_fact:
      active_host_num: 1
  
  - set_fact:
      active_host_num: "{{ active_host_num - 1}}"

  - debug: msg="{{active_host_num}}"

  - name: Active機器の情報を取得
    set_fact:
      ip:       "{{ SERVER_INFO_LIST[active_host_num|int].IP }}"
      username: "{{ SERVER_INFO_LIST[active_host_num|int].USERNAME }}"
      password: "{{ SERVER_INFO_LIST[active_host_num|int].PASSWORD }}"

  - debug:
      msg: "ip:{{ip}} username:{{username}} password:{{password}}"

さいごに

Ansible🤢🤮でキーバリューやリストが使えるのを知った時は感動しました。

しかし、この感動を差し置いても今後Ansible🤢🤮を使った案件への参画は全力で回避したいと思います。