Exastro IT Automation2.4のAnsible-Legacyモードを使ってみた

# 1. はじめに
Exastro IT Automation(以下Exastro)には、Ansibleと連携するAnsible-Driverがあり、Ansible-Legacy、Ansible-LegacyRole、Ansible-Pioneerという3つのモードがあります。
今回はその中でもAnsible-Legacyモードを使ってみたいと思います。

Ansible-Legacyモードについて先に詳しく知りたい！という方はコミュニティサイトのドキュメントを読んでみてくださいね。
[Ansible-Legacy](https://ita-docs.exastro.org/ja/2.4/manuals/ansible-driver/ansible_legacy.html)

# 2. Ansible-Legacyとは？
Ansible-Legacyは3つあるExastroのAnsible-Driverモードの中でも一番基本のモードです。
単体のYAMLファイルを「Playbook素材集」にて登録、その後作業内容に合わせて、「Movement」で、登録したいくつかのYAMLファイルを組み合わせて実行といった具合のことが出来ます。

# 3. 今回やること
今回はAnsible-Legacyを使って「Apache」と「Tomcat」のインストールと起動を行ってみたいと思います。
また、Tomcat上で簡単なHTMLファイルを公開してみたいと思います。
Movementを組み合わせたConductorを作り、パラメータシートから変数を代入して実行させます。
こちらが構成環境予定図になります。今回の環境では80番ポートと8080番ポートは解放しています。
![diagram.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3799017/6f5f36e6-635a-3741-61cd-88a6e3d1be87.png)

# 4. Ansible-Legacyモードを触る前の準備をします
早速Ansible-Legacyモードを触ってみたいところですが、事前に準備することが2つほどあるのでその準備をしましょう。

## 作業対象ホストの登録
作業の対象となるホストをExastroに登録します。
「Ansible共通」から「機器一覧」を選び登録ボタンから機器の登録をします。
![SS1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3799017/810a93b9-d970-24df-7d81-c6c8d9907c95.png)

入力が完了したら上部の編集確認ボタンから編集反映ボタンで登録しちゃいます。

## メニューグループの作成
パラメータシートを所属させるための、メニューグループを作ります。
このパラメータシートは後の手順で、変数と紐づけて値を代入します。
通常のものと、参照用の2つを作成します。

| メニューグループ名(ja) | メニューグループ名(en) | パラメータシート作成利用フラグ | 表示順序 |
|---|---|---|---|
|Ansible-Legacy実践用|Ansible-Legacy for Practice| True | 250 |
|Ansible-Legacy実践用(参照用)|Ansible-Legacy Practice (Reference)| True | 260 |

「管理コンソール」から「メニューグループ管理」を選び登録ボタンからメニューグループの登録をします。
![SS2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3799017/67002d5f-1f1c-eb6a-24ec-8df2906f2ef1.png)

入力が完了したら上部の編集確認ボタンから編集反映ボタンで登録してしまいます。

## Playbookの確認と設定ファイルの準備
Exastroには利便性の向上を目的としたサンプルPlaybookが初期状態でPlaybook素材集に登録されているそうです。
今回はこのPlaybook素材を活用していきましょう。

使用するのは以下のサンプルPlaybookです。
「Ansible-Legacy」の「Playbook素材集」から、以下の5つのPlaybookを探してチェックマークを付けて編集を押下してください。

| 項番 | Playbook素材名 | Playbook素材 |
|---|---|---|
| 80 | ~[Exastro standard] Copy file | Files_copy_local-to-remote.yml |
| 230 | ~[Exastro standard] Enable service startup | System_service_enabled.yml |
| 440 | ~[Exastro standard] Install dnf | Packaging_Os_dnf_present.yml |
| 580 | ~[Exastro standard] Run command | Commands_command.yml |
| 610 | ~[Exastro standard] Start service | System_service_started.yml |

実際に利用するPlaybookの中身を見ていきましょう。
虫眼鏡マークからymlファイルの中身を確認することができます。

![SS2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3799017/18abd2cb-ce33-dfd3-4fb8-011bf2f23a97.png)


***Packaging_Os_dnf_present.yml***・・・指定したパッケージをインストールします。変数には複数具体値変数が代入されます。
```yml:Packaging_Os_dnf_present.yml
# This Playbook file installs packages specified by "ITA_DFLT_Install_Target_packages".
# "ITA_DFLT_Install_Target_packages" can specify multiple files (list type).
# The task results are displayed at debug level 3 (-vvv).
- name: Install packages with the dnf package manager
  dnf:
    name: "{{ item }}"
    state: present
  with_items:
    - "{{ ITA_DFLT_Install_Target_packages }}"
  register: ITA_RGST_DnfInstall_Result

- name: Debug the result
  debug:
    var: ITA_RGST_DnfInstall_Result
    verbosity: 3


```

***Files_copy_local-to-remote.yml***・・・設定ファイルを配置します。
```yml:Files_copy_local-to-remote.yml
- name: Copy data from local to remote
  copy:
    src: "{{ item.0 }}"
    dest: "{{ item.1 }}"
    remote_src: no
  with_together:
    - "{{ ITA_DFLT_Src_Files }}"
    - "{{ ITA_DFLT_Dest_Files }}"

```

***System_service_started.yml***・・・指定したサービスを起動します。
```yml:System_service_started.yml
- name: Start service
  service:
    name: "{{ item }}"
    state: started
  with_items:
    - "{{ ITA_DFLT_Services }}"

```

***System_service_enabled.yml***・・・指定したサービスを自動的に起動するようにします。
```yml:System_service_enabled.yml
- name: Enable service
  service:
    name: "{{ item }}"
    enabled: true
  with_items:
    - "{{ ITA_DFLT_Services }}"

```

***Commands_command.yml***・・・サービスが起動したことを確認します。
```yml:Commands_command.yml
# This Playbook file is simple. 
# It passes the variable given string, "ITA_DFLT_Command_String", to the Ansible command module and executes it.
# The task results are displayed at debug level 3 (-vvv).
- name: Execute commands on targets
  command: "{{ ITA_DFLT_Command_String }}"
  register: ITA_RGST_Command_Result

- name: Debug the result
  debug:
    var: ITA_RGST_Command_Result
    verbosity: 3


```



Playbookは以上ですが、Files_copy_local-to-remote.ymlで使用するApacheの設定ファイルを用意します。
```txt:httpd_config.txt
# ----- ITA Legacy Practice -----
ServerRoot "/etc/httpd"
Listen 80
Include conf.modules.d/*.conf
User apache
Group apache
ServerAdmin root@localhost
ServerName www.example.com:80

<Directory />
  AllowOverride none
  Require all denied
</Directory>
  DocumentRoot "/var/www/html"
<Directory "/var/www">
  AllowOverride None
  Require all granted
</Directory>
<Directory "/var/www/html">
  Options Indexes FollowSymLinks
  AllowOverride None
  Require all granted
</Directory>
<IfModule dir_module>
  DirectoryIndex index.html
</IfModule>
<Files ".ht*">
  Require all denied
</Files>
  IncludeOptional conf.d/*.conf
  ErrorLog "logs/error_log"
  LogLevel warn
<IfModule log_config_module>

    LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
    LogFormat "%h %l %u %t \"%r\" %>s %b" common
 
    <IfModule logio_module>
      LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %I %O" combinedio
    </IfModule>
CustomLog logs/access_log combined

</IfModule>
<IfModule alias_module>
  ScriptAlias /cgi-bin/ "/var/www/cgi-bin/"
</IfModule>
<Directory "/var/www/cgi-bin">
  AllowOverride None
  Options None
  Require all granted
</Directory>
<IfModule mime_module>
  TypesConfig /etc/mime.types
  AddType application/x-compress .Z
  AddType application/x-gzip .gz .tgz
  AddType text/html .shtml
  AddOutputFilter INCLUDES .shtml
</IfModule>
  AddDefaultCharset UTF-8
<IfModule mime_magic_module>
  MIMEMagicFile conf/magic
</IfModule>
EnableSendfile on
IncludeOptional conf.d/*.conf
```

また、Tomcat上で公開するHTMLファイルも用意します。
```txt:index.html
<html>
  <head>
    <meta charset="UTF-8">
    <title>私のページ</title>
  </head>
  <body>
    Ansible-Legacy実践
    <br>
  </body>
</html>
```
これらのファイルは後に「ファイル管理」で登録を行います。

# 5. いよいよAnsible-Legacyモードを触ります！
ここまででAnsible-Legacyモードを触る準備が出来ました。
ここからAnsible-Legacyモードで「Apache」と「Tomcat」をインストールしていきましょう！

## Movementの作成
「Ansible-Legacy」から「Movement一覧」を選び登録ボタンからMovementの登録をします。
今回は以下のように設定しました。
| Movement名 | ホスト指定形式 |
|---|---|
|Install_Packages| IP |
|Start_Service| IP |

![SS3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3799017/c0d2dc7e-64c6-92a0-dd0d-b1a0b1fbc931.png)
入力が完了したら上部の編集確認ボタンから編集反映ボタンで登録しましょう！

## 素材ファイルの登録
「Ansible共通」から「ファイル管理」を選び登録ボタンからファイルの登録をします。
Playbook以外に使用するファイルがあれば今回のようにここで登録を行います。
|ファイル埋込変数名 |ファイル素材|
|---|---|
|CPF_httpd_conf| httpd_config.txt|
|CPF_index_html| index.html |

![SS5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3799017/efaf2a78-bd1b-0bc0-aedf-05e163b8f219.png)
入力が完了したら上部の編集確認ボタンから編集反映ボタンで登録！

## MovementとPlaybookの紐付
「Ansible-Legacy」から「Movement-Playbook紐付」を選び登録ボタンから登録をします。
| Movement | プレイブック素材 | インクルード順序 |
|---|---|---|
| Install_Packages | ~[Exastro standard] Install dnf | 1 |
| Start_Service | ~[Exastro standard] Copy file	 | 1 |
| Start_Service | ~[Exastro standard] Start service | 2 |
| Start_Service | ~[Exastro standard] Enable service startup | 3 |
| Start_Service | ~[Exastro standard] Run command | 4 |

![SS6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3799017/706c4d46-bde9-ec84-e3b5-953dad556dfa.png)

入力が完了したら上部の編集確認ボタンから編集反映ボタンで登録！登録！登録！

## Conductorを作成
MovementをまとめてConductorを作成します。
「Conductor」から「Conductor編集/作業実行」を選びConductorの登録をします。

名称を追加したら、下部のMovement名と書いてある場所からMovementをドラッグ＆ドロップで配置していきます。
配置が完了したら「Start」のノードから「in」と「out」を接続し「End」のノードまで繋いでいきます。
ノードの順番は「Install_Packages」→「Start_Service」の順番にします。
Conductor名称は「サービス追加」にします。
![SS7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3799017/1e91a215-fe6b-ff02-191a-62ca5b8e4973.png)

画像のようにノードが接続出来たら上部の登録ボタンを押してConductorを登録しよう！

## オペレーションの登録
「基本コンソール」から「オペレーション一覧」を選び登録ボタンを押してオペレーションの登録をします。
実施予定日時は目安なので実際に実行する日時である必要はありません。
|オペレーション名 | 実施予定日時|
|---|---|
|Install Apache| 任意 |
|Install Tomcat| 任意 |

![SS8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3799017/220ac787-d814-3604-1762-11919ebc81a6.png)
適当な日付を入れることが出来たら上部の編集確認ボタンから編集反映ボタンで登録するんだ！

## パラメータシートの作成
「パラメータシート作成」から「パラメータシート定義・作成」を選びパラメータシートの作成をします。
まずはパラメータシート名に「Ansible-Legacy実践編」、パラメータシート名(REST)に「Ansible-Legacy_in_practice」と入力します。
次に「対象メニューグループを選択」ボタンで対象メニューグループを選びます。
![SS9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3799017/03ceea3d-6679-7a4f-56dd-5058b8afc3c0.png)

対象メニューグループは以下の図のように、「入力用」を「Ansible-Legacy実践用」に「参照用」を「Ansible-Legacy実践用(参照用)」に指定して決定ボタンで確定させます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3799017/9ea6c85e-3ed8-d547-0ab9-628d8236a41f.png)

