AnsibleとZabbixを組み合わせたイベントドリブンな監視システムを作ってvSphere環境を監視してみる

はじめに

本記事は Ansible Advent Calendar 2022, Ansible Advent Calendar 2022 – Qiita, vExperts Advent Calendar 2022の3日目の記事になります。

ここでは、AnsibleFest 2022で発表されたAnsibleのイベントドリブンな環境を構築し動作させてみようと思います。
イベントを受け付けてPlaybookを実行するツールは ansible-rulebook(現時点ではまだDeveloper Preview) を使用します。

検証ストーリーとしては、Zabbixを使ってvCenterのVMを監視しVMが停止したら自動で復旧させてみようと思います。
具体的には以下のデモをご覧下さい。

項目 説明
画面左上 ansible-rulebookの実行ログ
画面右上 Ansible Automation Platform(AAP)のジョブ実行確認画面
画面左下 Zabbixの監視画面
画面右下 vCenterの画面

デモの処理の流れは以下の通りです。

環境

項目 バージョン
RHEL 8.6
Ansible Automation Platform(AAP) 2.2.1
Zabbix 6.2
vCenter/ESXi 7.0.0

今回は1ノードでAAP、Zabbix、ansible-rulebookの環境を作ってみようと思います。
Zabbixとansible-rulebookはコンテナ環境で動作させます。

環境準備

事前作業

RHELのfirewalldは停止しています。

以下のリポジトリを取得します。

Ansible Automation Platform(AAP)

インストール

以下からAAP 2.2をダウンロードします。

アーカイブを解凍します。

AAPをインストールするために inventory ファイルを修正します。

今回は1台のハイブリッドでインストールするため以下の箇所を修正します。

inventory ファイル修正後に setup.sh を実行してインストールを開始します。

AAPインストール後にブラウザで管理画面にアクセスおよびログイン後にサブスクリプションの割り当てを実行してください。

設定

プロジェクトを追加します。

項目 内容
名前 Sample Project
ソースコントロールのタイプ Git
ソースコントロールのURL https://github.com/sky-joker/advent-calendar-20221203.git

認証情報を追加します。

項目 内容
名前 vCenter
認証情報タイプ VMware vCenter
vCenter ホスト vCenterのホストまたはIPアドレス
ユーザー名 vCenterにログインするユーザー
パスワード vCenterにログインするユーザーのパスワード

ジョブテンプレートを作成します。

項目 内容
名前 仮想マシン起動メニュー
インベントリー Demo Inventory
プロジェクト Sample Project
Playbook playbooks/vmware_vm_powered_on.yml
認証情報 vCenter
起動プロンプト REST API経由でExtra Varsを受け取れるようにチェックを入れる

ジョブテンプレートを作成したらジョブテンプレートのIDを控えてください。
IDはansible-rulebookのコンテナをビルドする時に使用します。
IDはジョブテンプレートのURLに含まれています。

https://192.168.10.91/#/templates/job_template/11/details

上記の job_template/11 の 11 がIDになります。

トークンの取得

AAPのジョブテンプレートをREST APIで実行するためのトークンを作成してください。
ユーザーの トークン タブを選択して 追加 をクリックします。

範囲 を 書き込み にして 保存 をクリックします。

トークンが表示されるのでメモしてください。

ansible-rulebook

ルールについて

以下は今回の ansible-rulebook で実行するルールです。

上記は 5000 ポートでリッスンし power_state が down の文字列だった場合に samples.vmware.start_vm のPlaybookを実行します。
以下のJSONをPOSTすることで上記の条件にマッチし samples.vmware.start_vm が実行されます。

コンテナビルド

Zabbixからの通知を受け付ける ansible-rulebook のコンテナを作成します。
以下のコマンドを実行してコンテナをビルドします。

シークレット情報登録

AAPのREST APIを実行するためのトークをシークレットとして登録します。
以下のファイルにトークンをコピーしてください。

AAPトークン用のシークレットを作成します。

コンテナ起動

コンテナを起動します。
起動時に以下の環境変数を設定します。

環境変数 説明
AAP_HOST AAPのホスト名またはIPアドレス
JOB_TEMPLATE_ID 実行するジョブテンプレートのID

Zabbixコンテナ

docker-composeとpodman-pluginsインストール

Zabbixのコンテナは docker-compose を使って起動します。
そのため、podmanをdocker-composeに対応させます。

