Exastro OASE ITAメニュー連携機能を使ってみた

## はじめに

こちらの記事ではメッセージ抽出機能というものを用いていますが、現時点(2022/05/10)で最新のv1.6.0では新たにITAメニュー連携という機能が加わったようなのでそちらを用いてZabbixとの連携を行ってみます。


https://qiita.com/ooif/items/e59210044dddf4f5112b


Zabbixなどの監視ツールで障害発生アラートが出た際に、前もってExastro OASE・Exastro ITAと連携しておくと「ITAメニュー連携機能」によってアラートのピックアップから対処実行までを自動で行えるそうです。
サーバの運用などで同じケースの障害が頻発する場合、人手をかけず・手間をかけずに行える策になりそうなので、試しにやってみました。


Exastro OASEとは

OASE：Operation Autonomy Support Engine
「システム運用の自律化・効率化・省力化を支援するためのOSS」

[OASEコミュニティサイト](https://exastro-suite.github.io/oase-docs/index_ja.html)
[Exastro OASE を最速でインストールする](https://qiita.com/wreath-vine/items/46b3838ce845bba9ae4e)
[Exastro OASE クイックスタート (v1.3.0)](https://qiita.com/tak_paddy/items/733b3c411b5ec6ecf0dd)

Exastro ITAとは

ITA：IT Automation
「システム設定をデジタル化して一元管理するためのオープンソースのフレームワーク」

[ITAコミュニティサイト](https://exastro-suite.github.io/it-automation-docs/index_ja.html)
[Exastro IT Automationをインストールしてみた（v1.8.0）](https://qiita.com/standsetx/items/53553a0f78edc3097812)
[Exastro IT Automation クイックスタート (ver1.8.0)](https://qiita.com/y-masaya3210/items/68920237c03e5d4f4776)

## ITAメニュー連携機能とは

公式のマニュアルによりますと
「ITAのパラメータシートと連携して、指定したSymphonyまたはConductorに対して作業を実行できます。」
とありますが、ここです。
メッセージ抽出定義機能では、監視ツールのメッセージから値を取得していましたが、監視ツールのメッセージ内容に左右されずに、こちらの任意の値をITAと連携することができる機能のようです。

この機能を使うメリットとしては、以下が挙げられます。

**メリット**

- 可変の情報（変数）をITAに連携できる。
- 監視ツールのアラートの内容ごとに、実行したい対処の値を記載し、連携することができる。

以下の課題があるとします。

**課題**
監視ツールの障害メッセージを受け取り、障害メッセージの内容に沿った対処を自動で行いたい。

これにITAとOASEを使用すると、下図のような連携プレーが可能になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2363269/c28c2b98-2dc2-08bb-12d2-9def2253923d.png)

**役割**

- **監視ツール（Zabbixなど）** ：障害を検知してメッセージを発出
- **OASE** ：監視ツールから発出された障害メッセージをトリガーとし、ITAのパラメータシートを用いて実行したい対処に必要な任意のパラメータをITAに連携する。
- **ITA** ：パラメータを受け取り、対処実行

今回は以下のシナリオでこのITAメニュー連携機能（を使った連携プレー）を実行してみます。

## シナリオ
こういうシナリオを設定しました。
下記は今回の構成を図に起こしたものです。
![kousei.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2363269/398d8c1a-f5c4-c56e-6c90-d767b74f5a42.png)
**シナリオ**
監視対象サーバではwebサービスを提供している。ある時、この監視対象サーバのwebサービスに対して大量のアクセスがあり、webサービスがダウンしてしまったため、ログを収集し、原因の特定をする必要がある。
この時、ApacheサービスとDBのサービスがダウンしていて、この監視対象サーバを監視しているZabbixには、サービスがダウンするとアラートが上がる設定になっており、今はApacheとDBのサービスがダウンしたとのアラートが上がっている。
今までの運用では、アラートの確認からログの収集までを人の手で行っていたが、今回試す構成を取ることによりこの作業が自動化でき、対応にかかる作業を減らすことができるようになる。


このシナリオが実行できるような設定を行っていき、実際に最後にサービスを落として動作確認を行っていきます。

## 1.　各種サービス構築
こちらの記事がわかりやすいので参考にしてください。

OASE・ITAの構築

https://qiita.com/nanasi-ym/private/8b1b0369fbd1ae538825



## 2.　Zabbixの設定
まずはZabbixまわりの設定を行っていきます。
図でいうとこちら。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2363269/62477196-2495-65e8-d5b2-cb57a2c6b753.png)

※ Linux版の操作説明となります。


### 2-1　docker-compose版Zabbixの構築

この作業では/tmp配下で作業を行います。

次のコマンドでzabbix公式のdocker-composeの資材をDLします。

```sh
git clone https://github.com/zabbix/zabbix-docker.git -b 5.0
```

次にファイル名を修正し、dokcer-compose.yamlを作成します。今回は次のようにしました。

```sh
# ディレクトリを移動
cd zabbix-docker
# ファイル名を変更してコピー
cp -p docker-compose_v3_centos_pgsql_latest.yaml docker-compose.yaml
```

次にOASEがZabbixと通信が行えるようにするためにdocker-compose.override.yamlを先ほどのdocker-compose.yamlと同じディレクトリに作成します。内容は次の通りです。

<details><summary>docker-compose.override.yaml</summary>

```yml:docker-compose.override.yaml
version: '3.5'
services:

  zabbix-server:
    networks:
      - oase-monitoring

  zabbix-proxy-sqlite3:
    networks:
      - oase-monitoring

  zabbix-proxy-mysql:
    networks:
      - oase-monitoring

  zabbix-web-apache-pgsql:
    networks:
      - oase-monitoring

  zabbix-web-nginx-pgsql:
    networks:
      - oase-monitoring

  zabbix-java-gateway:
    networks:
      - oase-monitoring

networks:
  oase-monitoring:
    external: true
```
</details>

その次にOASEがアラートを取得できるようにnginx.confを少し書き換えます。
次のようなdiffの結果となれば成功です。

```sh
cp -pi Dockerfiles/web-nginx-pgsql/centos/conf/etc/zabbix/nginx.conf Dockerfiles/web-nginx-pgsql/centos/conf/etc/zabbix/nginx.conf.bk

vi Dockerfiles/web-nginx-pgsql/centos/conf/etc/zabbix/nginx.conf

diff Dockerfiles/web-nginx-pgsql/centos/conf/etc/zabbix/nginx.conf Dockerfiles/web-nginx-pgsql/centos/conf/etc/zabbix/nginx.conf.bk
11c11
<     set $webroot '/usr/share';
---
>     set $webroot '/usr/share/zabbix';
68,69c68
<         fastcgi_read_timeout 601;
---
>         fastcgi_read_timeout {FCGI_READ_TIMEOUT};
```

次に起動時に先ほど書き換えたnginx.confを読み込むようにdocker-compose.yamlに次のように追加しましょう。

```Dockerfile:docker-compose.yaml
# 中略
zabbix-web-nginx-pgsql:
  image: zabbix/zabbix-web-nginx-pgsql:centos-5.0-latest
  ports:
   - "80:8080"
   - "443:8443"
  volumes:
   - /etc/localtime:/etc/localtime:ro
   - /etc/timezone:/etc/timezone:ro
   - ./zbx_env/etc/ssl/nginx:/etc/ssl/nginx:ro
   - ./zbx_env/usr/share/zabbix/modules/:/usr/share/zabbix/modules/:ro
   # この一行を追加する
   - ./Dockerfiles/web-nginx-pgsql/centos/conf/etc/zabbix/nginx.conf:/etc/zabbix/nginx.conf:ro
#   - ./env_vars/.ZBX_DB_CA_FILE:/run/secrets/root-ca.pem:ro
#   - ./env_vars/.ZBX_DB_CERT_FILE:/run/secrets/client-cert.pem:ro
#   - ./env_vars/.ZBX_DB_KEY_FILE:/run/secrets/client-key.pem:ro
  deploy:
   resources:
    limits:
      cpus: '0.70'
      memory: 512M
    reservations:
      cpus: '0.5'
      memory: 256M
  env_file:
   - ./env_vars/.env_db_pgsql
   - ./env_vars/.env_web
  secrets:
   - POSTGRES_USER
   - POSTGRES_PASSWORD
  depends_on:
   - postgres-server
   - zabbix-server
  healthcheck:
   # ここを下記のように書き換える
   test: ["CMD", "curl", "-f", "http://localhost:8080/zabbix"]
   interval: 10s
   timeout: 5s
   retries: 3
   start_period: 30s\
# 以下略

```

これらの作業を終えたら実際に起動します、次のコマンドを実行してみましょう。

```sh
docker-compose --profile full up -d
```

```sh
docker-compose ps

NAME                                     COMMAND                  SERVICE                  STATUS                PORTS
zabbix-docker-db_data_pgsql-1            "sh"                     db_data_pgsql            exited (0)
zabbix-docker-postgres-server-1          "docker-entrypoint.s…"   postgres-server          running
zabbix-docker-zabbix-agent-1             "/usr/bin/tini -- /u…"   zabbix-agent             running
zabbix-docker-zabbix-java-gateway-1      "docker-entrypoint.s…"   zabbix-java-gateway      running               0.0.0.0:10052->10052/tcp, :::10052->10052/tcp
zabbix-docker-zabbix-server-1            "/usr/bin/tini -- /u…"   zabbix-server            running               0.0.0.0:10051->10051/tcp, :::10051->10051/tcp
zabbix-docker-zabbix-snmptraps-1         "/usr/sbin/snmptrapd…"   zabbix-snmptraps         running               0.0.0.0:162->1162/udp, :::162->1162/udp
zabbix-docker-zabbix-web-nginx-pgsql-1   "docker-entrypoint.sh"   zabbix-web-nginx-pgsql   running (healthy)   0.0.0.0:80->8080/tcp, 0.0.0.0:443->8443/tcp,:::80->8080/tcp, :::443->8443/tcp
```

### 2-2 zabbix-agentのインストール
監視対象サーバにzabbix-agentをインストールし、Zabbixが情報を取ってこれるようにします。

こちらを参考にしました。
[zabbix-agentのインストール](https://www.site24x7.jp/blog/zabbix-instoll-agent/)

またDBのプロセス監視を行うための設定を追加しておきます。こちらを参考に追加しました。

[zabbix-agentの設定](https://git.zabbix.com/projects/ZBX/repos/zabbix/browse/templates/db/mysql_agent?at=release/5.0)

### 2-3　ホスト登録
監視対象サーバを登録します。

次のURLにアクセスしてログインしましょう。
一度リダイレクトされる場合がありますので、その場合はURLの **:8080** を削除してアクセスし直してみてください。

|項目名|値|
|:-----------|:-----------|
|URL|http://\<IPアドレスまたはホスト名\>/zabbix|
|ユーザ名|Admin|
|パスワード|zabbix|

①左メニューから **設定 ＞ ホスト** をクリック。
②画面右上の［ホストの作成］ボタンをクリック。
![図10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/794820/97144cac-f002-cdc1-26e7-07d25bd17931.png)

③ホストの登録画面が出るので、下記の項目を入力します。それ以外はデフォルトでOKです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2363269/cec4b5af-2e61-5e3a-ad57-09024df2af69.png)


※ お使いの環境に応じて入力してください。

|項目|設定内容(一例)|
|:-----------|:-----------|
|**ホスト名**|oase-target01|
|**グループ**|Linux servers|
|**インターフェース　タイプ**|エージェント|
**インターフェース　IPアドレス**|192.168.161.69|
|**インターフェース　DNS名**|oase-target01|
|**インターフェース　接続方法**|IP|
|**インターフェース　ポート**|10050|

④上メニューから **テンプレート** をクリック。
下記のテンプレートにチェックを入れ、選択をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2363269/c8ee8166-5e82-ff53-e622-51d57edf0121.png)



|ホストグループ|テンプレート名|
|:-----------|:-----------|
|**Templates/Applications**|Template App Apache by Zabbix agent|
|**Templates/Databases**|Template DB MySQL by Zabbix agent|

⑤画面下の［追加］ボタンをクリックしてホスト登録完了。

DBのテンプレートも同じように設定します。

これで完了！

## 3.　ITAの設定
ITAまわりの設定を行っていきます。
図でいうとこちらの部分です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2363269/575c7521-9479-6150-54a8-539c21efe981.png)


### 3-1　ロール・ユーザ紐付け
ITAには**oaseアクション**というロールがデフォルト登録されており、OASEとの連携で使用するメニューへのアクセス権が色々と付与されています。
![図60.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/794820/b99a27a6-857a-28ef-eb60-6978032693ef.png)
ただし、そのoaseアクションロールにユーザが紐付いていないので、**oase**ユーザを新規登録し、その後oaseアクションロールにoaseユーザを紐付けます。

①**oase**ユーザの登録
**管理コンソール ＞ ユーザ管理** から
![図31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/794820/78bf0c07-850b-ba4b-e854-04b42436d651.png)
以下の部分を入力。
![図30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/794820/a806a1fc-1703-6045-6a56-fbd191c6dedf.png)

|ログインID|ログインPW|ユーザ名|
|:-----------|:-----------|:-----------|
|oase|******（任意）|oase|

［登録］ボタンをクリックして完了。

②**oase**ユーザと**oaseアクション**ロールの紐付け
**管理コンソール ＞ ロール・ユーザ紐付管理** から
![図32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/794820/9772795d-e2da-691e-7574-eb4feb0a3685.png)
以下のように選択。
![図33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/794820/14127ba9-6ca2-95b6-7a51-eecf4da2cf04.png)

|ロール|ユーザID:ログインID|
|:-----------|:-----------|
|oase|oase|

［登録］ボタンをクリックして完了。

### 3-2　ホスト登録
監視対象サーバを登録します。

メニュー **基本コンソール ＞ 機器一覧** から
![図13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/794820/c086789c-c4cc-65f3-4de2-cd5e3d11823a.png)

以下の部分を入力。
![図14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/794820/89427163-9414-04b0-a5c2-1c903cfaebde.png)
※ お使いの環境に合わせて入力してください。

| HW機器種別 | ホスト名 | IPアドレス | ログインユーザID | ログインパスワード ＞ 管理 | ログインパスワード ＞ ログインパスワード | Ansible利用情報 ＞ Legacy/Role利用情報 ＞ 認証方式 |
|:-----------|:-----------|:-----------|:------|:------|:------|:------|
| SV | oase-target01| 192.168.161.69|root |●|xxxxxx|パスワード認証|
| SV | oase-log-server| 192.168.161.9|root |●|xxxxxx|パスワード認証|

［登録］ボタンをクリックして完了。


### 3-3　Conductorの作成
MovementにPlaybookを紐付けて、そのMovementを内包するConductorを作成します。

<details><summary>Movementとは</summary>
ITAで作成できる自動作業の最小単位。ジョブ。
今回は2つ作成します。

![図63.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/794820/08a7da75-6665-96ef-a5ef-d937c0a7f620.png)</details>

<details><summary>Conductorとは</summary>1つ以上のMovementの組み合わせから成るジョブフロー。ひとつのMovementが実行完了したら自動的に次のMovementを実行する、汎用手順書のようなものです。
今回のようにMovement1つの場合、ITA上ではConductorを作成せずにMovement単体で実行することが可能ですが、OASEと連携する場合はOASE側でITAのConductorIDを指定するため、Conductorの作成はマストとなります。

![図62.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/794820/03c2e1e6-d859-ea16-622a-04c6dd40572a.png)</details>

①Movementの登録
メニュー **Ansible-Legacy ＞ Movement一覧** から


![図15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/794820/8e2db15a-60f9-c677-b767-4ccd9713867b.png)
以下の部分を入力。
![図16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/794820/4d279970-a925-081e-8a3e-d1bf048150d9.png)

| Movement名 | Ansible利用情報 ＞ ホスト指定形式 |
|:-----------|:-----------|
| ログ収集 | IP |
| ログ送信 | IP |

［登録］ボタンをクリックして完了。


②Playbookの登録
以下2つのPlaybookをテキストエディタで作成します。
（変数でパスとファイルを指定し、指定されたファイルをlocal(ITAが載っているコンテナ)に収集する内容）

```yml:fetch_logfile.yml
- name: Create datetime.
  shell: date "+%Y%m%d%H%M%S"
  register: datetime
- name: Fetch the log file messages
  fetch: src="{{ item.1 }}{{ item.2 }}" dest=/tmp/{{ item.0 }}_{{ item.2 }}.{{ datetime.stdout }} flat=yes
  with_together:
    - "{{ VAR_HOST }}"
    - "{{ VAR_PATH }}"
    - "{{ VAR_FILE }}"
```

(上記のplaybookで取得したログをログ格納サーバに転送し、収集したログファイルを消去する内容)

```yml:send_logfile.yml
- name: Create datetime.
  shell: date "+%Y%m%d%H%M%S"
  register: datetime
- name: Old log send to Backup server
  copy: src="{{ item }}" dest=/share/oase/logs/
  with_fileglob:
    - "/tmp/*"

- name: Delete temp log file.
  file:
    path: "{{ item }}"
    state: absent
  with_fileglob:
    - "/tmp/*"
  delegate_to: localhost
```


メニュー **Ansible-Legacy ＞ Playbook素材集** から
![図18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/794820/a05b4572-d827-aefa-c118-cb428d9eeec3.png)
以下の部分を入力。
![図17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/794820/aafbac16-b13e-a288-3d84-3163532c55bb.png)

|Playbook素材名 | Playbook素材 |
|:-----------|:-----------|
| ログ収集 | ログ収集 |
| ログ送信 | ログ送信 |

Playbook素材の［事前アップロード］ボタンをクリックしてから［登録］ボタンをクリックして完了。

③MovementとPlaybookの紐付け
①②で登録したMovementとPlaybookを紐付けます。

メニュー **Ansible-Legacy ＞ Movement-Playbook紐付** から
![図19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/794820/6259d607-159e-f05c-819a-8b44ee7011b5.png)
以下の部分を入力。
![図20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/794820/1d5be1fc-07f6-7750-d748-68a83472a232.png)

|Movement | Playbook素材 | インクルード順序 |
|:-----------|:-----------|:-----------|
| ログ収集 | ログ収集 | 1 |
| ログ送信 | ログ送信 | 1 |


<details><summary>インクルード順序とは</summary>
今回のシナリオでは１つのMovementに対して1つのPlaybookを紐付けましたが、１つのMovementに対して複数のPlaybookを紐付けることもできます。その場合、処理が実行される順番をインクルード順序で指定します。

![図23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/794820/255f1cda-cb50-c2c4-cbc1-bc877c9bdc75.png)
</details>

［登録］ボタンをクリックして完了。

④オペレーションの設定と作業対象ホストの設定
次のConductorクラス編集のために必要なオペレーションの設定と作業対象ホストの設定を行っていきます。

まずオペレーションの設定を行います。
メニュー **基本コンソール ＞ オペレーション一覧** から
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2363269/ae192f9b-0166-9004-9c20-f1a0843948de.png)

登録タブの登録開始を選択し、以下の部分を入力します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2363269/bacf524d-df75-d5c2-840c-f776a2383dd7.png)

|オペレーション名|実施予定日|
|:-----------|:-----------|
| ログ送信 |設定時の日時を記入|

登録ボタンを押して完了です。

次に作業対象ホストの設定を行います。
メニュー **Ansible-Legacy ＞ 作業対象ホスト** から
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2363269/a89bc24b-3e91-45f8-02f4-baf1b3ee9a96.png)

