Contents
はじめに
本記事は 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は停止しています。
1 2 3 |
[root@homelab-1921681091 ~]# systemctl stop firewalld [root@homelab-1921681091 ~]# systemctl disable firewalld |
以下のリポジトリを取得します。
1 2 3 |
dnf install git?? [root@homelab-1921681091 ~]# git clone https://github.com/sky-joker/advent-calendar-20221203.git |
Ansible Automation Platform(AAP)
インストール
以下からAAP 2.2をダウンロードします。
アーカイブを解凍します。
1 2 |
[root@homelab-1921681091 ~]# tar zxvf ansible-automation-platform-setup-bundle-2.2.1-1.1.tar.gz |
AAPをインストールするために inventory
ファイルを修正します。
1 2 3 |
[root@homelab-1921681091 ~]# cd ansible-automation-platform-setup-bundle-2.2.1-1.1 [root@homelab-1921681091 ansible-automation-platform-setup-bundle-2.2.1-1.1]# vi inventory |
今回は1台のハイブリッドでインストールするため以下の箇所を修正します。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
(snip) [automationcontroller] 192.168.10.91 ansible_connection=local (snip) [all:vars] admin_password='redhat' (snip) pg_password='redhat' (snip) registry_username='Red Hatアカウント' # Execution Environment(EE)をダウンロードするためのアカウント registry_password='Red Hatアカウントのパスワード' (snip) |
inventory
ファイル修正後に setup.sh
を実行してインストールを開始します。
1 2 3 |
[root@homelab-1921681091 ansible-automation-platform-setup-bundle-2.2.1-1.1]# ./setup.sh [root@homelab-1921681091 ansible-automation-platform-setup-bundle-2.2.1-1.1]# cd ~/ |
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
で実行するルールです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
--- - name: Listen for events on a webhook hosts: all sources: - ansible.eda.webhook: host: 0.0.0.0 port: 5000 rules: - name: Run start_vm playbook condition: event.payload.power_state == "down" action: run_playbook: name: samples.vmware.start_vm |
上記は 5000
ポートでリッスンし power_state
が down
の文字列だった場合に samples.vmware.start_vm
のPlaybookを実行します。
以下のJSONをPOSTすることで上記の条件にマッチし samples.vmware.start_vm
が実行されます。
1 2 3 4 |
{ "power_state": "down" } |
コンテナビルド
Zabbixからの通知を受け付ける ansible-rulebook のコンテナを作成します。
以下のコマンドを実行してコンテナをビルドします。
1 2 3 4 5 6 7 |
(venv) [root@homelab-1921681091 ~]# cd ~/advent-calendar-20221203/ (venv) [root@homelab-1921681091 advent-calendar-20221203]# podman build . -t sample-rulebook:latest (snip) Successfully tagged localhost/sample-rulebook:latest (venv) [root@homelab-1921681091 advent-calendar-20221203]# podman images | grep sample-rulebook localhost/sample-rulebook latest 73cba05fc7f4 41 seconds ago 1.92 GB |
シークレット情報登録
AAPのREST APIを実行するためのトークをシークレットとして登録します。
以下のファイルにトークンをコピーしてください。
1 2 |
(venv) [root@homelab-1921681091 advent-calendar-20221203]# vi aap_secret.txt |
AAPトークン用のシークレットを作成します。
1 2 3 4 5 6 |
(venv) [root@homelab-1921681091 advent-calendar-20221203]# podman secret create AAP_SECRET aap_secret.txt 025547a5b3d461a38c889d79c (venv) [root@homelab-1921681091 advent-calendar-20221203]# podman secret ls ID NAME DRIVER CREATED UPDATED 025547a5b3d461a38c889d79c AAP_SECRET file 30 seconds ago 30 seconds ago |
コンテナ起動
コンテナを起動します。
起動時に以下の環境変数を設定します。
環境変数 | 説明 |
---|---|
AAP_HOST | AAPのホスト名またはIPアドレス |
JOB_TEMPLATE_ID | 実行するジョブテンプレートのID |
1 2 3 4 |
(venv) [root@homelab-1921681091 advent-calendar-20221203]# podman run -itd --name sample-rulebook --rm --secret AAP_SECRET,type=env --ip 10.88.0.99 --env 'AAP_HOST=192.168.10.91' --env 'JOB_TEMPLATE_ID=11' sample-rulebook:latest (venv) [root@homelab-1921681091 advent-calendar-20221203]# podman ps | grep sample-rulebook a32b62bcfb14 localhost/sample-rulebook:latest /bin/sh -c ansibl... 2 minutes ago Up 2 minutes ago sample-rulebook |
Zabbixコンテナ
docker-composeとpodman-pluginsインストール
Zabbixのコンテナは docker-compose
を使って起動します。
そのため、podmanをdocker-composeに対応させます。
まずは、Pythonの venv
を作成して有効化します。
1 2 3 4 |
[root@homelab-1921681091 ~]# python3 -m venv ~/venv [root@homelab-1921681091 ~]# . venv/bin/activate (venv) [root@homelab-1921681091 ~]# |
docker-compose
と podman-plugins
をインストールします。
1 2 3 |
(venv) [root@homelab-1921681091 ~]# pip install docker-compose (venv) [root@homelab-1921681091 ~]# dnf install -y podman-plugins |
podman.socket
サービスを起動します。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
(venv) [root@homelab-1921681091 ~]# systemctl enable podman.socket Created symlink /etc/systemd/system/sockets.target.wants/podman.socket → /usr/lib/systemd/system/podman.socket. (venv) [root@homelab-1921681091 ~]# systemctl start podman.socket (venv) [root@homelab-1921681091 ~]# systemctl status podman.socket ● podman.socket - Podman API Socket Loaded: loaded (/usr/lib/systemd/system/podman.socket; enabled; vendor preset: disabled) Active: active (listening) since Sat 2022-11-26 02:17:26 EST; 18s ago Docs: man:podman-system-service(1) Listen: /run/podman/podman.sock (Stream) CGroup: /system.slice/podman.socket Nov 26 02:17:26 homelab-1921681091 systemd[1]: Listening on Podman API Socket. |
コンテナ起動
Zabbixのコンテナを起動させます。
1 2 3 4 5 6 7 8 9 |
(venv) [root@homelab-1921681091 ~]# cd ~/advent-calendar-20221203/ (venv) [root@homelab-1921681091 advent-calendar-20221203]# export DOCKER_HOST=unix:/run/podman/podman.sock (venv) [root@homelab-1921681091 advent-calendar-20221203]# docker-compose up -d (snip) Creating advent-calendar-20221203_zabbix-db_1 ... done Creating advent-calendar-20221203_zabbix-server_1 ... done Creating advent-calendar-20221203_zabbix-web_1 ... done (venv) [root@homelab-1921681091 advent-calendar-20221203]# cd ~/ |
起動後にブラウザから http://Zabbixコンテナを起動したホストのIPアドレス:8080
へアクセスして以下のアカウントでZabbixのログインページからログインします。
項目 | 内容 |
---|---|
アカウント | Admin |
パスワード | zabbix |
Zabbixの設定の環境変数については以下を参照ください。
設定
Zabbixに監視対象を登録します。
ZabbixでVMwareの仮想マシンをSOAP経由で監視する場合は仮想マシンの instanceUuid
が必要になります。
Zabbixの機能にあるディスカバリー機能を使えば自動で instanceUuid
を取得して登録してくれますが、今回は手動で登録します。
以下のスクリプトをコピーして実行して instalceUuid
をしてください。
スクリプトを実行するには pyVmomi
が必要なためインストールします。
1 2 3 |
(venv) [root@homelab-1921681091 ~]# pip install pyvmomi (venv) [root@homelab-1921681091 ~]# vi advent-calendar-20221203/vmware_get_instanceUuid.py |
以下のコードをコピペして必要な部分を修正してください。
1 2 3 4 5 6 7 |
(snip) host = '名前解決ができるvCenterのホスト名またはIPアドレスに変更' username = 'vCenterのアカウントに変更' password = '上記パスワードに変更' vm_name = 'instanceUuidを取得したいVM名' (snip) |
スクリプトを実行して instanceUuid
を取得します。
1 2 3 4 |
(venv) [root@homelab-1921681091 ~]# chmod +x advent-calendar-20221203/vmware_get_instanceUuid.py (venv) [root@homelab-1921681091 ~]# ./advent-calendar-20221203/vmware_get_instanceUuid.py 501ea493-fbda-e01c-4ff5-7c1e228ab6bf |
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サーバ |
コマンド | 以下のコマンドを入力してください |
コマンド
1 2 |
wget --header='Content-Type: application/json' --post-data='{"power_state": "down", "vm_name": "{HOST.NAME}"}' -nv http://10.88.0.99:5000/endpoint |
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!!