AnsibleのHost Variablesの使いどころ
Host Variables とは?
Inventory — Ansible Documentation
[atlanta] host1 http_port=80 maxRequestsPerChild=808 host2 http_port=303 maxRequestsPerChild=909
Host Variablesは上記引用の通り、インベントリのホストのセクションに併記する値なのだが、これの使いどころって何なんだろうと最初のころ疑問に思っていた。
なぜならAnsibleはインベントリ以外にも変数に値を渡せる箇所がたくさんあるからだ。
ところがAnsibleを使い込んでいくうちにHost Variablesを使った方がうまくいくケースが存在することが次第にわかってきた(以下)。
特定の環境だけSSHの接続情報が違うとき
例えば
- development.ini 開発環境のDB/サーバーの設定値
- production.ini 本番環境の設定値
このように環境別にインベントリを分けて管理する場合に、特定のサーバーだけSSHに2022番ポートで接続しなければならないときにHost Variablesは役立つ。
[development.ini]
[webservers] 192.108.22.3 ansible_ssh_port=2022 192.108.22.6
[production.ini]
[webservers] 192.108.25.35 192.108.25.36
こんな風に。
複数のサーバーで冗長化しつつも、master/slaveの役割分担しているとき
本番環境に1号機と2号機の2台サーバーを用意してそれぞれwebアプリを稼働させるけれども、1号機にはcrontabを設定しバッチサーバーとしても稼働させる場合を想定する。
そして、もし1号機が故障したら2号機をバッチサーバーとして動かす運用とする。
つまり
[通常時]
サーバー | web | バッチ |
---|---|---|
1号機 | ○ | ○ |
2号機 | ○ | × |
[1号機 障害時]
サーバー | web | バッチ |
---|---|---|
1号機 | - | - |
2号機 | ○ | ○ |
このように構成を変える運用を想定する。
こういうときもHost Variablesが役立つ。
[roles/batch-server/tasks/main.yml]
- name: とあるジョブ {{ switching }} cron: name='some job' job='cd /var/www/some/src; /var/www/some/bin/python manage.py somejob' user=www hour='*/1' minute=5 state={{ 'present' if switching == 'on' else 'absent' }} sudo: yes
[build.yml]
- hosts: servers roles: - { role: batch-server, switching: 'on', when: master == 'yes' } - { role: batch-server, switching: 'off', when: master != 'yes' }
[production.ini]
[servers] 192.168.22.3 master=yes 192.168.22.7 master=no
実行コマンド
$ ansible-playbook -i production.ini build.yml
上記コマンドでデプロイする。
もし障害が起きて1号機が使えなくなったらproduction.iniを
[servers] # 192.168.22.3 master=no 192.168.22.7 master=yes
このように2号機をmaster=yesと書き換えて同じコマンドでデプロイすれば簡単にcrontabを仕掛けたり外したりできる。