登録タブの登録開始を選択し、下記の内容を登録します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2363269/dc22e895-4584-b6a7-4d0d-de551864fa40.png)

|オペレーション|Movement|ホスト|
|:-----------|:-----------|:-----------|
| 1:ログ送信 |ログ送信|2:oase-log-server|

登録ボタンを押して完了です。

⑤Conductorクラス編集
Movementを実行するConductorを作成します。

メニュー **Conductor ＞ Conductorクラス編集** から
![図21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/794820/4fe611a6-bdb8-bede-c14b-03f9e41eb1bc.png)
右下に表示されているMovementをキャンバスにドラッグ＆ドロップしし、各ノードのOUT－INをドラッグしてつなげる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2363269/7d32035c-07dc-dea7-b93a-4fa823bedb60.png)

図のようにできたら登録を押して登録をします。

次にもう一つ作成しますが、先ほどのConductorを中で実行するためにCodnductorcallというものを使います。まずは下図のように作成し、

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2363269/8e9f8e92-04b1-f56f-63d7-f91d2a74cdce.png)

次に右下のfunctionタブからConductorCallを選択し、先に作成しておいたログ送信のConductorとログ送信のオペレーションを選択、各ノードをつなげる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2363269/b51cda0f-6ea6-c91e-0f04-127a30805880.png)