対象メニューグループを定めたら、パラメータシートの項目名を決めていきます。
項目ボタンで項目を増やしたら、下記の6項目を設定していきます。
| 設定項目 | 項目1設定値 | 項目2設定値 | 項目3設定値 |
|---|---|---|---|
| 項目の名前 |パッケージ名|サブパッケージ名|ファイルコピー元|
| 項目の名前(Rest API用) |ITA_DFLT_Install_Target_packages|ITA_DFLT_Install_Target_packages_sub|ITA_DFLT_Src_Files|
| 最大バイト数 | 32 | 32 | 32 |

| 設定項目 | 項目4設定値 | 項目5設定値 | 項目6設定値 |
|---|---|---|---|
| 項目の名前 |ファイルコピー先|サービス名|コマンド|
| 項目の名前(Rest API用) |ITA_DFLT_Dest_Files|ITA_DFLT_Services|ITA_DFLT_Command_String|
| 最大バイト数 | 64 | 32 | 32 |

![SS10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3799017/8e8dfeff-0937-6d5c-64d1-444e8b9cf293.png)

![SS10.1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3799017/4e76ce59-03a4-4742-bc79-2fc4bd049dee.png)


ここまで全部出来たら作成ボタンでパラメータシートを作成しちゃいましょう！

## パラメータシートにパラメータを登録
ここからはターゲットホストの設定に使用するデータを登録します。
「Ansible-Legacy実践用」から「Ansible-Legacy実践編」を選び登録ボタンを押してパラメータの登録をします。
| ホスト名 | オペレーション名 | パッケージ名 | サブパッケージ名 | ファイルコピー元 | 
|---|---|---|---|---|
| (対象のホスト) |Install Apache|httpd|(空欄)|"{{ CPF_httpd_conf }}"|
| (対象のホスト) |Install Tomcat|tomcat|tomcat-webapps|"{{ CPF_index_html }}"|

