Exastro IT Automation 2.4.0 の収集比較機能を使ってみた【後編】

## はじめに
本記事は後編になります。
↓先に前編をご覧ください。
[Exastro IT Automation の収集比較機能を使ってみた【前編】](https://qiita.com/y-arai-0523/private/e394387122b96115adce)

Exastro IT Automation（以下ITA）には、システムから設定値やファイルを取得してくる「収集機能」と収集した値を比較できる「比較機能」があります。
設計した値がちゃんと機器に設定されているか確認するのに便利そうなので試してみたいと思います。

[収集機能のドキュメント](https://ita-docs.exastro.org/ja/2.4/manuals/ansible-driver/collect.html#id1)
[比較機能のドキュメント](https://ita-docs.exastro.org/ja/2.4/manuals/create_param/comparison_function.html#id1)

## 収集比較機能とは
収集機能とは、ITAで行った作業の実行結果となるインベントリ(YAMLファイルとして出力されたソースファイル)をシステムから取得し、その値をITAのパラメータシートへ自動登録できる機能です。

収集比較の流れとしては以下の図のようになります。
**① ITAから自動化ソフトウェアを介して、作業対象システムのインベントリを取得する。
② あらかじめ設定しておいたインベントリとパラメータシートとの紐付けをもとに、ITAのパラメータシートへ収集した値が自動登録される。**

![01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/794820/23bb3173-e9bf-118f-4c98-61bda948ff53.png)

比較機能は、収集機能と合わせると以下のような活用ができます。
③ 期待値と実機から取得した値を比較する。
④ 取得した値同士を比較する。過去のある時点での値と、現在の値など。

![比較機能概要](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/794820/725a3190-e328-4fba-7a8a-ebef5fd81845.png)

## 今回紹介するシナリオ
今回は以下4つのシナリオを紹介します。
収集機能は、パラメータ取得とファイル取得の2パターン。
比較機能は、取得したパラメータとファイルをそれぞれ別のデータと比較してみます。

1. 【収集機能】パラメータ取得：ターゲットホストのOS情報を取得する
1. 【収集機能】ファイル取得：ターゲットホストからSSL証明書を取得する
1. 【比較機能】OS情報パラメータの比較
1. 【比較機能】SSL証明書の比較

後編である本記事では比較機能の確認をします。

## 作業環境
今回の以下の作業環境で実施します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3798829/18db6bde-5d9b-0dfe-62d3-ef974589ef7c.png)

## 3. 【比較機能】OS情報パラメータの比較
それではシナリオ3のOS情報パラメータの比較をやってみます。
ITAに期待値を設定し、GatherFactsで収集した値と比較してみます。
![102.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/794820/7ffef602-7abb-5fd6-3e79-78f08f67e7ec.png)

### 3.1 基本コンソール　＞＞　オペレーション一覧
期待値となるオペレーションを登録します。

|オペレーション名（任意の名称）|実施予定日時（任意の時間）|
|:----------:|:----------:|
| GatherFacts101 | 現在時刻 |

※ 実施予定時間は情報として入力できるようになっているもので、タイマーではありません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3798829/35f9e27e-d135-82d9-2f96-7e6f5481fca2.png)

### 3.2 パラメーターシート作成　＞＞　パラメーターシート定義一覧
Gathered Factsと全く同じメニューを作成し、「メニュー名」「表示順序」だけ変えます。
Gathered Factsを複製して一部変更していきます。

まず一覧のGathered Factsの「メニュー定義・作成」を押す。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3798829/2a7187a3-9faa-4cb4-1cc6-d363c0fd0449.png)

「流用新規」を押す。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3798829/fe2b7516-27e1-1bbf-2cb0-da6a922b81df.png)

「パラメータシート名」「表示順序」だけ空の状態で複製されるので、そこだけ入力。
表示順序は何番でもよいですが、今回はシナリオ順に従って3にしておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3798829/609faa58-0b03-e9ff-a0ce-ac91a20cde9e.png)

|メニュー名（任意の名称）|表示順序|
|:----------:|:----------:|
| OS情報 |3|

「作成」を押してメニュー作成完了。
OS情報のメニューが作成されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3798829/e6290ccc-ee00-b903-a655-ff0c90a3c62e.png)

### 3.3 入力用　＞＞　OS情報
それでは作成した「OS情報」メニューに値を入力します。
今回は ansible_nodename だけわざと違う値を入力しておきます。
正：targethost
誤：hogehoge
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3798829/273be1fb-28ee-db0c-3ab7-6130d2b2980f.png)

|パラメータ|値|
|:----------|:----------|
|ansible_architecture|x86_64|
|ansible_bios_version|VMW71.00V.13989454.B64.1906190538|
|ansible_default_ipv4__address|対象サーバIPアドレス|
|ansible_default_ipv4__interface|ens192|
|ansible_default_ipv4__network|対象サーバネットワーク|
|ansible_distribution|RedHat|
|ansible_distribution_file_path|/etc/redhat-release|
|ansible_distribution_file_variety|RedHat
|ansible_distribution_major_version|9|
|ansible_distribution_release|Plow|
|ansible_distribution_version|9.3|
|ansible_machine|x86_64|
|ansible_memtotal_mb|3647|
|**ansible_nodename**|**hogehoge**|
|ansible_os_family|RedHat|
|ansible_pkg_mgr|dnf|
|ansible_processor_cores|1|　

全部入力したら編集確認ボタンを押します。

### 3.4 比較　＞＞　比較設定
比較設定では、比較対象となる2つのメニューを選びます。今回は「Gathered Facts」と「OS情報」になります。

比較設定メニューへ以下を入力します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3798829/7c4bac45-622e-6893-d966-e56a44ce4115.png)

|比較名称|対象パラメータシート1（プルダウンから選択）|対象パラメータシート2（プルダウンから選択）|詳細設定フラグ（プルダウンから選択）|
|:----------|:----------|:----------|:----------|
|OS情報|OS情報|Gathered Facts|False|

### 3.5 比較　＞＞　比較実行
それでは比較を実行します。

比較設定選択ボタンから先ほど登録した「OS情報」の比較定義を選択し、比較実行ボタンを押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3798829/6cd5a3c5-85ec-4dc8-a15e-88c9ecb31b2b.png)

すると、ansible_nodenameの値だけマークされていて、差分有りということが分かります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3798829/e6c0d9ba-e675-0d20-94a5-2905ec938f68.png)

これで期待値と収集した値との比較が成功しました！


## 4. 【比較機能】SSL証明書の比較
では最後に、収集日が異なり内容に差分のあるSSL証明書同士を比較してみます。

![22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/794820/7ef42964-4f4c-27ef-e248-fbec0d363a99.png)

### 4.1 基本コンソール　＞＞　オペレーション一覧
比較用のオペレーションを作成します。

|オペレーション名（任意の名称）|実施予定日時（任意の時間）|
|:----------:|:----------:|
| getSSL2 | 現在日時 |

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3798829/c7fa1234-8b83-727d-4f22-9f61c8943327.png)

### 4.2 内容の違うSSL証明書を用意しておく
今回は差分有りのファイルを用意したいので、Teratermでターゲットサーバの/etc/pki/tls/certs/に入り、SSL証明書（test.crt）の中身を一部書き換えておきました。


### 4.3 入力用　＞＞SSL証明書名
**前編の記事の2.6**と同様のメニューを使います。
オペレーションだけ比較用のgetSSL2にします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3798829/eed428ff-6030-6ba5-66ac-3a4df50c9f66.png)

|ホスト名（プルダウンから選択）|オペレーション|パラメータ　＞　ファイル名|
|:----------:|:----------:|:----------:|
| targethost |getSSL2|test.crt|

### 4.4 Ansible-Legacy　＞＞　作業実行
差分有りのSSL証明書を収集します。
Movementはシナリオ2と同じくgetSSLで、オペレーションだけ比較用のgetSSL2にします。

|Movement|Operation|
|:----------:|:----------:|
| getSSL | getSSL2 |

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3798829/a49f170c-a442-197f-c883-0d331fc69e6d.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3798829/c11f0119-b56f-e753-981a-03bdfa86d6c9.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3798829/8fea5a4c-f312-4481-6da5-1bebe7748b23.png)