Conductor名称を入力して［登録］ボタンをクリックして完了。

|Conductor名称|
|:-----------|
| ログ送信 |
| ログ収集 |

### 3-4　パラメータシートの作成と代入値自動登録設定
パラメータシートを作成して、Playbookの変数{{ VAR_HOST }}、{{ VAR_PATH }}、{{ VAR_FILE }}と紐づけていきます。


①パラメータシートの作成
**メニュー作成 ＞ メニュー定義・作成** から
![図24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/794820/9de689d6-aee3-e6b1-916d-3b586aacde9c.png)
以下の部分を入力します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2363269/18ccdbe0-e45a-025d-e26a-95b8344a1ba2.png)


|メニュー名|作成対象|表示順序|項目名|入力方式|最大バイト数|
|:-----------|:-----------|:-----------|:-----------|:-----------|:-----------|
|ログ収集|パラメータシート（ホスト/オペレーションあり）|1|host|文字列（単一行）|256|
|同上|パラメータシート（ホスト/オペレーションあり）|同上|dir|文字列（単一行）|256|
|同上|パラメータシート（ホスト/オペレーションあり）|同上|file|文字列（単一行）|256|


今回は縦メニュー連携を利用するため、縦メニュー連携利用にチェックを入れます。
その後、図の上にあるリピートを選択し各要素をリピートの要素の中に入れ、青枠で囲った部分のREPEATを2に設定します。