| ファイルコピー先 | サービス名 | コマンド |
|---|---|---|
|/etc/httpd/conf/httpd.conf|httpd|systemctl status httpd|
|/usr/share/tomcat/webapps/ROOT/index.html|tomcat|systemctl status tomcat|

![SS11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3799017/cf52c71c-835a-8d03-6f5b-d4979406e446.png)

![SS11.1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3799017/8566c5dc-9aae-66d6-c020-fadcbe07157d.png)

データが入れられたら上部の編集確認ボタンから編集反映ボタンで登録しちゃおう！

## 代入値自動登録設定
「Ansible-Legacy」から「代入値自動登録設定」を選び登録ボタンを押して代入値自動登録設定をします。
| メニュー | 登録方式 | Movement | Value変数-変数名 | 代入順序 |
|---|---|---|---|---|
| 代入値自動登録用:Ansible-Legacy実践編:パラメータ/パッケージ名 | Value型 | Install_Packages | Install_Packages:ITA_DFLT_Install_Target_packages | 1 |
| 代入値自動登録用:Ansible-Legacy実践編:パラメータ/サブパッケージ名 | Value型 | Install_Packages | Install_Packages:ITA_DFLT_Install_Target_packages | 2 |
| 代入値自動登録用:Ansible-Legacy実践編:パラメータ/ファイルコピー元 | Value型 | Start_Service | Start_Service:ITA_DFLT_Src_Files | |
| 代入値自動登録用:Ansible-Legacy実践編:パラメータ/ファイルコピー先 | Value型 | Start_Service | Start_Service:ITA_DFLT_Dest_Files | |
| 代入値自動登録用:Ansible-Legacy実践編:パラメータ/サービス名 | Value型 | Start_Service | Start_Service:ITA_DFLT_Services | |
| 代入値自動登録用:Ansible-Legacy実践編:パラメータ/コマンド | Value型 | Start_Service | Start_Service:ITA_DFLT_Command_String | |

![SS12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3799017/6648cc87-2d57-24ab-c209-7044742b56a1.png)

設定が終わったら上部の編集確認ボタンから編集反映ボタンで登録いってみよう！

## 作業実行
「Conductor」から「Conductor編集/作業実行」を選び画面上部の選択ボタンを押して作成したConductorを呼び出します。
![SS13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3799017/df136e86-9d75-9751-6cef-1120e593f12d.png)

呼び出せたら作業実行ボタンでオペレーションを選択し、作業を実行します。
先に「Install Apache」のオペレーションを選択し作業実行を行い、次に「Install Tomcat」のオペレーションで作業実行をします。
![SS14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3799017/7abbaf40-1d90-b64e-5768-e02bf7e8618f.png)

## 実行結果確認
「Conductor」から「Conductor作業確認」を選び詳細を確認したいノードの「Done」または「ERROR」の部分をクリックすると、作業の詳細を確認することが出来ます。
![SS15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3799017/b4e903d8-3e7f-07ac-1be4-b296661ea9db.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3799017/7566934e-dd03-27c9-14f7-a68b2d3ca28a.png)

作業実行が完了した後にhttp://(ターゲットホストのIPアドレス):80にアクセスしてみると、Apacheのテストページが表示されました！
http://(ターゲットホストのIPアドレス):8080にもアクセスしてみると、Ansible-Legacy実践というページが表示されています！

# 6. いかがでしたか？
今回はAnsible-Legacyモードを使ってApacheとTomcatをインストールしてみました。
パラメータシートの値を変更することでApacheやTomcat以外もインストールすることが出来るので、他にも色々試してみてください！
もっとAnsible-Legacyモードについて詳しく知りたい！という方は[コチラ](https://ita-docs.exastro.org/ja/2.4/manuals/ansible-driver/ansible_legacy.html)からどうぞ。