作業実行ボタンから実行。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3798829/1fc9c513-f8b5-acf0-afdd-e1a586660c2d.png)

画面が自動で遷移してステータスが完了になりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3798829/80798a95-df91-4bdf-52d3-cc01c5506780.png)


### 4.5 入力用　＞＞　SSL証明書
レコードが収集されているか確認します。
また、今回は基準日時（収集した日時）ベースで比較を行うので、基準日時を確認しておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3798829/25ac4692-9025-91bb-fae0-df7f198bc002.png)

今回は以下の基準日時となっています。
オペレーション「getSSL1」：2024/6/24　16:07
オペレーション「getSSL2」：2024/6/25　18:55

### 4.6 比較　＞＞　比較定義
比較定義では、比較対象となる2つのメニューを選びます。
今回は両方とも「SSL証明書」になります。

比較メニューグループから比較定義へ、以下を入力します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3798829/58d76f8c-4381-df1d-2045-ff131c8c30fa.png)

|比較定名称（任意の名称）|比較対象メニュー1（プルダウンから選択）|比較対象メニュー2（プルダウンから選択）|詳細設定フラグ（プルダウンから選択）|
|:----------|:----------|:----------|:----------|
|SSL証明書|代入値自動登録用:5:SSL証明書|代入値自動登録用:5:SSL証明書|False|

### 4.7 比較　＞＞　比較実行
それでは比較を実行します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3798829/d7357265-1fa5-a996-2b95-25df2aefa5c3.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3798829/ab18f59b-0dfd-ca0b-7ce5-b3257fed25b8.png)

先ほど登録した「SSL証明書」の比較定義を選択し、比較対象となる２つの基準日時を入力します。
今回は以下の基準日時になっていたので、
オペレーション「getSSL1」：2024/6/24　16:07
オペレーション「getSSL2」：2024/6/25　18:55
この時点で収集されたファイルが反映されているであろう、以下の日時で比較してみます。

|比較定義（プルダウンから選択）|基準日時1|基準日時2|
|:----------|:----------|:----------|
|SSL証明書|2024/6/24 17:00|2024/6/25 19:00|

収集した時点と比較する時点は図にするとこのようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3798829/3c574631-4775-76bc-76c1-bf82c37aedca.png)


基準日時を設定して比較実行をします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3798829/e872d5e1-cf7f-14f7-6dad-a76a4115d5e7.png)

すると、「パラメータ/ファイル」がマークされ、差分有りということがわかります。
これでファイル同士の比較ができました！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3798829/6f693151-227e-a5c0-1914-6f988a27800d.png)

ファイル差分詳細ボタンからファイルの差分も確認することが出来ます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3798829/bf548025-0b99-c0dc-d8b6-5477a761f1af.png)

### 補足：Conductorについて
今回はMovementひとつだけだったので、Ansible-Legacyの「作業実行」からMovement（ジョブ）を直接実行しましたが、ITAにはConductorというジョブフロー機能が搭載されており、これだと複数のMovementをつなげて実行することが出来ます。他のMovementと連動させてより複雑な作業実行をしたい場合はこちらを使います。

詳しくは[こちら](https://ita-docs.exastro.org/ja/2.4/manuals/it_automation_base/conductor.html#conductor)に載っています。

## まとめ&収集比較機能の応用例
今回は比較機能を試してみました。
収集機能と合わせて使うことで、実機のパラメータ設定やファイルが想定した状態になっているのか確認出来ました。

実作業では、活用できるシーンが色々とありそうです。
たとえば、Network機器のshow running-configコマンド結果をファイルで取ってくる、AWSでEC2リストを取ってくるなど。いちいち手作業でやる必要がないので、作業の効率化やミスの防止にもつながりそうです。

比較機能では、作業実行の前後で期待値と実際の値(実機から取得した値)を比較することで、　作業前には「変更したい箇所」だけが差分で現れること／作業後には差分があらわれないこと　を比較してチェックする、といった使い方も出来そうです。