※ 他はデフォルトのままでOKです。

［作成］ボタンをクリックして完了。

<details><summary>縦メニュー連携とは</summary>
ITAの縦メニュー機能を利用した連携方法。
この機能を使用すると、同じような対処をする場合に一つのplaybookで同時にパラメータの異なる対処を行うことが可能となる連携方法。


</details>

作成できているか確認します。
入力用メニューグループの中に「ログ収集」メニューが作成されていて、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2363269/f40f2f7c-948d-e597-ec76-3f065f3d18ee.png)


［登録開始］ボタンをクリックすると［host］［dir］［file］項目が作成されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2363269/4839eb25-a920-a25c-d2c7-a8318ef36f6e.png)


これでOKです。

②代入値自動登録設定
**Ansible-Legacy ＞ 代入値自動登録設定** から
![図29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/794820/91807aea-070c-963e-360e-ca621502080f.png)
以下の部分を入力。
![図28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/794820/181f2adc-4805-2f8f-c9dd-c5d6446720f5.png)

1つ目
|パラメータシート（From） ＞ メニューグループ:メニュー|パラメータシート（FROM） ＞ 項目|認証方式|IaC変数（To） ＞ Movement|IaC変数（To） ＞ Value変数 ＞ 変数名|IaC変数（To） ＞ Value変数 ＞ 代入順序|
|:-----------|:-----------|:-----------|:-----------|:-----------|:-----------|
|代入値自動登録用:ログ収集|パラメータ/host|Value型|ログ収集|VAR_HOST|1|
|代入値自動登録用:ログ収集|パラメータ/dir|Value型|ログ収集|VAR_PATH|1|
|代入値自動登録用:ログ収集|パラメータ/file|Value型|ログ収集|VAR_FILE|1|
|代入値自動登録用:ログ収集|パラメータ/host[2]|Value型|ログ収集|VAR_HOST|2|
|代入値自動登録用:ログ収集|パラメータ/dir[2]|Value型|ログ収集|VAR_PATH|2|
|代入値自動登録用:ログ収集|パラメータ/file[2]|Value型|ログ収集|VAR_FILE|2|