まずは、Pythonの venv を作成して有効化します。

docker-compose と podman-plugins をインストールします。

podman.socket サービスを起動します。

コンテナ起動

Zabbixのコンテナを起動させます。

起動後にブラウザから http://Zabbixコンテナを起動したホストのIPアドレス:8080 へアクセスして以下のアカウントでZabbixのログインページからログインします。

項目 内容
アカウント Admin
パスワード zabbix

Zabbixの設定の環境変数については以下を参照ください。

設定

Zabbixに監視対象を登録します。
ZabbixでVMwareの仮想マシンをSOAP経由で監視する場合は仮想マシンの instanceUuid が必要になります。
Zabbixの機能にあるディスカバリー機能を使えば自動で instanceUuid を取得して登録してくれますが、今回は手動で登録します。
以下のスクリプトをコピーして実行して instalceUuid をしてください。
スクリプトを実行するには pyVmomi が必要なためインストールします。

以下のコードをコピペして必要な部分を修正してください。

スクリプトを実行して instanceUuid を取得します。

instanceUuid 取得後にZabbixの 設定 の ホスト を開いて ホストの作成 をクリックします。
以下のように ホスト 設定をします。

項目 内容
ホスト名 取得したinstanceUuidを指定
表示名 VMの名前を入力
ホストグループ 何かしらのホストグループを設定
インターフェース 何かしらのインターフェースが無いと監視ができないのでエージェントを追加

マクロ タブを開いてvCenterの情報を登録した後に 追加 をクリックします。

項目 内容
{$URL} vCenterのURL
{$USER} vCenterのアカウント
{$PASSWORD} vCenterアカウントのパスワード

監視アイテムを登録します。
ここでは仮想マシンの電源状態を監視するための vmware.vm.powerstate アイテムキーを使用します。
登録したホストにある アイテム タブをクリックし アイテムの作成 をクリックします。
以下のように アイテム 設定をし 追加 をクリックします。

項目 内容
名前 アイテム名(ここでは Check Power State)
タイプ シンプルチェック
キー vmware.vm.powerstate[{$URL},{HOST.HOST}]
ユーザー名 {$USER}
パスワード {$PASSWORD}
監視間隔 10s

登録した監視アイテムでエラーが発生していないことを確認します。
また 最新データ などからデータが取得できているか確認します。

トリガーを登録します。
トリガー タブをクリックし トリガーの作成 をクリックします。
以下のように トリガー 設定をし 追加 をクリックします。

項目 内容
名前 トリガー名(ここでは VM Power Status)
条件式 最新のデータが0の場合

監視対象の仮想マシンが停止している場合はトリガー登録後に障害が発生していることを確認します。
障害が発生した場合は仮想マシンを起動してください。そうしないと、後述で設定する復旧ジョブが実行されてしまいます。

復旧用のスクリプトを登録します。
登録するスクリプトから sample-rulebook にリクエストを送付しAAPのジョブテンプレートを実行します。
管理 の スクリプト を開いて スクリプトの作成 をクリックします。
以下のように スクリプト を設定し 追加 をクリックします。

項目 内容
名前 スクリプト名(ここでは Recovery the power state of VM)
次で実行 Zabbixサーバ
コマンド 以下のコマンドを入力してください

コマンド

Zabbixサーバのコンテナには標準でcurlがインストールされていないのでwgetで対応します。
リクエストのJSONにある power_state は ansible-rulebook の条件です。
vm_name はAAPにExtra Varsとして渡される対象の仮想マシン名でZabbixのマクロから自動的に取得します。

障害時に実行する アクション を登録します。
設定 の アクション の トリガーアクション を開いて アクションの作成 をクリックします。
以下のように アクション を設定し 追加 をクリックします。

項目 内容
名前 アクション名(ここでは Recovery the power state of VM)
実行条件 EXAMPLEホストのVM Power Statusで障害が発生した時
実行内容 スクリプトで登録したコマンドを実行

これで準備が整いました。
仮想マシンの電源を停止して復旧するか確認してみましょう。

最後に

ansible-rulebookを使って復旧処理の受け付けや処理などを抽象化することで、関心事に役割を分離できシンプルな構成で運用できそうですね。
今後、どう進化していくか楽しみです 🙂

Happy Automation!!

参考

Leave a Reply

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください。