Exastro OASE でマッチポンプした話(Web+Zabbix構築編)

# 前回のおさらい

[前回][OASEインストール]は、Exastro OASE についての調査と1台のサーバ上にインストールをしました。

# Exastro OASE について(再掲)

<details><summary>もっと見る</summary><div>

## 1. Exastro OASE って何よ？

![システム連携](https://exastro-suite.github.io/oase-docs/asset/img/oase_overview_ja.png?v=2)

___「[Exastro OASE][公式ページ] はシステム運用の自立化・効率化・省力化を支援するためのOSSです。」___
とのことで、平たくいえば、システムの運用を楽チンにしてくれるOSSってことみたいです。
OASE の読み方は「オアゼ」です。

## 2. Exastro OASE って誰得なの？

障害発生時には、以下のような対応フローが多いと思います。

1. 監視システムによるアラート検知
2. インシデント・イベント起票
3. 一次切り分け
4. 暫定復旧作業
5. SEによる調査
6. 恒久対応
7. クローズ

問題が起こったときに、いかに迅速かつ確実に復旧できるかがポイントとなります。
OASE でできるのは、この「__3. 一次切り分け__」と「__4. 暫定復旧作業__」といった初期対応の部分です。
「__3. 一次切り分け__」と「__4. 暫定復旧作業__」を OASE により自動化することで、サービス復旧までの時間を短縮できます。
また、未知のインシデントが発生した場合は1次切り分けルールと暫定復旧のアクションを増やしていくことで、次第に運用者の対応が減っていくので運用コストを抑える効果も期待できます。

## 3. Exastro OASE の機能をざっくり見てみよう

もう少し OASE の機能について見てみます。

### 外部連携機能

![システム連携](https://exastro-suite.github.io/oase-docs/asset/img/oase_chain_image.png?v=2)

OASE は単体では機能しません。
監視機能を持ちませんし、障害発生時のアクションを実行する機能も持っていません。
代わりに、OASE は他のシステムと連携することで監視からアクションまでの一連の処理を実施します。

OASE の構成としては、主に

- 監視システムからのアラートを受け取る__監視アダプタ__
- 受け取ったアラートをルールに従って推論する__ディシジョンテーブル__
- 推論の結果を元にアクションをキックするための__ドライバ__

によって構成されています。

Ver. 1.2 までは監視ソフトウェアには ZABBIX、アクション部分の処理には Exastro IT Automation (ITA) と連携できたようですが、Ver. 1.3 からは Prometheus と連携できるようになったようです。今後この辺の連携機能も更に拡充されていくようです。

### テスト実行

![テスト実行](https://exastro-suite.github.io/oase-docs/asset/img/staging_confirmation.png?v=2)

障害が発生する度にルールを追加すると記載しましたが、本番環境にテストもせずにアクションを導入することは通常ありえません。
必ず検証環境などで事前にテストを行ってから導入すると思います。
OASE では、検証環境を内部に持っており、アラート検知からアクション実行までのテストを本番に影響を与えることなく実施可能です。
これにより、安心して継続的なルールの管理を行うことが可能となります。

</div></details>


# はじめに

本検証は、自らサーバに負荷を与える(着火する)ことでアラートを発生させ、OASE を使って暫定対応(消火)させるという、まさにマッチポンプ的検証なのである。笑

# 何をどう自動化するかを考える

## シナリオ

花輪さんは、本業の片手間に会社の __メディアサイトのシステム運用__ を任されています。
運用範囲は、__Web サーバ1台__ における OS・ミドルウェアの障害発生時の対応です。
運用と言っても、何もなければ特にすることはなく、何か問題が有ったときだけ対応を求められる仕事です。

普段は何事もないのですが、投稿された記事が SNS サイトなどで話題になると、__アクセスが急増し、Web アプリ が高負荷な状態となり、最終的には OS がハングアップ__ してしまいます。
こうなってしまうと、SSH ログインすらまともにできないような状況になるため、__社内の基盤担当に依頼__ をして、__OS の再起動__ をしてもらう必要があります。
しかし、OS を再起動しても、__アクセスが落ち着くまでは何度もハングアップが発生し、都度その対応が必要__ な状況です。

根本原因は __メモリ不足__ であることはわかっており、スケールアウトや __リソースの増強__ も検討していますが、技術的にも予算的にも __基盤側の対応は厳しい状況__ です。
また、__運用メンバーは花輪さん一人__ のため、本業ですぐに対応できない状況もしばしばあります。

## 方針を考える

### まずは、状況を整理してみよう

上のシナリオをまとめてみます。

|項目|内容|
|----|----|
|サービス内容|一般公開型のメディアサイト|
|問題点|高アクセスがあると OS がハングアップ|
|暫定対策|OSの再起動|
|根本原因|メモリ不足|
|恒久対策|リソース増強|

他にも、花輪さん個人の悩みとしては、本業があるのに、バズり対応のために __ちょくちょく手が止まってしまう__ といった問題があります。
また、基盤担当も何度も OS を再起動する必要がありますね。

### そこで __Exastro OASE__ さんの出番ですよ！

OASE を使ってどう解決していくかを考えていきましょう。

OASE は、ルールエンジンを内包していおり、ディシジョンテーブルにより管理されたルールを元に運用を自動化します。
ディシジョンテーブルとは、__条件(入力)__ とそれに対する __アクション(出力)__ からなる __ルール__ を網羅的にまとめたテーブルです。

今回の例における運用ルールは、

- OS がハングアップした場合(__条件__)、OS を再起動する(__アクション__)

のようになると思います。

ディシジョンテーブルを作成すると、下記のようになります。

||条件|アクション|
|----|:----:|:----:|
|Rules|OS がハングアップした場合||
|Rule1|Y|再起動を実行する|
|Rule1|N|何もしない|

### あー、これアカンわ...

OS がハングアップした状態では、SSH でログイン出来ないので、OS コマンドを使った「OSの再起動」は不可ですね。
(OS の外からの再起動であればできますが、花輪さんにはそういった OS 外の作業権限がありません)
ということで、ハングアップする前になんとかしちゃおうという方針に切り替えます。

修正後の運用ルールは、

- アクセス数が多い場合(__条件1__)、Sorry ページに切り替える(__アクション__)
- アクセス数が少ない場合(__条件2__)、元のページに切り替える(__アクション__)

といったところでしょうか。
処理の重い動的なページを、___Sorry ページ___ のような軽量な静的ページに切り替えることで、サーバのハングアップを回避しようというねらいです。
そして、修正版のディシジョンテーブルはコレ！

||条件1|条件2|アクション|
|----|:----:|:----:|:----:|
|Rules|アクセス数が多い場合|アクセス数が低い場合||
|Rule1|N|N|何もしない|
|Rule2|Y|N|___Sorry ページ___ に切り替える|
|Rule3|N|Y|元のページに切り替える|
|Rule4|Y|Y|___Sorry ページ___ に切り替える|

悩ましいのは、___Rule4___ の条件に対する処理です。
矛盾した条件ですが、Zabbix の監視上タイミングによってはどちらの状態も取り得る可能性があります。
この場合は、フェイルセーフの考えに基づき、「___Sorry ページ___ に切り替える」ようにしました。

# 環境構築

## システム構成

方針も決まったところで、今回のシステム構成を見ていきましょう。

![システム構成図.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1378538/e2de4409-c5da-4ae8-1fb5-b260e3a6dc4c.png)

## 登場人物の紹介

|サーバ|ホスト名|説明|
|----|----|----|
|Webサーバ|target-web|メディアサイトを公開するサーバ|
|監視サーバ|zabbix| Web サーバの監視を行う|
|OASEサーバ|exastro-oase|今回の主役。運用を自動化|
|ITAサーバ|exastro-ita|OASE からの API コールをトリガーにオペレーションを実行|

# 作業の流れ

1. 周辺環境構築
   1. 監視対象の Web サーバ構築
   2. Zabbix 環境構築
   3. Exastro IT Automation (ITA) 環境を構築
2. <font color="lightgray">ディシジョンテーブルの作成</font>
3. <font color="lightgray">Zabbix 監視アダプタの設定</font>
4. <font color="lightgray">Exastro IT Automation (ITA) ドライバの設定</font>
5. <font color="lightgray">ディシジョンテーブルのルール登録</font>
6. <font color="lightgray">動作確認</font>

本稿では、__1. 周辺環境構築__ を取り扱います。
__2. Zabbix 監視アダプタの設定__ 以降については、次回扱います。

# 本編スタート

前置きが長くなりましたが、ここから本検証の周辺環境を整えていきます。

## 1. 周辺環境構築

OASE サーバについては[前回][OASEインストール]やったので、省略します。
OASE サーバ以外の Web サーバ、監視サーバ、ITA サーバの構築を行っていきましょう。
Exastro Suite は、IT Automation (ITA) も OASE も RHEL 系の OS がシステム要件なので、今回は、全台 CentOS 8 で構築していきます。

|項目|Webサーバ|Zabbixサーバ|ITAサーバ|
|----|----|----|----|
|ホスト名|target-web|zabbix|exastro-ita|
|CPU(Cores)|1|1|1|
|メモリ|2GB|2GB|2GB|
|ディスク|20GB|40GB|40GB|
|OS|CentOS 8|CentOS 8|CentOS 8|
|アプリケーション|Apache, php-fpm|Zabbix 5.2|Exastro IT Automation 1.7.1|


### 1.1. 監視対象の Web サーバ構築

![システム構成図_Web.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1378538/a9ecb204-a0ee-3bf9-bf8d-4b3b754221ad.png)

監視対象となる Web サーバを構築していきます。
コンテンツの内容自体はどーでもいいですが、ページの表示に関して制御をしたいので、Apache + PHP で動的ページを作ります。

#### 構築手順

##### PHP 関連パッケージインストール

PHP の Web アプリケーションを実行するためにパッケージのインストールを行います。

```sh
# PHP 関連のパッケージのインストール
dnf install -y php php-mbstring php-xml php-xmlrpc php-gd php-pdo php-mysqlnd php-json
```

##### テストページを配置

__表示までに非常に時間が掛かるページ__ を想定したテストページを配置します。
GET パラメータに _time_ で指定した秒数分だけ表示を遅らせるプログラムとなります。
このプログラムにアクセスした分だけ処理を滞留させようというのがねらいです。

```sh
# テストページの配置
cat << '_EOF_' > /var/www/html/wait.php
<html>
 <head>
  <title>PHP Test</title>
 </head>
 <body>
 <?php
   $WAIT_TIME = $_GET["time"];
   sleep($WAIT_TIME);
   echo "<p>Hello World</p>";
 ?> 
 </body>
</html>
_EOF_

# テストページのパーミッションを変更
chown apache: /var/www/html/wait.php
```

##### Zabbix モニタリング用の設定

ステータス画面が表示できるように設定を入れます。
これは、Zabbix がリアルタイムに接続数を取得するためのものです。

```sh
# Apache の統計情報を表示させるアクセス数監視用の設定を投入
cat << _EOF_ > /etc/httpd/conf.d/status.conf 
ExtendedStatus On
<Location /server-status>
  SetHandler server-status
  # ↓必要に応じてアクセス制御を入れる
  # Require ip 127.0.0.1
</Location>
_EOF_
```

##### Zabbix エージェントの導入

```sh
# Zabbix リポジトリのインストール
rpm -Uvh https://repo.zabbix.com/zabbix/5.2/rhel/8/x86_64/zabbix-release-5.2-1.el8.noarch.rpm

# リポジトリのキャッシュを初期化
dnf clean all

# Zabbix エージェントのインストール
dnf -y install zabbix-agent

# Zabbix エージェント上のホスト名の変更
sed -i.org -e "s/^Hostname=.*$/Hostname=target-web/" /etc/zabbix/zabbix_agentd.conf

# Zabbix サーバのIPアドレスを設定
ZABBIX_IP=[ZabbixサーバのIPアドレス]
sed -i -e "s/^Server=.*$/Server=${ZABBIX_IP}/" /etc/zabbix/zabbix_agentd.conf
sed -i -e "s/^ServerActive=.*$/ServerActive=${ZABBIX_IP}/" /etc/zabbix/zabbix_agentd.conf
```

##### タイムアウト値のチューニング

デフォルトの設定では、1分程度でセッションが切断されるので、タイムアウト値を600秒(10分)まで伸ばします。

```sh
# Apache のタイムアウト値の変更
cp -pi /etc/httpd/conf/httpd.conf{,.org}
echo "Timeout 600" >> /etc/httpd/conf/httpd.conf

# PHP のタイムアウト値の変更
sed -i.org -e "s/^max_execution_time.*$/max_execution_time = 600/" /etc/php.ini 
```

##### サービスの(再)起動

サービスの自動起動設定と起動を行います。

```shell
# 各サービスの自動起動設定
systemctl enable httpd php-fpm zabbix-agent

# 各サービスの(再)起動
systemctl restart httpd php-fpm zabbix-agent
```

#### 動作確認

以下の確認は全てブラウザで行います。

##### Apache ステータス画面

Apache のステータス画面を確認してみましょう。

```http
http://[target-webのIPアドレス]/server-status
```

![2021-05-13-18-45-44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1378538/6b9d3349-ffad-71a6-c0a0-be0047d5ee9a.png)

> 1 requests currently being processed, 99 idle workers

と表示されています。
これは、このステータス画面にアクセスした分のリクエストが表示されているということです。

##### テストページ

テストページにパラメータ指定せずにアクセスしてみましょう。

```http
http://[target-webのIPアドレス]/wait.php
```

すぐに「___Hello World___」が表示されたはずです。
次に、パラメータに _time=30_ を設定してもう一度テストページにアクセスします。

```http
http://[target-webのIPアドレス]/wait.php?time=30
```

今度は、30秒後に「___Hello World___」が表示されたと思います。

##### リクエストの滞留確認

パラメータに _time=30_ でアクセスした後に _F5_ キーを9回連打します。

```http
http://[target-webのIPアドレス]/wait.php?time=30
```

このときに急いで Apache のステータス画面を見てみましょう。

```http
http://[target-webのIPアドレス]/server-status
```

すると、下記のようにリクエスト数が __11件__ と表示されたと思います。

![2021-05-13-18-47-06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1378538/7780c2b9-dcf1-0748-e9f8-73e55e5a6956.png)

> 11 requests currently being processed, 89 idle workers

これは、_wait.php_ の応答待ちのリクエスト 10 件 + _server-status_ へのアクセス 1 件分です。

これで Web サーバ側の下準備は完了しました。

### 1.2. Zabbix 環境構築

![システム構成図_Zabbix.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1378538/23f8c908-5679-f6ea-0d11-e553a40cda0e.png)

監視サーバとして Zabbix を構築していきます。
[公式のマニュアル][zabbixインストール]を参考にインストールします。

#### 構築手順

##### SELinux の無効化

石川サンゴメンナサイ

```sh
# 一時的に Permissive モードに変更
setenforce 0

# 恒久的に無効化
sed -i.org 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config
```

##### Zabbix リポジトリの登録とパッケージのインストール

Zabbix 公式リポジトリのインストールと Zabbix 関連パッケージをインストールします。

```sh
# Zabbix リポジトリのインストール
rpm -Uvh https://repo.zabbix.com/zabbix/5.2/rhel/8/x86_64/zabbix-release-5.2-1.el8.noarch.rpm

# リポジトリのキャッシュを初期化
dnf clean all

# Zabbix 関連パッケージのインストール
dnf -y install zabbix-server-mysql zabbix-web-mysql zabbix-apache-conf zabbix-agent
```

##### MySQL(MariaDB) のセットアップ

MySQL(MariaDB) 関連のパッケージのインストールとサービス起動をします。

```sh
# MySQL サーバのインストール
dnf -y install mariadb-server

# MySQL の自動起動を有効にしつつ即座に起動
systemctl enable --now mariadb
```

MySQL の初期設定をします。

```sh
mysql_secure_installation
```

基本はデフォルト値ですが、MySQL の root パスワードのみ ___password___ に設定します。

```sh
Enter current password for root (enter for none): (入力なしでエンター)
Set root password? [Y/n]: (入力なしでエンター)
New password: password
Re-enter new password: password
Remove anonymous users? [Y/n]: (入力なしでエンター)
Disallow root login remotely? [Y/n]: (入力なしでエンター)
Remove test database and access to it? [Y/n]: (入力なしでエンター)
Reload privilege tables now? [Y/n]: (入力なしでエンター)
```

Zabbix 用のデータベースとユーザを作成します。

|項目|値|
|----|----|
|DB名|zabbix|
|ユーザ名|zabbix|
|パスワード|zabbix|

```sh
# データベースの作成
mysql -uroot -p'password' -e "create database zabbix character set utf8 collate utf8_bin;"

# Zabbix ユーザのパスワードを設定
mysql -uroot -p'password' -e "grant all privileges on zabbix.* to zabbix@localhost identified by 'zabbix';"
```

データベーススキーマのインポートをします。

```sh
# データベーススキーマのインポート
zcat /usr/share/doc/zabbix-server-mysql*/create.sql.gz | mysql -uzabbix -p'zabbix' zabbix
```

##### Zabbix サーバの設定

Zabbix サーバの設定ファイルに DB のパスワードを設定します。

```sh
# Zabbix サーバの設定ファイルに DB のパスワードを設定
echo 'DBPassword=zabbix' >> /etc/zabbix/zabbix_server.conf
```

##### Zabbix サーバとエージェントの起動

Zabbix サーバとエージェントを(再)起動し、自動起動を有効にします。

```sh
# 各サービスの再起動
systemctl restart zabbix-server zabbix-agent httpd php-fpm

# 各サービスの自動起動を有効化
systemctl enable zabbix-server zabbix-agent httpd php-fpm
```

#### Zabbix の基本セットアップ

まずは、下記の URL から Zabbix にログインします。

```http
http://[ZabbixサーバのIPアドレス]/zabbix
```

##### ようこそ

言語設定は、英語 __English (en_GB)__ を選択します。
日本語に設定したい場合は、フォントをインストールする必要があります。
(フォントがない場合は入力内容が豆腐□になってしまいます。)

![2021-05-14-13-36-21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1378538/a2edeb77-c394-8895-5e85-e3f5095e51fc.png)

##### 前提条件のチェック

オール ___OK___ であることを確認します。

![2021-05-14-13-37-15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1378538/0070acb4-9b62-bc8f-ca25-1129aa89bea7.png)

##### データベース接続設定

データベース構築時に設定した値で設定します。

|項目|設定値|
|-----|-----|
|データベースタイプ|MySQL|
|データベースホスト|localhost|
|データベースポート|0|
|データベース名|zabbix|
|資格情報保存先|Plane text(プレーンテキスト)|
|ユーザ|zabbix|
|パスワード|zabbix|

![2021-05-14-13-39-32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1378538/6c9cc5a7-469f-d855-3365-b7c9c05541d0.png)

##### Zabbix サーバの詳細

デフォルトでいいです。

|項目|設定値|
|-----|-----|
|ホスト|localhost|
|ポート|10051|
|Name|zabbix server|

![2021-05-14-13-40-08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1378538/3788fcd2-6506-c79e-7011-0db5583d3452.png)

##### GUI設定

タイムゾーンはもちろん日本なので、___Asia/Tokyo___ に、デフォルトのテーマは、今の気分に合わせて ___Blue___ にしました。笑

![2021-05-14-13-42-35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1378538/d6dff89e-45a7-4831-96ee-b35df7302654.png)

##### インストール事前準備概要

内容を確認して問題なければ次に進みます。

![2021-05-14-13-43-18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1378538/0d32beb9-b8e4-0abc-dcae-c80350916a00.png)

##### インストール

これでインストール完了です。
___Finish___ ボタンを押して終了します。

![2021-05-14-13-43-54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1378538/86f66334-c577-e8d8-ffeb-e6f0bec3c2a1.png)

##### ログイン

早速 Zabbix にログインしましょう。
デフォルトの認証情報は下記のとおりです。

|ユーザ名|パスワード|
|----|----|
|Admin|zabbix|

![2021-05-14-13-44-41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1378538/fb45a694-ac77-64bf-fc14-a080fb844daa.png)

#### ホストの追加

監視対象の Web サーバを追加します。
左メニューから ___Configuration___ > ___Hosts___ をクリックします。
画面右上の ___Create host___ ボタンを押下します。

![2021-05-14-22-16-32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1378538/44cf6f02-3d0f-0c79-9cc6-609d13efd6b8.png)

##### ホスト情報の入力

下記の項目を設定します。それ以外はデフォルトです。

|項目|設定値|
|----|----|
|Host name|target-web|
|Groups|Linux servers|
|Interface - Type|Agent|
|Interface - IP address|Web サーバの IP アドレス|
|Interface - DNS name|target-web|
|Interface - Connect to|IP|
|Interface - Port|10050|

![2021-05-14-22-21-17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1378538/8281629a-44f2-bce7-e1c8-dd1e32c99c9d.png)

##### テンプレートの設定

上メニューから ___Templates___ をクリックします。
下記のテンプレートをリンクします。

|ホストグループ|テンプレート名|
|----|----|
|Templates/Applications|Apache by HTTP|
|Templates/Operating systems|Linux by Zabbix agent|

<details><summary>画面を見る</summary><div>

![2021-05-14-22-19-31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1378538/fa6b4663-4eab-ece5-4e6e-dff7ca616cd4.png)

![2021-05-14-22-18-03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1378538/8698d440-b6b8-9573-6667-505ad97b93f3.png)

![2021-05-14-22-18-56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1378538/d2b4dcd2-b3c7-ec4f-d970-4307db662bc6.png)

</div></details>

##### ホストの追加を実行

画面下の ___Add___ ボタンを押下します。

![2021-05-14-22-22-46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1378538/41dce34b-323b-f575-e411-62dd6edb2182.png)

#### コネクション数更新間隔の変更(1m => 5s)

ページの切り替わりを早くするために、監視の間隔を変更します。

|初期値|変更後|
|----|----|
|1m|5s|

左メニューから ___Configuration___ > ___Hosts___ をクリックします。
ホスト一覧から ___target-web___ を選択します。
上メニューの ___Items___ を選択します。
最後に ___Subfilter___ の一覧から ___Apache___ を選択します。

![2021-05-14-22-28-51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1378538/b7a932e8-b88b-7609-f9d1-3c299bd7c384.png)

___Apahce: Get status___ をクリックします。

![2021-05-14-22-29-23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1378538/b02d356b-2eb5-fec2-0eaf-b96793d058bc.png)

___Update interval___ の値を ___5s___ に設定し、5秒ごとに値を取得するように変更します。
その後、ページ下部の ___Update___ ボタンを押下します。

![2021-05-14-22-30-20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1378538/d940003c-1094-9ab5-8536-4947c08bf576.png)

#### 閾値(トリガー)の設定

次に、監視対象の Web サーバに対する監視ルールを入れていきます。

|メトリックス|閾値|
|----|----|
|コネクション数|20を超えた場合|
|コネクション数|11を下回った場合|

##### コネクション数閾値超え設定

上メニューの ___Triggers___ を選択します。
画面右上の ___Create trigger___ ボタンを押下します。

![2021-05-14-22-25-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1378538/7bcb5d3e-cde0-4101-2da7-5f5cf6c7cfd6.png)

下記の項目を設定します。それ以外はデフォルトです。

|項目|設定値|
|----|----|
|Name|More than 20 connections|
|Severity|Warning|
|Expression|{target-web:apache.workers_total.busy.last(#1)}>20|

![2021-05-20-15-58-29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1378538/e49813e5-1140-dc2e-9d98-193ce1644887.png)

##### コネクション数閾値下回り設定

画面右上の ___Create trigger___ ボタンを押下します。
下記の項目を設定します。それ以外はデフォルトです。

|項目|設定値|
|----|----|
|Name|Less than 11 connections|
|Severity|Information|
|Expression|{target-web:apache.workers_total.busy.last(#1)}<11|

![2021-05-20-16-06-29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1378538/07cbebd7-a8e6-998c-6145-928071e8e5fa.png)

##### ダッシュボードの設定(オプション)

ダッシュボードの追加手順の詳細は記載しませんが、ダッシュボードにグラフを表示しています。
___HTTP Connection count___ のグラフでは、前述の ___wait.php___ ページに対して 20 回を超えるアクセスで ___More than 20 connections___ トリガーが引かれ、11回を下回る箇所で ___Less than 11 connections___ のトリガーが引かれていることが確認できます。

![2021-05-20-16-12-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1378538/6b378600-9fca-4f91-e144-8cdf992d4b95.png)

<details><summary>設定画面を見る</summary><div>

##### 設定前のダッシュボード
 
![2021-05-14-22-33-37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1378538/05c10558-83e4-0d4d-92f1-8f8fd537c170.png)

##### データセット

![2021-05-14-22-35-45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1378538/ff0814c6-2b8b-3263-0fd8-ebabf437a916.png)

##### Problems

![2021-05-14-22-40-46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1378538/dc3b52d5-d59f-36fa-7548-e2f330431e7c.png)

##### 設定後のダッシュボード

![2021-05-20-16-12-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1378538/6b378600-9fca-4f91-e144-8cdf992d4b95.png)

</div></details>

### 1.3. Exastro IT Automation (ITA) 環境を構築

![システム構成図_ITA.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1378538/e91bbf37-b473-0108-8a58-87b5813aeedf.png)

本項では、高負荷が発生した場合に動的ページを静的な ___Sorry ページ___ に切り替えるアクションを構築していきます。

#### インストール

Exastro IT Automation (ITA) のインストール手順については、[この辺][ITAインストール]を参考にしてください。

#### ログイン

まずは、ITA の画面にログインします。
初期のログイン情報は下記となります。

|ユーザ名|パスワード|
|----|----|
|administrator|password|

![2021-05-18-11-22-34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1378538/fac93cd5-5405-c626-130a-fc0a975af929.png)

新パスワードを登録します。

![2021-05-18-11-33-43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1378538/ef986ba4-9381-e913-6c8a-4c367165e319.png)

#### 作業対象ホストの登録

___メインメニュー___ を開き、___メニューグループ___ 画面から ___基本コンソール___ を選択します。
左メニューの ___機器一覧___ をクリックします。
___登録___ アコーディオンメニューを開き、 ___登録開始___ ボタンを押下します。

![2021-05-18-11-38-49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1378538/f2d40ccb-0d91-45c5-7fcb-f078b9513b9a.png)

下記のように項目を設定します。(設定する項目のみ記載)

|項目|設定値|
|----|----|
|HW機器種別|SV|
|ホスト名|target-web|
|IPアドレス|(WebサーバのIPアドレス)|
|ログインユーザID|root|
|ログインパスワード - 管理|●|
|ログインパスワード - ログインパスワード|(rootユーザのパスワード)|
|Ansible利用情報 - Legacy/Role利用情報 - 認証方式|パスワード認証|

※本検証では、Webサーバに対して、パスワード認証で root ログイン可能な状況を想定しておりますが、鍵認証を使った操作も可能です。

![2021-05-18-11-48-14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1378538/c99e76c4-69e3-a656-c3c4-b5e1b0b37e9e.png)

入力が完了したら、___登録___ ボタンを押下します。

#### オペレーションの登録

左メニューの ___オペレーション一覧___ をクリックします。
___登録___ アコーディオンメニューを開き、 ___登録開始___ ボタンを押下します。

![2021-05-18-14-40-19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1378538/f7323652-038a-31d2-5c07-16a2bc9c3f20.png)

下記のように項目を設定します。(設定する項目のみ記載)

|#|オペレーション名|実施予定日|
|----|----|----|
|1|Sorryページ切り替え|適当な日付|
|2|Sorryページ戻し|適当な日付|

![2021-05-18-14-43-50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1378538/dce3a378-75b1-f9f5-168c-473c24f90ab6.png)

入力が完了したら、___登録___ ボタンを押下します。

#### コンテンツファイルのアップロード

##### コンテンツファイルの作成

事前に、下記のファイルを作成しておきます。

▼通常ページ

```php:wait.php.normal
<html>
 <head>
  <title>PHP Test</title>
 </head>
 <body>
 <?php
   $WAIT_TIME = $_GET["time"];
   sleep($WAIT_TIME);
   echo "<p>Hello World</p>";
 ?>
 </body>
</html>
```

▼Sorryページ

```php:wait.php.sorry
<html>
 <head>
  <title>PHP Test</title>
 </head>
 <body>
 Sorry. Please try again later.
 </body>
</html>
```

##### ファイル素材の登録

___メインメニュー___ を開き、___メニューグループ___ 画面から ___Ansible共通___ を選択します。
左メニューの ___ファイル管理___ をクリックします。
___登録___ アコーディオンメニューを開き、 ___登録開始___ ボタンを押下します。

![2021-05-18-14-48-08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1378538/ca7e7f83-106b-f0ea-6b7f-2f646d8850c9.png)

下記のように項目を設定します。(設定する項目のみ記載)
ファイルは上記で作成したものをアップロードします。

|#|ファイル埋込変数名|ファイル素材|
|----|----|----|
|1|CPF_wait_php_normal|wait.php.normal|
|2|CPF_wait_php_sorry|wait.php.sorry|

![2021-05-18-14-54-39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1378538/0c168ae6-5c00-31df-232f-709bfc55f575.png)

入力が完了したら、___登録___ ボタンを押下します。

![2021-05-18-14-55-55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1378538/f50197f6-6594-0378-88eb-ba55f0d4a15e.png)

#### Movement の登録

___メインメニュー___ を開き、___メニューグループ___ 画面から ___Ansible-Legacy___ を選択します。
左メニューの ___Movement一覧___ をクリックします。
___登録___ アコーディオンメニューを開き、 ___登録開始___ ボタンを押下します。

![2021-05-18-15-01-02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1378538/4296d029-3674-4d47-8808-a07d31697e07.png)

|#|Movement名|Ansible利用情報 - ホスト指定形式|
|----|----|----|
|1|Sorryページ切り替え|IP|
|2|Sorryページ戻し|IP|

![2021-05-18-15-04-18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1378538/e838c59e-2266-0e99-530e-8f6ca82336a5.png)

入力が完了したら、___登録___ ボタンを押下します。

![2021-05-18-15-05-06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1378538/1fb54e64-9c22-e0b8-78ce-451ec70fcb55.png)

#### Playbook 素材のアップロード

##### Playbook の作成

事前に、下記のファイルを作成しておきます。

▼通常ページに差し替え

```yaml:replace_content_to_normal.yml
- name: Replace NORMAL wait.php
  copy:
    src: "{{ CPF_wait_php_normal }}"
    dest: /var/www/html/wait.php
    owner: apache
    group: apache
    mode: 0644
    backup: yes
```

▼Sorryページに差し替え

```yaml:replace_content_to_sorry.yml
- name: Replace SORRY wait.php
  copy:
    src: "{{ CPF_wait_php_sorry }}"
    dest: /var/www/html/wait.php
    owner: apache
    group: apache
    mode: 0644
    backup: yes
```

##### Playbook 素材の登録

左メニューの ___Playbook素材集___ をクリックします。
___登録___ アコーディオンメニューを開き、 ___登録開始___ ボタンを押下します。

![2021-05-18-15-08-58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1378538/7362751b-2c3c-18d4-1685-299ed1ffcad1.png)

下記のように項目を設定します。(設定する項目のみ記載)
ファイルは上記で作成したものをアップロードします。

|#|Playbook素材名|Playbook素材|
|----|----|----|
|1|replace_content_to_normal|replace_content_to_normal.yml|
|2|replace_content_to_sorry|replace_content_to_sorry.yml|

![2021-05-18-15-12-47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1378538/7272ba5c-b1ac-4426-8cff-899e2652f2b6.png)

入力が完了したら、___登録___ ボタンを押下します。

![2021-05-18-15-13-07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1378538/847d6451-627d-556e-5726-d6fc83d78fd5.png)

#### Movement と Playbook の紐付け

左メニューの ___Movement-Playbook紐付___ をクリックします。
___登録___ アコーディオンメニューを開き、 ___登録開始___ ボタンを押下します。

![2021-05-18-15-17-50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1378538/20acac8f-a8f7-6458-84b2-1dce0909b2da.png)

下記のように項目を設定します。(設定する項目のみ記載)

|#|Movement|Playbook素材|インクルード順序|
|----|----|----|----|
|1|Sorryページ切り替え|replace_content_to_sorry|1|
|2|Sorryページ戻し|replace_content_to_normal|1|

![2021-05-18-15-20-09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1378538/2e3befc7-8f22-051c-6092-bfb8c87f3df8.png)

入力が完了したら、___登録___ ボタンを押下します。

![2021-05-18-15-21-31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1378538/80e5aa3f-fb56-e773-d32b-5c46bd6acab0.png)

#### 作業対象ホストの設定

左メニューの ___作業対象ホスト___ をクリックします。
___登録___ アコーディオンメニューを開き、 ___登録開始___ ボタンを押下します。

![2021-05-18-15-28-18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1378538/40f19e5d-b128-aecc-6004-7ae6f9544972.png)

下記のように項目を設定します。(設定する項目のみ記載)

|#|オペレーション|Movement|ホスト|
|----|----|----|----|
|1|Sorryページ切り替え|Sorryページ切り替え|target-web|
|2|Sorryページ戻し|Sorryページ戻し|target-web|

![2021-05-18-15-29-38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1378538/0da60868-ff11-b86b-2f77-5f29d64abc7b.png)

入力が完了したら、___登録___ ボタンを押下します。

![2021-05-18-15-30-05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1378538/a13b15c7-e654-36d4-0772-937106c41254.png)

#### Conductor の登録

___メインメニュー___ を開き、___メニューグループ___ 画面から  ___Conductor___ を選択します。
左メニューの ___Conductorクラス編集___ をクリックします。
下記の画像のように、_Conductor_ クラスを作成します。

▼ Webサーバ高負荷対応

![2021-05-18-15-39-25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1378538/d80fc06b-fd23-338f-335f-de99ff4f1403.png)

▼ Webサーバ高負荷戻し対応

![2021-05-18-15-41-02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1378538/4dddffcd-2ab5-8d5f-e02a-76e97b4969dc.png)

作成が完了したら、___登録___ ボタンを押下します。

![2021-05-18-15-05-06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1378538/63df5501-197d-8412-8eed-d20bb2c0f138.png)

#### 作業実行

##### 事前確認

事前に _wait.php_ にアクセスし、変更前の状態を確認しておきます。
この時、ページには「___Hello World___」と表示されているはずです。

##### Sorry ページヘの切り替え実行

_Conductor_ に、「___Webサーバ高負荷対応___」を選択し、オペレーションに 「___Sorryページ切り替え___」を選択します。

![2021-05-18-15-44-04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1378538/ed218211-d035-87ee-a19b-9f0d06d98c8b.png)

ITA のページに戻り、ページ下部の ___実行___ ボタンを押下します。

![2021-05-18-15-44-29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1378538/0b39994a-9c2d-b5d2-9550-b520cc68f244.png)

画像のように、実行が正常に完了すると ___DONE___ と表示されているはずです。

![2021-05-18-15-47-05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1378538/767903a1-f7b0-1a76-e8e4-2ec128e1e8d9.png)

##### ページ切り替えの確認

再度 _wait.php_ にアクセスします。
この時、ページの内容が「__Sorry. Please try again later.__」に切り替わっていれば成功です。

##### 元のページに切り戻し実行

同様にして、ページの戻し作業を実施してみましょう。
実行が正常に完了し、_wait.php_ の内容が「___Hello World___」に戻っていれば成功です。

![2021-05-18-15-51-33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1378538/a1e26318-5577-8159-605f-8d0205c4bb2b.png)

# まとめ

Exastro OASE を使うための想定シナリオを考えた。
また、そのシナリオに沿った検証を行うための下準備として、監視対象の Web サーバと Zabbix サーバの構築を行った。
さらに、コンテンツを切り替える仕組みとして Exastro IT Automation (ITA) に _Conductor_ を設定し、コンテンツの切り替えができることを確認した。

周辺環境整えるだけでしたが一苦労でした。。。

次回はついに OASE 開封の儀じゃよ！！
じゃぁの！ヽ(*・ω・)ノ

次回、[Exastro OASE でマッチポンプした話(活用編)][OASE活用編]に続く！

# 参考

- [第1回: Exastro OASE を最速でインストールする][OASEインストール]
- [第2回: Exastro OASE でマッチポンプした話(下準備編)][OASE下準備編]
- [第3回: Exastro OASE でマッチポンプした話(活用編)][OASE活用編]
- [Exastro IT Automationをインストールしてみた][ITAインストール]
- [Download and install Zabbix][Zabbixインストール]

[Zabbixインストール]:https://www.zabbix.com/download?zabbix=5.2&os_distribution=centos&os_version=8&db=mysql&ws=apache
[ITAインストール]:https://qiita.com/standsetx/items/54ff0786db151d980026
[OASEインストール]:https://qiita.com/wreath-vine/items/46b3838ce845bba9ae4e
[OASE下準備編]:https://qiita.com/wreath-vine/items/d916764885ea8169cdda
[OASE活用編]:https://qiita.com/wreath-vine/items/003bb12e7096ec9070cb