上の行に書いてある **パラメータシート（From）→IaC変数（To）** を見ればわかりやすいです。どのメニューのどのカラムを → どのMovementのどの変数に代入するか　ということですね。

［登録］ボタンをクリックして完了。

これでITAの設定ができました！

### 補足　メニューID・Conductor名称の確認
OASEがITAにデータ受け渡しする際、ITAの **メニューIDとConductor名を指定する** 必要があります。後ほどOASE設定の際に必要になってくるので、この時点でIDと名前をメモしておくといいです。

<details><summary>メニューIDの確認</summary> 

**管理コンソール ＞ メニュー管理** から［フィルタ］をクリックして［一覧/更新］を表示。
［メニューID］カラムの番号を確認します。

![図73.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/794820/d76d522e-a6d7-2f51-c630-daf626eb7f3c.png)</details>

<details><summary>Conductor名称の確認</summary>

**Conductor ＞ Conductorクラス一覧**から［一覧］を表示。
［Conductor名称］カラムを確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2363269/466c6014-765c-bbd7-d185-b132ec8c43bb.png)

</details>


## 4.　OASEの設定
OASEまわりの設定を行っていきます。
図でいうとこちらです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2363269/402608f9-58b1-8587-20ee-dd25fc057694.png)

ディシジョンテーブルを作成
↓
Zabbixアダプタの設定
↓
ITAドライバの設定
↓
ディシジョンテーブルにルールを登録
という流れになります。

