[Ansible]グループ変数を環境ごとに定義する

August 6th, 2020

開発環境と本番環境で共通のplaybookを使い、inventoryで対象のホストを切り替える場合、inventoryにグループ変数を書いているとinventoryが肥大化していくのをどうにかしたいと思い調べてみました。

解決策

公式ドキュメントを読むとホストグループをさらにグルーピングできる記述がありました。この機能を使ってグループ変数を定義していけば良さそうです。実際に試してみます。

# 元のグループ
[hoge-server]
server1
server2

# グループのグループ
[new-hoge-server:children]
# ここに書いたグループが含まれる
hoge-server

playbook

hoge-server.yml
- hosts: hoge-server
  tasks:
  - name: debug
    debug:
      var: hostvars[inventory_hostname]

inventory

開発環境用のinventoryではhoge-serverをhoge-server-developmentに含めます。

development.yml
[hoge-server]
dev-server

[hoge-server-development:children]
hoge-server

本番環境用のinventoryではhoge-serverをhoge-server-productionに含めます。

production.yml
[hoge-server]
prod-server

[hoge-server-production:children]
hoge-server

group_vars

各環境で異なる値を設定したい変数hoge-group-varに環境ごとの値を設定します。

group_vars/hoge-server-development.yml
hoge-group-var: development
group_vars/hoge-server-production.yml
hoge-group-var: production

動かしてみる

実際にinventoryを切り替えて実行してみます。

development

コマンド
ansible-playbook -i development.yml hoge-server.yml | grep hoge-group-var
結果
        "hoge-group-var": "development",

production

コマンド
ansible-playbook -i production.yml hoge-server.yml | grep hoge-group-var
結果
        "hoge-group-var": "production",

環境ごとのグループ変数が出力されました。