今川館

都内勤務の地味OLです

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を仕掛けたり外したりできる。