### 4-1　ディシジョンテーブルの作成
ディシジョンテーブルを作成します。
ITAでパラメータシートを作ったときのように、まずはテーブル自体を作る作業です。

上部メニュー **ルール ＞ ディシジョンテーブル** から、右上の［新規追加］ボタンをクリックして
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2363269/812c4ab9-b000-8a88-d112-75278bfc383c.png)

以下の部分を入力。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2363269/265d27b5-f949-668e-e470-b9578d939ffc.png)



**基本情報・権限**

|項目名|入力内容|
|:-----------|:-----------|
|**ディシジョンテーブル名**|ITAメニュー連携機能検証|
|**権限の設定　システム管理者**|すべて更新可能にする（※）|

※ うっかり「権限なし」にすると、せっかく作ったディシジョンテーブルが表示されなくなるので注意。

**条件式**

|条件名|条件式|
|:-----------|:-----------|
| ホスト名 | 正規表現に一致する |
| アラート | 等しい(文字列) |

**未知事象通知**

|項目名|入力内容|
|:-----------|:-----------|
|**未知事象通知**　|通知しない|

［保存］ボタンをクリックして完了。

### 4-2　Zabbixアダプタの設定
Zabbixへの接続設定です。

上部メニュー **システム ＞ 監視アダプタ** から右上の［監視先の追加］ボタンをクリックして
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2363269/34b733e0-0a39-f886-05c1-11914bd1d923.png)

［ZABBIX Adapter ver1］を選択し以下の部分を入力。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2363269/070fadc0-b104-35cf-35b9-493332299584.png)

※ お使いの環境に応じて入力してください。

|項目名|入力内容|
|:-----------|:-----------|
|**名前**|oase-monitoring|
|**プロトコル**|http|
|**ホスト/IP**|zabbix-web-nginx-pgsql|
|**ポート**|8080|
|**ユーザ名**|Admin（ZabbixのWeb画面のログインユーザ名）|
|**パスワード**|********（上記ユーザのパスワード）|
|**ディシジョンテーブル名**|ITAメニュー機能検証|

**突合情報**
先ほどディシジョンテーブルに登録した条件名が表示されるので、それぞれ対応するZabbixの項目名を指定します。

|条件名|Zabbix項目|
|:-----------|:-----------|
|**ホスト名**|hosts|
|**アラート**|description|

［保存］ボタンをクリックして完了。


### 4-3　ITAドライバの設定
ITAの接続設定です。

上部メニュー **システム ＞ アクション設定** から、右上の［アクション先の追加］ボタンをクリックして
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2363269/fe280be5-1375-d146-ddc4-f4f71c784819.png)

「ITA Driver ver1」を選択し以下の部分を入力。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2363269/9dce6125-4c9c-cbf0-4fc5-5558d6913cb1.png)

※ お使いの環境に応じて入力してください。

|項目名|入力内容|
|:-----------|:-----------|
|**名前**|ita1100|
|**バージョン**|1.10.0|
|**プロトコル**|http|
|**ホスト/IP**|exastro-it-automation|
|**ポート**|80|
|**ユーザ名**|oase（ITAに登録したユーザ）|
|**ユーザ名**|********（上記ユーザのパスワード）|
|**権限　システム管理者　新規追加**|更新可能|

［保存］ボタンをクリックして完了。

ここでITAのパラメータ情報をOASEに取得するため、下記のコマンドを実行してITAの情報を取得するサービスを再起動しておきます。

```sh
# カレントディレクトリがdocker-compose.ymlのある場所であることを確認する。
pwd
/root/oase-container
# ディレクトリの確認、移動ができたら下記のコマンドを実行。
docker-compose restart oase-ita-collaboration
```


### 4-4　ディシジョンテーブルにルールを登録
作成したディシジョンテーブルにルールを2つ登録します。

上部メニュー **ルール ＞ デシジョンテーブル** から、作成したデシジョンテーブルの左側にあるダウンロードボタンをクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2363269/f6eb46ac-581b-98ce-eae0-6c38190dc979.png)

Excelがダウンロードされるので、以下の部分を記入。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2363269/21fc301f-ade5-ca1c-ffab-62282d80b715.png)


各項目の入力内容と説明は以下の通り。
（Excelと行/列が入れ変わって少し見にくいですが…）

