Contents
ESXi障害時のVM復旧をvCenterを使わずにAnsible Tower(or AWX) + Zabbixで出来たら面白そうだと思いやってみました。
やりたかったこと
ESXiダウン(障害)をZabbixが検知したら、そのESXi上で稼働していたVMを他のESXi上に移動させて復旧させます。
環境
項目 | バージョン |
---|---|
Ansible Tower | 3.4.2 |
Ansible | 2.7.8 |
RHEL | 7.6 |
Zabbix | 4.0.5-1 |
CentOS | 7.6.1810 |
ESXi | 6.7.0 Build 8169922 |
考えなくてはいけないこと
ZabbixがESXiの障害を検知して且つそのESXi上で稼働していたVMの特定と移動先のESXiを指定する必要があります。
そこで、ここでは以下のようにしてみたいと思います。
- 障害検知用でESXiへのping監視
- 障害検知用でVMへのping監視
- ESXiの障害且つVMの障害が発生したらVMを移動させる
- 移動先のESXiはVMのホストインベントリのタグに設定しておく
出来れば人間が意識せず動的に移動先ESXiを自動で識別できる仕組みを作れればいいんですが、ここでは静的に記述します。
準備
Zabbix側準備
tower-cli
を使ってAnsible Towerのテンプレートを実行するためインストールします。
1 2 3 4 |
[root@localhost ~]# yum install epel-release [root@localhost ~]# yum -y install python2-pip [root@localhost ~]# pip2 install ansible-tower-cli |
Ansible Tower側準備
Ansible Tower側にはプロジェクトを作成します。
プロジェクト用ディレクトリを作成します。
1 2 3 4 |
[root@ansible ~]# cd /var/lib/awx/projects/ [root@ansible projects]# mkdir esxi_register_vm_inventory [root@ansible projects]# cd esxi_register_vm_inventory/ |
使用するためのモジュールを準備します。
ここでは以下のモジュールを使用します。
モジュール | 説明 |
---|---|
vmware_guest_register_operation | ストレージにあるVMをESXiに登録するためのモジュール |
vmware_guest_powered_on_operation_question | VM移動後に電源をつけた時に問われる質問に自動で回答してくれるモジュール |
zabbix_host_facts | コミュニティにある標準モジュール |
Ansible 2.7.xのzabbix_host_factsモジュールだとホストインベントリが取得できませんでした。
そのため、アップストリームにホストインベントリが取得できるオプションをPRしたところマージしてくれたので、それを使います。
今回は devel
ブランチからダウンロードしますが、Ansible 2.8から適応されます。
それ以外はコミュニティにないため、自作モジュールになります。
1 2 3 4 5 6 7 |
[root@ansible esxi_register_vm_inventory]# mkdir library [root@ansible esxi_register_vm_inventory]# cd library [root@ansible library]# curl https://raw.githubusercontent.com/sky-joker/ore-ore-ansible/master/modules/cloud/vmware/vmware_guest_powered_on_operation_question.py -O [root@ansible library]# curl https://raw.githubusercontent.com/ansible/ansible/devel/lib/ansible/modules/cloud/vmware/vmware_guest_register_operation.py -O [root@ansible library]# curl -L https://raw.githubusercontent.com/ansible/ansible/devel/lib/ansible/modules/monitoring/zabbix/zabbix_host_facts.py -O [root@ansible library]# cd .. |
Playbookを作成します。
1 2 |
[root@ansible esxi_register_vm_inventory]# vi main.yml |
ここでは vm_password
はVaultで暗号化しています。
必要であれば zabbix_password
もVaultで暗号化してもいいと思います。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
--- - name: Move the VM hosts: localhost gather_facts: no vars: vm_password: !vault | $ANSIBLE_VAULT;1.1;AES256 (snip) tasks: - name: Get Zabbix hosts inventory. zabbix_host_facts: server_url: "{{ zabbix_url }}" login_user: "{{ zabbix_username }}" login_password: "{{ zabbix_password }}" host_name: "{{ host_name }}" host_inventory: - tag register: r - name: Register VM to inventory vmware_guest_register_operation: hostname: "{{ item.inventory.tag }}" username: "{{ vm_username }}" password: "{{ vm_password }}" validate_certs: no esxi_hostname: "{{ item.inventory.tag }}" name: "{{ vm_name }}" path: "[NFS] {{ item.name }}/{{ item.name }}.vmx" state: present loop: "{{ r.hosts }}" - name: VM power operation vmware_guest_powered_on_operation_question: hostname: "{{ item.inventory.tag }}" username: "{{ vm_username }}" password: "{{ vm_password }}" validate_certs: no name: "{{ vm_name }}" state: poweredon loop: "{{ r.hosts }}" |
設定
Zabbix設定
ESXi監視
ESXi監視設定は以下のようになっています。
ホスト
アイテム
トリガー
VM監視
ホスト
VMの監視にはマクロを登録しています。
マクロ | 説明 |
---|---|
{$ANSIBLE_PASSWORD}} | Ansible Towerのパスワード |
{$ANSIBLE_TOWER} | Ansible Towerのホスト名またはIPアドレス |
{$ANSIBLE_USER} | Ansible Towreのユーザー名 |
{$PASSWORD} | ESXiのパスワード |
{$URL} | ESXiのAPI URL |
{$USERNAME} | ESXiのユーザー名 |
{$ZBX_PASSWORD} | Zabbixのパスワード |
{$ZBX_URL} | ZabbixのURL |
{$ZBX_USER} | Zabbixのユーザー |
VMのホストインベントリです。
ここでは、タグに移動先ESXiを登録しています。
アイテム
稼働しているESXiの記録を残しておくために HyperVisor
というアイテムを登録しています。
もし、移動した場合に移動前はどのESXiで稼働していたかを確認する目的で入れています。
トリガー
トリガーはESXiのping断且つVMのping断が発生したら VM移動トリガー
を発生させます。
VM断の判断条件は必ず最初に入れてください。
トリガーに設定された条件式に書いてある最初の条件のホストのマクロが使われるからです。
アクション
アクションの設定は以下のようにしています。
コマンドは以下のように設定しています。
1 2 |
tower-cli job launch -u {$ANSIBLE_USER} -p {$ANSIBLE_PASSWORD} -h {$ANSIBLE_TOWER} -J 'register vm to esxi' -e '{"zabbix_url": "{$ZBX_URL}", "zabbix_username": "{$ZBX_USER}", "zabbix_password": "{$ZBX_PASSWORD}", "host_name": "{HOST.HOST}", "vm_username": "{$USERNAME}", "vm_name": "{HOST.NAME}"}' --insecure |
Ansible Tower設定
プロジェクト
テンプレート
extra_varsが受け取れるように追加変数の 起動プロンプト
にチェックを入れます。
実行
ESXiをダウンさせると障害をZabbixが検知しAnsible Tower経由でVMの復旧がされます。
move the vm to ESXi from faile ESXi from sky_joker on Vimeo.
これで、vCenterを使わなくてもESXi単体でVMの復旧ができました 🙂