Exastro IT Automation の収集比較機能を使ってみた

##はじめに
Exastro IT Automation（以下ITA）には、システムから設定値やファイルを取得してくる「収集機能」というものがあり、最近リリースされたv1.7.0では収集した値を比較できる「比較機能」が追加されたようです。
設計した値がちゃんと機器に設定されているか確認するのに便利そうなので、やってみました。



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

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

※1　現在はAnsibleのみ連携可能ですが、将来的には他の自動化ソフトウェアとも連携する予定らしいです。
![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証明書の比較



##作業環境
![03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/794820/49d66ce8-7901-a700-2fc2-90779c2ae86c.png)



##作業手順
操作手順を案内していく前に、少しだけITAのUIについて説明します。

ITA画面は、まずログインして最初に下図のダッシュボードが表示されます。
そこにはボタンがいくつか表示されていますが、それぞれを「メニューグループ」と言います。
![e_01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/794820/1fa5850d-1291-1d81-efe5-722e6f7b2acd.png)
今回操作するメニューグループは、赤枠で囲ったものになります。

そして　**メニューグループ　＞＞　メニュー**　という階層になっており、メニューグループの下にいくつかメニューが格納されています。
例えば「基本コンソール」メニューグループだとこんな感じ。
![e_02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/794820/75b66aab-3d9b-3941-a5c8-6bb57d4531a4.png)
「機器一覧」「オペレーション一覧」「Movement一覧」「ER図表示」のメニューが格納されていますね。ここから様々な操作を行っていきます。

今回紹介する操作手順では、　**1.1 基本コンソール　＞＞　機器一覧**　というように、操作するメニューを示していきます。

また、メニューの中はこんな感じになっています（メニューによって異なります）。
頻出するのは**「登録」**で、ここから各種データを登録したり、データ同士を紐付けたりしていきます。また**「フィルタ」ボタン**を押すと**「一覧/更新」**に登録済みデータ一覧が表示されます。

![e_03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/794820/2058d8e9-14f5-3d41-b168-dfc920926146.png)

…ただ、実際に操作していくと、いま自分が何のデータを登録しているのか、何と何を紐付けているのかなど、迷子になってしまうことも出てきます。

そんな時は　**基本コンソール　＞＞　ER図表示**　が役に立ちます。v1.7.0で新しく搭載された機能で、各メニューグループ・メニューの相関関係が示されます。
![e_04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/794820/c28515bc-c887-a120-8f70-de4f2b99a631.png)
こんなふうに、紐づけが可視化されています。マウスオーバーすると、そのメニューの紐付けがオレンジになります。
![e_05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/794820/215c20e7-fc1e-ba92-2460-ba31c1de240c.png)

紐付け関係がわからなくなってしまったら、これを見れば大丈夫そうです。
それではシナリオ1から説明していきます。



### 1. 【収集機能】パラメータ取得：ターゲットホストのOS情報を取得する
流れとしては下図のようになります。
![115.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/794820/d0407f4e-05fd-65bb-44fb-53aa11407663.png)



#### 1.1 基本コンソール　＞＞　機器一覧
まずはターゲットホストの接続情報を登録します。
登録画面はこのようになっているので、赤枠内の必須項目を入力。下表には今回設定した内容を書いています。
![230302_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/794820/2920b532-14fe-0240-21dc-5d4bc52fdfdf.png)
※ Ansible Towerは今回使いませんが、接続タイプは必須項目なのでデフォルトで入っています。

|HW機器種別|ホスト名|IPアドレス|ログインユーザID|ログインパスワード<br>＞ 管理|ログインパスワード<br>＞ ログインパスワード|Ansible利用情報<br>＞ Legacy/Role利用情報<br>＞認証方式|
|:----------|:----------|:----------|:----------|:----------|:----------|:----------|
| SV | targethost | 198.51.100.1 | root | ● |******** | パスワード認証 |



#### 1.2 基本コンソール　＞＞　オペレーション一覧
今回のオペレーションを登録します。
オペレーションは、ITAの自動作業一式を指します。これに、のちのち関連するすべてのデータを紐付けていきます。

今回は、後述しますがPlaybookのファイル名がGatherFacts.ymlなので、オペレーション名はGatherFacts1としました。
![1.2 基本コンソール　＞＞　オペレーション一覧](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/794820/2ebcfc16-5559-f819-6201-a057035532a6.png)

|オペレーション名（任意の名称）|実施予定日時（任意の時間）（※）|
|:----------:|:----------:|
| GatherFacts1 | 2021/04/22 17:09 |
※ 実施予定時間は情報として入力できるようになっているもので、タイマーではありません。



#### 1.3 Ansible-Legacy　＞＞　Movement一覧
Ansible-LegacyのMovementを登録します。
Movementとは、ITAの自動作業の最小単位で、ジョブを表します。
今回はこのあとPlaybookに紐付けて、OS情報を収集するMovementとなります。
![1.3 Ansible-Legacy　＞＞　Movement一覧](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/794820/424a6d46-0d57-7787-f1df-e07d32a2946c.png)

|Movement名（任意の名称）|Ansible利用情報 ＞ ホスト指定形式（プルダウンから選択）|Ansible利用情報 ＞ ヘッダーセクション|
|:----------:|:----------:|:----------:|
| GatherFacts | IP | **（※）** |

**※ ヘッダーセクションには以下を入力**

```
- hosts: all
  remote_user: "{{ __loginuser__ }}"
  gather_facts: yes
  become: yes
```

<details><summary>ヘッダーセクションについて</summary>ITAは、デフォルトではこのようなヘッダーセクションがついています。
![20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/794820/1ed6747f-be3e-5a52-0412-95ae8e949ade.png)
デフォルト値を変更する必要がない場合は、わざわざ入力する必要はなく空欄で良いのですが、今回はgather_factsを使ってOS情報を取得しようとしているため、
**gather_facts: no　→gather_facts: yes**
にしておく必要があります。</details>



#### 1.4 Ansible-Legacy　＞＞　Playbook素材集
Playbookを登録します。
今回はこちらのPlaybookを使用しました。
YAMLファイルを生成し、OS情報を取得してくるという内容です。

```ruby:GatherFacts.yml
- name: make yaml file
  blockinfile:
    create: yes
    mode: 644
    insertbefore: EOF
    marker: ""
    dest: "{{ __parameter_dir__ }}/{{ inventory_hostname }}/gatherfacts.yml"
    content: |
      ansible_architecture              : {{ ansible_architecture }}
      ansible_bios_version              : {{ ansible_bios_version }}
      ansible_default_ipv4__address     : {{ ansible_default_ipv4.address }}
      ansible_default_ipv4__interface   : {{ ansible_default_ipv4.interface }}
      ansible_default_ipv4__network     : {{ ansible_default_ipv4.network }}
      ansible_distribution              : {{ ansible_distribution }}
      ansible_distribution_file_path    : {{ ansible_distribution_file_path }}
      ansible_distribution_file_variety : {{ ansible_distribution_file_variety }}
      ansible_distribution_major_version: {{ ansible_distribution_major_version }}
      ansible_distribution_release      : {{ ansible_distribution_release }}
      ansible_distribution_version      : {{ ansible_distribution_version }}
      ansible_machine                   : {{ ansible_machine }}
      ansible_memtotal_mb               : {{ ansible_memtotal_mb }}
      ansible_nodename                  : {{ ansible_nodename }}
      ansible_os_family                 : {{ ansible_os_family }}
      ansible_pkg_mgr                   : {{ ansible_pkg_mgr }}
      ansible_processor_cores           : {{ ansible_processor_cores }}
  delegate_to: 127.0.0.1
```

**なぜYAMLファイル？**
ITAでは、収集結果ファイルはYAML形式に指定されているようです。そのためYAMLファイルを生成する必要があります。
また生成されたYAMLファイルは、以下の収集用のディレクトリに格納することになっています。
![118.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/794820/8ae2b73e-06f9-642f-2895-807506deb303.png)

**パスの変数**
パスの変数はこのようになっています。
![b_05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/794820/e75e7d88-e772-3995-0ddc-b39054b8b556.png)

Playbookが用意できたら、登録画面から以下を入力します。

![07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/794820/38ebf37b-49d4-f62e-673e-27d8454b36d5.png)

|Playbook素材名（任意の名称）|Playbook素材|
|:----------:|:----------:|
| GatherFacts | GatherFacts.yml |



#### 1.5 Ansible-Legacy　＞＞　Movement-Playbook紐付
それでは登録したMovementとPlaybookを紐付けます。
![08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/794820/3c4b839d-2e1d-af64-43df-d2ae2924e363.png)

|Movement（プルダウンから選択）|Playbook素材（プルダウンから選択）|インクルード順序|
|:----------:|:----------:|:----------:|
| 1:GatherFacts | GatherFacts| 1（※） |

※ インクルード順序とは、複数のPlaybookをMovementに紐付けた際に作業実行される順番です。今回は1つだけなので1とします。



#### 1.6 Ansible-Legacy　＞＞　作業対象ホスト
登録したオペレーション・Movement・作業対象ホストを紐付けます。
![23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/794820/9cd06e2b-497c-25d1-a475-9d1fe20e366f.png)

|オペレーション（プルダウンから選択）|Movement（プルダウンから選択）|ホスト（プルダウンから選択）|
|:----------:|:----------:|:----------:|
| 1:GatherFacts1 | 1:GatherFacts| targethost |

これで、このオペレーションではどのホストへ何（Movement）を行う、ということが紐付きました。



#### 1.7 メニュー作成　＞＞　メニュー定義・作成
それでは、収集してきた値の受け皿となるパラメータシートを作成していきます。

「入力用」「代入値自動登録用」「参照用」メニューグループの中に「Gathered Facts」メニューを作成します。このメニューの中に「パラメータシート」の欄ができ、さらにその中の各項目に取得した値が入ります。

初めに説明した　メニューグループ　＞＞　メニュー　を自分で作るというわけです（「入力用」「代入値自動登録用」「参照用」メニューグループはデフォルトであるので、メニューだけ）。


メニュー定義・作成の画面は他のメニューと違ってこのようなGUIになっており、**①基本情報・②対象メニューグループ・③項目**の3つのエリアに必要な情報を入力するようになっています。

![09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/794820/38c4df40-cb7e-3e31-c48f-de069e36d068.png)

それでは入力していきます。
**①基本情報**は以下の3か所。

|メニュー名（任意の名称）| 作成対象（プルダウンから選択）|表示順序（※）|
|:----------:|:----------:|:----------:|
| Gathered Facts |パラメータシート（ホスト/オペレーションあり）|1|

※ 表示順序はメニューグループ内のメニューの上から何番目に表示されるかを示します。

**②対象メニューグループ**は作成したメニューが所属するメニューグループを指定するものですが、今回はデフォルト値にしておきます。
対象メニューグループの詳細は[こちら](https://exastro-suite.github.io/it-automation-docs/asset/Documents_ja/Exastro-ITA_%E5%88%A9%E7%94%A8%E6%89%8B%E9%A0%86%E3%83%9E%E3%83%8B%E3%83%A5%E3%82%A2%E3%83%AB_%E3%83%A1%E3%83%8B%E3%83%A5%E3%83%BC%E4%BD%9C%E6%88%90%E6%A9%9F%E8%83%BD.pdf)

|入力用|代入値自動登録用|参照用|
|:----------:|:----------:|:----------:|
|入力用 |代入値自動登録用|参照用|

**③項目**は以下の3か所を入力します。
![19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/794820/5c5253c6-9ec4-da1b-8565-5604e457cbc0.png)

今回はPlaybookの変数が17個あるので、これを17個作ります。左上の「項目」ボタンを押すと新規項目が作成されます。
なお、項目名はPlaybookの変数名に対応しているとわかりやすいです。

|項目名（任意の名称）|入力方式|最大バイト数（任意の値）|
|:----------|:----------|:----------|
|ansible_architecture|文字列（単一行）|128|
|ansible_bios_version|文字列（単一行）|128|
|ansible_default_ipv4　＞ address（※）|文字列（単一行）|128|
|ansible_default_ipv4　＞ interface（※）|文字列（単一行）|128|
|ansible_default_ipv4　＞ network（※）|文字列（単一行）|128|
|ansible_distribution|文字列（単一行）|128|
|ansible_distribution_file_path|文字列（単一行）|128|
|ansible_distribution_file_variety|文字列（単一行）|128|
|ansible_distribution_major_version|文字列（単一行）|128|
|ansible_distribution_release|文字列（単一行）|128|
|ansible_distribution_version|文字列（単一行）|128|
|ansible_machine|文字列（単一行）|128|
|ansible_memtotal_mb|文字列（単一行）|128|
|ansible_nodename|文字列（単一行）|128|
|ansible_os_family|文字列（単一行）|128|
|ansible_pkg_mgr|文字列（単一行）|128|
|ansible_processor_cores|文字列（単一行）|128|

※ ansible_default_ipv4というグループを作り、その中にこの3項目を入れ込みます。

全部入力したらこんな感じで、項目がずらっと並んだ形になります。
OKなら作成ボタンを押します。

![10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/794820/b73dad54-9d18-d5b3-ded9-490abacad6c2.png)

これで「入力用」「代入値自動登録用」「参照用」メニューグループの中に「Gathered Facts」メニュー（パラメータシート）が作成できました！
![11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/794820/9db37abd-5a81-f94f-a5fd-39c54fdffd7f.png)

登録開始ボタンを押して、たくさん作った項目もきちんと出来ているか確認。
![12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/794820/e7f80fa4-9480-41af-3147-7067809d496f.png)



#### 1.8 Ansible共通　＞＞　収集項目値管理
収集項目値管理では、収集項目（FROM）であるYAMLファイル名・変数名と、パラメータシート（TO）であるメニュグループ名・メニュー名・項目名を紐付けます。

入力する箇所はこちら。

![13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/794820/0916a8b8-d5ed-e515-153a-c2c952c186a5.png)

**収集項目（FROM）**

|パース形式（プルダウンから選択）|PREFIX(ファイル名)|変数名|
|:----------|:----------|:----------|
|YAML|gatherfacts|※1|

**パラメータシート（TO）**

|メニューグループ:メニュー（プルダウンから選択）|項目（プルダウンから選択）|
|:----------|:----------|
|代入値自動登録用:2:Gathered Facts|※2|


今回は変数が17個あるので、17個分登録します。下表のように、※1と※2を対応させます。

|※1（変数名）|※2（項目名）|
|:----------|:----------|
|ansible_architecture|パラメータ/ansible_architecture|
|ansible_bios_version|パラメータ/ansible_bios_version|
|ansible_default_ipv4__address|パラメータ/ansible_default_ipv4/address|
|ansible_default_ipv4__interface|パラメータ/ansible_default_ipv4/interface|
|ansible_default_ipv4__network|パラメータ/ansible_default_ipv4/network|
|ansible_distribution|パラメータ/ansible_distribution|
|ansible_distribution_file_path|パラメータ/ansible_distribution_file_path|
|ansible_distribution_file_variety|パラメータ/ansible_distribution_file_variety|
|ansible_distribution_major_version|パラメータ/ansible_distribution_major_version|
|ansible_distribution_release|パラメータ/ansible_distribution_release|
|ansible_distribution_version|パラメータ/ansible_distribution_version|
|ansible_machine|パラメータ/ansible_machine|
|ansible_memtotal_mb|パラメータ/ansible_memtotal_mb|
|ansible_nodename|パラメータ/ansible_nodename|
|ansible_os_family|パラメータ/ansible_os_family|
|ansible_pkg_mgr|パラメータ/ansible_pkg_mgr|
|ansible_processor_cores|パラメータ/ansible_processor_cores|


#### 1.9 Ansible共通　＞＞　収集インターフェース情報
収集してきた値をITAのCMDBに登録する際のRESTAPIアクセスで必要になるため、RESTユーザー／パスワードを実行権限のあるユーザーで登録します。

「フィルタ」を押すと一覧で1行だけ表示されるので、その更新ボタンを押して以下の箇所を書き換えます。
![14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/794820/9080ff18-c8d7-bdeb-4187-f5cd62349a6d.png)
![15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/794820/9d19c0ac-144c-5b54-72ce-f0427d4c2b34.png)

今回はITAにadministratorでログインしており実行権限があるので、RESTユーザー：administratorでそのパスワードを入れています。

|RESTユーザー|RESTパスワード|
|:----------|:----------|
|実行権限のあるユーザー|そのユーザーのパスワード|

更新ボタンを押します。



#### 1.10 Ansible-Legacy　＞＞　作業実行
登録したMovementとオペレーションを選択します。これですべての情報の紐付け完了です。
それでは実行ボタンを押してみます。
![16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/794820/4751ddc6-4f45-4951-35db-6e0a93667301.png)

作業状態確認で、ステータスが完了になれば作業完了です。
![18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/794820/e56e3b12-4ed1-978d-ce03-2e4fdf908db3.png)

ちなみに…
**Ansible-Legacy　＞＞　作業管理**　からも収集結果が確認できます。
「収集状況」という項目があるので、成功していればステータスが「収集済み」、失敗していれば「対象外」と表示されます。
![21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/794820/75318417-6f3d-297a-7800-1bbd29643182.png)



#### 1.11 入力用（参照用でもOK）　＞＞　Gathered Facts
値が収集されているか確認します。
「フィルタ」を押して一覧を表示し、該当パラメータを確認。
![17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/794820/a8b447bd-de35-ae31-d190-58a97d3a9382.png)
うまく収集できていれば成功です！



### 2. 【収集機能】ファイル取得：ターゲットホストからSSL証明書を取得する
ファイル取得も、流れとしてはパラメータ取得と同じで下図のようになります。
今回は事前にターゲットホストにtest.crtを置いておいたので、それを取得してきます。
![123.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/794820/4edbdfbf-b195-4420-d982-2f39509b08b8.png)



#### 2.1 基本コンソール　＞＞　機器一覧
今回は1.1と同じターゲットホストになるので、このままでOKです。



#### 2.2 基本コンソール　＞＞　オペレーション一覧
今回のオペレーションを登録します。

|オペレーション名（任意の名称）|実施予定日時（任意の時間）（※）|
|:----------:|:----------:|
| getSSL1 | 2021/04/23 17:10 |

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

![b_01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/794820/570ad2ee-f1c3-4790-533d-5ab6e0b0e9f3.png)



#### 2.3 Ansible-Legacy　＞＞　Movement一覧
Movementを登録します。
この後Playbookに紐付けることで、SSL証明書を取得してくるジョブとなります。

|Movement名（任意の名称）|Ansible利用情報 ＞ ホスト指定形式|
|:----------:|:----------:|
| getSSL | IP |

![b_02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/794820/407d2d40-30da-cf86-86ef-a5ddbd59e1d6.png)



#### 2.4 Ansible-Legacy　＞＞　Playbook素材集
Playbookを登録します。
今回はこちらのPlaybookを使用しました。
SSL証明書ファイル取得のためのYAMLファイルを作成　→　SSL証明書ファイルを収集ディレクトリにコピーする　という内容です。

```ruby:getSSL.yml
- name: make yaml file
  blockinfile:
    create: yes
    mode: 644
    insertbefore: EOF
    marker: ""
    dest: "{{ __parameter_dir__ }}/{{ inventory_hostname }}/getSSL.yml"
    content: |
      SSL_file_name                    : {{ VAR_ssl_name }}
      SSL_file                         : {{ VAR_ssl_name }}
  delegate_to: 127.0.0.1

- name: get SSL file
  fetch:
    src: /etc/pki/tls/certs/{{ VAR_ssl_name }}
    dest: "{{ __parameters_file_dir__ }}/{{ inventory_hostname }}/"
    flat: yes

```

収集されたSSL証明書は、以下のディレクトリに格納されます。
![119.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/794820/fc4c3035-7996-2131-44cf-c20e18a57f17.png)

パスの変数はこのようになっています。
![b_05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/794820/e75e7d88-e772-3995-0ddc-b39054b8b556.png)


Playbookが用意できたら、以下を登録します。

|Playbook素材名（任意の名称）|Playbook素材|
|:----------:|:----------:|
| getSSL | getSSL.yml |

![b_03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/794820/12fbe3bb-50f2-af7c-d06f-b29ef1b4c33e.png)



#### 2.5 Ansible-Legacy　＞＞　Movement-Playbook紐付
登録したMovementとPlaybookを紐付けます。

|Movement（プルダウンから選択）|Playbook素材（プルダウンから選択）|インクルード順序|
|:----------:|:----------:|:----------:|
| 2:getSSL | getSSL| 1（※） |

※ インクルード順序とは、複数のPlaybookをMovementに紐付けた際に作業実行される順番です。今回は1つだけなので1とします。
![b_06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/794820/c9a0bc81-df34-c4a5-0f09-2a0c457b3173.png)



#### 2.6 Ansible-Legacy　＞＞　代入値自動登録設定
次に、Playbook内の変数（VAR_ssl_name）に具体値（test.crt）を代入します。
直接値を打ち込む方法とパラメータシートの値を代入する方法の2パターンあるようですが、今回は後者にします。

こちらのパラメータを仕込んでおきました。
～～～～～
**メニュー作成　＞＞　メニュー定義・作成**
以下を入力してメニューを作成（メニュー作成の詳細は1.7や2.7を参照ください）。
※デフォルトのままで良い値は割愛しています。

|メニュー名（任意の名称）|表示順序|項目名（任意の名称）|最大バイト数|
|:----------:|:----------:|:----------:|:----------:|
| SSL証明書名 |4|ファイル名|128|


**入力用　＞＞SSL証明書名**
作成したメニューへ。これがパラメータシートとなります。
ホスト名とオペレーションを選択し、ファイル名にtest.crtと入力。
![109.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/794820/218955f8-156d-9374-1289-a79793f54861.png)


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

さて、仕込ができたら、**Ansible-Legacy　＞＞　代入値自動登録設定**　に行き、パラメータシートの項目名とPlaybookの変数、Movementを紐づけます。
![e_10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/794820/08aad285-004b-9ccb-dd40-77a994e70bc3.png)

|パラメータシート（From）　＞　メニューグループ：メニュー|パラメータシート（From）　＞　項目名|登録方式|IaC変数(To)　＞　Movement|IaC変数(To)　＞　Value変数　＞　変数名|
|:----------:|:----------:|:----------:|:----------:|:----------:|
| 代入値自動登録用：SSL証明書名 |パラメータ/ファイル名|Value型|getSSL|VAR_ssl_name|

（すべてプルダウンから選択）

これで、VAR_ssl_nameとtest.crtがつながりました。



#### 2.7 メニュー作成　＞＞　メニュー定義・作成
それでは、1のシナリオ同様、収集した値の受け皿となるパラメータシートを作っていきます。

「入力用」「代入値自動登録用」「参照用」メニューグループの中に「SSL証明書」メニューを作成します。このメニューからSSL証明書がダウンロードできるようになります。

メニュー作成画面はこのようになっており、**①基本情報・②対象メニューグループ・③項目**の3つのエリアに必要な情報を入力します。
![b_07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/794820/7c4c1779-0929-7a6d-a601-8073d7588753.png)
**①基本情報**は以下の3か所を入力。

|メニュー名（任意の名称）| 作成対象（プルダウンから選択）|表示順序（※）|
|:----------:|:----------:|:----------:|
| SSL証明書 |パラメータシート（ホスト/オペレーションあり）|2|

※ 表示順序はメニューグループ内のメニューの上から何番目に表示されるかを示します。

**②対象メニューグループ**は作成したメニューが所属するメニューグループを指定するものですが、今回はデフォルト値にしておきます。

|入力用|代入値自動登録用|参照用|
|:----------:|:----------:|:----------:|
|入力用 |代入値自動登録用|参照用|

**③項目**は2つ作り、それぞれ以下の3か所を入力します。
![b_08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/794820/9bcc014e-b7d3-3dde-dd23-7235086bb6fb.png)

|項目名（任意の名称）|入力方式（プルダウンから選択）|最大バイト数（任意の値）|
|:----------|:----------|:----------|
|ファイル名|文字列（単一行）|128|
|ファイル|ファイルアップロード|1000000|

入力したら作成ボタンを押します。
![b_09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/794820/3133666d-e0f0-208d-9404-dfebdb45b7ce.png)

これで「入力用」メニューグループの中に「SSL証明書」メニュー（パラメータシート）が作成できました。
![b_09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/794820/d3b68e86-845f-f897-26b0-1aad465aba8f.png)

登録開始ボタンを押して、項目もできてるか確認。
![b_10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/794820/ad960ef9-4524-c799-3835-39c51d3febdd.png)



#### 2.8 Ansible共通　＞＞　収集項目値管理
収集項目値管理では、収集項目（FROM）であるYAMLファイル名・変数名と、パラメータシート（TO）であるメニュグループ名・メニュー名・項目名を紐付けます。

入力する箇所はこちら。
![b_11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/794820/52819e3e-275e-c704-4c12-b314c8c6dac7.png)

**収集項目（FROM）**

|パース形式（プルダウンから選択）|PREFIX(ファイル名)|変数名|
|:----------|:----------|:----------|
|YAML|getSSL|※1|

**パラメータシート（TO）**

|メニューグループ:メニュー（プルダウンから選択）|項目（プルダウンから選択）|
|:----------|:----------|
|代入値自動登録用:5:SSL証明書|※2|

今回は変数が2個あるので、2個分登録します。下表のように、※1と※2を対応させます。

|※1（変数名）|※2（項目名）|
|:----------|:----------|
|SSL_file_name|パラメータ/ファイル名|
|SSL_file|パラメータ/ファイル|



#### 2.9 Ansible共通　＞＞　収集インターフェース情報
収集してきた値をITAのCMDBに登録する際のRESTAPIアクセスで必要になるため、RESTユーザー／パスワードを実行権限のあるユーザーで登録します。

「フィルタ」を押すと一覧で1行だけ表示されるので、その更新ボタンを押して以下の箇所を書き換えます。
![14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/794820/63dfdee7-4666-8adf-66f9-a74a663a0bf2.png)
![15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/794820/357e2b60-22db-8d5e-76f0-bdf0be84b551.png)
今回はITAにadministratorでログインしており実行権限があるので、RESTユーザー：administratorでそのパスワードを入れています。

|RESTユーザー|RESTパスワード|
|:----------|:----------|
|実行権限のあるユーザー|そのユーザーのパスワード|

更新ボタンを押します。



#### 2.10 Ansible-Legacy　＞＞　作業実行
登録したMovementとオペレーションを選択します。これですべての情報の紐付け完了です。
それでは実行ボタンを押してみます。
![b_12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/794820/daa296ae-8645-9bed-c994-9d74febdc6cb.png)
作業状態確認で、ステータスが完了になれば作業完了です。
![b_13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/794820/9f69f5ec-5614-115e-2ae5-747d45bda56e.png)



#### 2.11 入力用　＞＞　SSL証明書
値が収集されているか確認します。
「フィルタ」を押して一覧を表示し、該当パラメータを確認。
![122.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/794820/fadfb7ac-fb8d-cd09-8fc7-ea66306c2721.png)
パラメータに値が収集され、SSL証明書（test.crt）がダウンロードできれば成功です！



### 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 | 2021/10/01 09:25 |

![c_02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/794820/b9b2ceaa-7fe5-d574-2990-523a79cf8ceb.png)



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

まず一覧のGathered Factsの「メニュー定義・作成」を押す。
![c_03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/794820/4a55a24c-945b-0f35-6990-e74cb7a226a5.png)

「流用新規」を押す。
![c_04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/794820/48a48dd1-bbcd-b870-a3b1-e8931b11180e.png)

「メニュー名」「表示順序」だけ空の状態で複製されるので、そこだけ入力。
表示順序は何番でもよいですが、今回はシナリオ順に従って3にしておきます。
![c_05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/794820/5da6995a-f608-80be-2c9b-148c9fb4ab9e.png)

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

「作成」を押してメニュー作成完了。
![c_06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/794820/3c64bf19-679d-b69c-c0c7-0c763332f21f.png)



#### 3.3 入力用　＞＞　OS情報
それでは作成した「OS情報」メニューに値を入力します。
今回はaddressだけわざと違う値を入力しておきます。
![230302_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/794820/7601df1c-fc36-5df9-b452-ff04230527b5.png)



|パラメータ|値|
|:----------|:----------|
|ansible_architecture|x86_64|
|ansible_bios_version|1.11.0-2.el7|
|**ansible_default_ipv4__address**|**198.51.100.2**|
|ansible_default_ipv4__interface|eth0|
|ansible_default_ipv4__network|198.51.100.0|
|ansible_distribution|CentOS|
|ansible_distribution_file_path|/etc/redhat-release|
|ansible_distribution_file_variety|RedHat
|ansible_distribution_major_version|7|
|ansible_distribution_release|Core|
|ansible_distribution_version|7.8|
|ansible_machine|x86_64|
|ansible_memtotal_mb|1771|
|ansible_nodename|abcd.localdomain|
|ansible_os_family|RedHat|
|ansible_pkg_mgr|yum|
|ansible_processor_cores|1|　

全部入力したら登録を押します。



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

比較メニューグループから比較定義へ。
![c_08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/794820/6d5e9152-d339-1d99-c8c2-141e8c0dbdb4.png)

以下を入力します。
「全件一致」はパラメータシートの全項目を比較するという意味です。
★部分一致はこのシナリオの最後のTIPSで紹介しています！
![c_09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/794820/e078eea3-af8f-0e5b-8a29-a1bbca5c9e0f.png)

|比較定義名（任意の名称）|比較対象メニュー1（プルダウンから選択）|比較対象メニュー2（プルダウンから選択）|全件一致（プルダウンから選択）|
|:----------|:----------|:----------|:----------|
|OS情報|代入値自動登録用:8:OS情報|代入値自動登録用:2:Gathered Facts|●|



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

先ほど登録した「OS情報」の比較定義を選択し、比較ボタンを押します。
「基準日」とは、同じ比較定義を取得した日で比較するものなので、ここでは空白にしておきます。
![c_10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/794820/2a310c50-12a3-baf9-9de6-9ae28947a1a8.png)

すると、addressの値だけ赤色で出力され、差分有りということがわかります。
![230302_3_edit.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/794820/9ce780c2-a652-a48f-6317-35c5a2d6e6ea.png)


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



#### ～TIPS～ 項目限定比較
以上はパラメータシートの項目すべてを比較する方法をご説明しましたが、項目を限定して比較する方法もあるようなのでご紹介します。

#####～TIPS～1　比較　＞＞　比較定義
比較対象となる2つのメニューを登録し、比較定義名を付けます。
ここでは「IPアドレス」としました。
「全件一致」は●を付けません。
![c_18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/794820/e8602929-0d27-42c3-8627-14ab1b4e5a80.png)


|比較定義名（任意の名称）|比較対象メニュー1（プルダウンから選択）|比較対象メニュー2（プルダウンから選択）|全件一致（プルダウンから選択）|
|:----------|:----------|:----------|:----------|
|IPアドレス|代入値自動登録用:2:Gathered Facts|代入値自動登録用:8:OS情報|-　|



#####～TIPS～2　比較　＞＞　比較定義詳細
「対象カラム」で比較対象となる2つのメニュー項目を指定します。
![c_19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/794820/58fdeadf-236a-3c1f-94fe-89f7f35552db.png)

|比較定義名（プルダウンから選択）|表示項目名（任意の名称）|対象カラム1（プルダウンから選択）|対象カラム2（プルダウンから選択）|表示順|
|:----------|:----------|:----------|:----------|:----------|
|IPアドレス [ 2:Gathered Facts-8:OS情報 ]|IPアドレス|代入値自動登録用:2:Gathered Facts:3:パラメータ/ansible_default_ipv4/address|代入値自動登録用:8:OS情報:33:パラメータ/ansible_default_ipv4/address|1|

 

#####～TIPS～3　比較　＞＞　比較実行
それでは比較を実行してみます。
先ほど登録した比較定義名「IPアドレス」を選択し、基準日は空白のまま比較ボタンを押します。
![c_20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/794820/84c069b5-c13c-56ab-7022-23bfb48965af.png)

すると、addressの値が差分有りで出力されます。
![230302_4_edit.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/794820/dcb25c74-9bf7-0f31-fb69-a2265e9d09ec.png)

指定した項目だけ比較できていれば、成功です！



### 4. 【比較機能】SSL証明書の比較
では最後に、収集日が異なり内容に差分のあるSSL証明書同士を比較してみます。
なおITAの比較メニューグループでは今のところ、差分の有無だけわかるようになっており、具体的な差分箇所の表示まではできないようです。
![22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/794820/7ef42964-4f4c-27ef-e248-fbec0d363a99.png)



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

|オペレーション名（任意の名称）|実施予定日時（任意の時間）|
|:----------:|:----------:|
| getSSL2 | 2021/04/28 12:19 |
![c_12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/794820/01966c19-6e98-6365-2c25-36861c5fa55d.png)



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



#### 4.3 入力用　＞＞SSL証明書名
**2.6**と同様。オペレーションだけ比較用のgetSSL2にします。
![111.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/794820/39a17e93-147a-fb41-16b0-1f753b06666e.png)

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



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

![c_13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/794820/f94c9f9a-2fd3-e9a7-ba53-579928fcc172.png)

|Movement（プルダウンから選択）|Operation（プルダウンから選択）|
|:----------:|:----------:|
| getSSL | getSSL2 |
実行ボタンを押して、収集。



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



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

比較メニューグループから比較定義へ。
![c_08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/794820/6d5e9152-d339-1d99-c8c2-141e8c0dbdb4.png)

以下を入力します。
![c_15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/794820/b5a2a274-ab4d-d41f-4f0a-a6125deb325a.png)


|比較定義名（任意の名称）|比較対象メニュー1（プルダウンから選択）|比較対象メニュー2（プルダウンから選択）|全件一致（プルダウンから選択）|
|:----------|:----------|:----------|:----------|
|SSL証明書|代入値自動登録用:5:SSL証明書|代入値自動登録用:5:SSL証明書|●|



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

先ほど登録した「SSL証明書」の比較定義を選択し、比較対象となる２つの基準日時を入力します。
今回は以下の基準日時になっていたので、
getSSL1：2021/4/22　14:24
getSSL2：2021/4/22　14:32
この時点で収集されたファイルが反映されているであろう、以下の日時で比較してみます。

|比較定義（プルダウンから選択）|基準日1|基準日2|
|:----------|:----------|:----------|
|SSL証明書|2021/4/22　14:30|2021/4/22　15:00|

![113.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/794820/74152d50-4b78-3082-fd24-88d7c42054f4.png)
収集した時点と比較する時点は図にするとこのようになります。
![117.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/794820/1e114e88-de46-39c5-b7f3-ac75cbee0010.png)
入力したら比較ボタンを押します。

すると、「パラメータ/ファイル」が赤色で出力され、差分有りということがわかります。
![120.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/794820/8671329e-0a3e-2cab-78e6-d590399b1b04.png)

これでファイル同士の比較ができました！



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

詳しくはExastroコミュニティサイトの[こちら](https://exastro-suite.github.io/it-automation-docs/asset/Learn_ja/ITA-Conductor_ja.pdf)に載っています。



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

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



##関連リンク
+ [ITA_利用手順マニュアル　収集機能](https://exastro-suite.github.io/it-automation-docs/asset/Documents_ja/Exastro-ITA_%E5%88%A9%E7%94%A8%E6%89%8B%E9%A0%86%E3%83%9E%E3%83%8B%E3%83%A5%E3%82%A2%E3%83%AB_%E5%8F%8E%E9%9B%86%E6%A9%9F%E8%83%BD.pdf)
+ [Exastroコミュニティサイト](https://exastro-suite.github.io/it-automation-docs/index_ja.html)
+ [【随時更新】Exastroの参考になる記事をまとめてみた](https://qiita.com/ooif/items/79952398fb03ca3ec7fd)