1行目
| 項目名 | 入力内容 |説明 |下記参照|
|:--|:--|:--|:--|
|**ルール説明**|test|ルールの説明（任意の文章）||
|**ホスト名（正規表現に一致する）**| .* |Zabbixトリガーとマッチング|※1|
|**アラート（完全一致）**| Apache: Process is not running |Zabbixトリガーとマッチング|※1|
|**ルール名（必須）**|rule1|一意となる名称||
|**発生事象（任意）**|Apacheがダウン|発生した事象の概要を記載。不要の場合はXを記述。||
|**対処概要（任意）**|ログ収集|対処の概要を記載。不要の場合はXを記述。||
|**アクション種別（必須）**|ITA(ver1)|実行したいアクションを選択||
|**アクションパラメータ情報（必須）**|ITA_NAME=ita1100,CONDUCTOR_NAME=ログ収集,SERVER_LIST=oase-target01,MENU=[{"ID":1,"VALUES":[{"host":"{{ VAR_ホスト名 }}","dir":"/var/log/httpd/","file":"access_log"},{"host":"{{ VAR_ホスト名 }}","dir":"/var/log/httpd/","file":"error_log"}]}]|{{ VAR_ホスト名 }}は条件式の値をそのまま使うときに利用する変数。今回はZabbixから受け取ったホスト名を利用します。ITAのConductor名称とログ収集のメニューIDを記述|※2|
|**承認メールパラメータ情報（必須）**|X|不要なのでX||
|**リトライ間隔（必須）**|1|アクションのリトライ間隔（単位：秒）||
|**リトライ回数（必須）**|1|アクションのリトライ回数||
|**抑止間隔（必須）**|0|アクションの抑止間隔（単位：秒）||
|**抑止回数（必須）**|0|アクションの抑止回数||
|**条件回数（必須）**|X|アクションの条件回数。不要なのでX||
|**条件期間（秒）（必須）**|X|アクションの条件期間。不要なのでX||
|**大グループ（必須）**|X|グルーピングしたいルールに対してグループ名を記述。不要なのでX||
|**優先順位（必須）**|X|大グループでグルーピングしたルールの優先順位を記述。不要なのでX||
|**小グループ（必須）**|X|大グループからさらにグルーピングしたいルールに対してグループ名を記述。不要なのでX||
|**優先順位（必須）**|X|小グループでグルーピングしたルールの優先順位を記述。不要なのでX||


2行目
| 項目名 | 入力内容 |説明 |下記参照|
|:--|:--|:--|:--|
|**ルール説明**|test|ルールの説明（任意の文章）||
|**ホスト名（正規表現可一致）**| .* |Zabbixトリガーとマッチング|※1|
|**アラート（完全一致）**| MySQL: Service is down |Zabbixトリガーとマッチング|※1|
|**ルール名（必須）**|rule2|一意となる名称||
|**発生事象（任意）**|DBがダウン|発生した事象の概要を記載。不要の場合はXを記述。||
|**対処概要（任意）**|ログ収集|対処の概要を記載。不要の場合はXを記述。||
|**アクション種別（必須）**|ITA(ver1)|実行したいアクションを選択||
|**アクションパラメータ情報（必須）**|ITA_NAME=ita1100,CONDUCTOR_NAME=ログ収集,SERVER_LIST=oase-target01,MENU=[{"ID":1,"VALUES":[{"host":"{{ VAR_ホスト名 }}","dir":"/var/log/mariadb/","file":"mariadb.log"}]}]|{{ VAR_ホスト名 }}は条件式の値をそのまま使うときに利用する変数。今回はZabbixから受け取ったホスト名を利用します。ITAのConductor名称とログ収集のメニューIDを記述|※2|
|**承認メールパラメータ情報（必須）**|X|不要なのでX||
|**リトライ間隔（必須）**|1|アクションのリトライ間隔（単位：秒）||
|**リトライ回数（必須）**|1|アクションのリトライ回数||
|**抑止間隔（必須）**|0|アクションの抑止間隔（単位：秒）||
|**抑止回数（必須）**|0|アクションの抑止回数||
|**条件回数（必須）**|X|アクションの条件回数。不要なのでX||
|**条件期間（秒）（必須）**|X|アクションの条件期間。不要なのでX||
|**大グループ（必須）**|X|グルーピングしたいルールに対してグループ名を記述。不要なのでX||
|**優先順位（必須）**|X|大グループでグルーピングしたルールの優先順位を記述。不要なのでX||
|**小グループ（必須）**|X|大グループからさらにグルーピングしたいルールに対してグループ名を記述。不要なのでX||
|**優先順位（必須）**|X|小グループでグルーピングしたルールの優先順位を記述。不要なのでX||


**※1 ディシジョンテーブル［条件式］**
先ほど作成したディシジョンテーブルに条件式を登録しています。

**※2 メニューID・Conductor名称**
この部分には、「3.ITAの設定」末尾の「補足」でメモしたIDと名称を記入します。
CONDUCTOR_NAME=Conductor名称
ID:メニューID


ITA_NAME=ita1100,**CONDUCTOR_NAME=ログ収集**,SERVER_LIST=oase-target01,MENU=[{**"ID":1**,"VALUES":[{"dir":"/var/log/httpd/","file":"access_log"},{"dir":"/var/log/httpd/","file":"error_log"}]}]

Excelファイル名は任意です。今回は初期のままで続けます。
入力完了したら、次の章でアップロードしていきます。

### 4-5　ディシジョンテーブルのテスト
**ルール ＞ ルール**　より、［ファイルを選択］ボタンをクリックして今作成したExcelを選択し、［アップロード］ボタンをクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2363269/b8a92808-fd81-f9f0-22c8-030f468833a8.png)

［テストリクエスト］ボタンをクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2363269/a07e6d58-eec3-d403-d0b7-f83c185a958f.png)

テストでは、「Zabbixからこういうメッセージをピックアップした」という仮定でテストを行います。なので、**設定**画面でメッセージ内容を手入力します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2363269/70f6b8a8-138d-0357-f045-6ac65a19d7e4.png)


**ディシジョンテーブル**

|ディシジョンテーブル名選択|
|:-|
|OASEメニュー機能検証|

**設定**

1回目
|項目|入力内容
|:-|:-|
|**ホスト名**| oase-target01 |
|**アラート**|Apache: Process is not running|

2回目
|項目|入力内容
|:-|:-|
|**ホスト名**| oase-target01 |
|**アラート**| MySQL: Service is down|

入力したら［実行］ボタンをクリック。
成功すると、**ログ**にこういう画面が出ます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2363269/fd17582c-bfae-23b9-8e07-b77cbf3210cf.png)


「正常に処理されました」と表示され、ホスト名が指定したものになっていたらOK。変数がそのまま出てきてしまう場合は、アクションパラメータの記述を見直してみてください。

DBのアラートでもテストを行い、同じように成功することを確認しましょう。

［プロダクション適用］ボタンがアクティブになるのでクリックすると、ルール画面下段の［プロダクション適用ルール］にディシジョンテーブル名が表示されます。

これでOASEの設定は完了です！


## 5.　動作確認
では実際にサービスを落として動作確認をしてみましょう。
teratermから監視対象サーバ(oase-target01)にログインして次のコマンドでサービスの状態を確認します。まずはhttpdからです。

```sh
systemctl status httpd
```

サービスが動いていることを確認したらさっそくサービスをダウンさせてみましょう
次のコマンドを実行します。
```sh
systemctl stop httpd
```

もう一度statusのコマンドを実行してサービスが止まっていることを確認しましょう。

数分ほどしたら、zabbixの方でアラートが上がっていますので、ログの収集が行われるはずです。

今回はoase-log-serverというサーバに転送するように指示を書いていますので、そちらで確認してみましょう。

```sh
cd /share/oase/logs/
ls -l

-rw-r--r-- 1 nfsnobody nfsnobody    0 May  9 19:40 access_log.20220509194025
-rw-r--r-- 1 nfsnobody nfsnobody  708 May  6 13:24 error_log.20220509194025
```

これで成功です！！

OASEではどう表示されてるか見てみます。
**ルール ＞ アクション履歴**から、表示されたアクション詳細へ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2363269/16f5ee8a-e811-4e75-c91b-10eb2d117626.png)

赤枠のボタンをクリックするとログ詳細画面を表示できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2363269/0bb6b0f3-d20b-b34c-d297-74ccc939f825.png)


下部の**アクション情報 ＞ 連携項目**　を確認すると、ホスト名がきちんと反映され、こちらで記載した値が渡されていることがわかります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2363269/0d5f6b9a-7ecf-e4bb-98c2-ecce6f8114db.png)





では同じようにDBの方も確認していきましょう。

サービスが動いていることを確認し、さっそくサービスをダウンさせてみましょう
次のコマンドを実行します。

```sh
systemctl status mariadb
```

```sh
systemctl stop mariadb
```

```sh
cd /share/oase/logs/
ls -l

-rw-r--r-- 1 nfsnobody nfsnobody 1671195 May 14 17:32 mariadb.log.20220514173253
```

これで一連の動作確認ができました。



## まとめ 
一番初めに設定することは色々とあるようですが、一度やってしまえばあとは自動ですべて対処してくれるので、実運用ではかなり重宝するのではないかと思いました。

ポイントはOASEのディシジョンデーブル内で任意の値を設定できる点かなと感じました。ITAのパラメータシートに任意の値を送ることができるため、ルールの記述などが行いやすいのではないかと思います。

下記の関連リンクでOASE関係の記事を載せてみたので、合わせて見ていただければわかりやすいと思います。

## 関連リンク

- [Exastro Operation Autonomy Support Engine (公式ページ)][公式ページ]
- [OASE_docs (公式マニュアル)][公式マニュアル]
- [Exastro IT Automation (公式ページ)][ITA公式]
- [公式GitHub(oase-container)][公式GitHub]
- [DockerHub公式リポジトリ]
- [Exastro コミュニティサイト　OASEドキュメント一覧](https://exastro-suite.github.io/oase-docs/documents_ja.html)
- [Exastro コミュニティサイト ITA公式マニュアル](https://exastro-suite.github.io/it-automation-docs/documents_ja.html)
- [【随時更新】Exastroの参考になる記事をまとめてみた](https://qiita.com/ooif/items/79952398fb03ca3ec7fd)

[公式ページ]:https://exastro-suite.github.io/oase-docs/index_ja.html
[公式マニュアル]:https://exastro-suite.github.io/oase-docs/documents_ja.html
[ITA公式]:https://exastro-suite.github.io/it-automation-docs/index_ja.html
[公式GitHub]:https://github.com/exastro-suite/oase-container
[DockerHub公式リポジトリ]:https://hub.docker.com/u/exastro