マルチクラウドプロビジョニング(AWS＋Azure)を「Exastro×Terraform×Ansible」で実施してみた

※本記事はExastro IT AutomationをAWSインスタンス上にインストールしていることを前提としています。
インストールについては過去記事「[Exastro IT Automationをインストールしてみた（v1.6.3）](https://qiita.com/standsetx/items/54ff0786db151d980026)」
をご覧ください。

#はじめに
マルチクラウドとは、複数のクラウド環境を利用するクラウド活用法のことで、主に複数のクラウドベンダーから提供されるパブリッククラウドを利用することを指します。

マルチクラウドにはどんな恩恵があるのか？
複数のベンダーを併用して利用することで、システムの冗長化やバックアップ、リカバリーといったリスクの分散(災害対策)が容易となります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/652376/dec1d778-b427-ea66-9701-1fd86d203d12.png)



また複数のベンダーで同じ機能が提供されている場合には、
価格が安い方の機能を主に使うことによって運用コストを抑えることができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/652376/220b806e-9b5e-3f72-4f1f-a7f96e1b4f78.png)



逆に別々の機能が提供されている場合には、
それらの各クラウドで使える機能を組み合わせて使うことにより、機能の選択肢が増えます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/652376/c3854d2b-aee3-78de-9698-153e1bf8e1e4.png)



今回はそのマルチクラウドのプロビジョニング(AWS+Azure)を、Exastro×Terraform×Ansibleでやってみたいと思います。AWS上に建てたITAサーバから各パブリッククラウド上にVMを作成し、初期設定してhttp(apache)サーバを建てるまでを行います。

今回の記事では、ExastroでTerraformを扱っていることが特徴的なので、
Terraformとは何かについて、少しだけ触れておきます。

##Terraformとは
TerraformとはHashiCorp社が提供するオープンソースのツールで、クラウド上のリソースを定義ファイルに沿って生成、破棄、操作してインフラの構築や設定のコード化を実行することができますインフラの構成を宣言的に定義することが特徴で、構築手順をイチから書く必要がなく構成定義のみに集中することができます。

ExastroにおけるTerraform Driverは、IT Automation(以下、ITAと略)システムのオプションとして機能し、ITAシステムで登録したTerraform EnterpriseまたはTerraform Cloudに対し、Organization の作成、Workspaceの作成、作業の実行及び作業ログの取得が可能です。

以下はTerraformにおける、Organization、Workspace、Stateの関係図です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/652376/79b7a95b-5ecb-5517-80fa-074d2ba5c4c6.png)


今回はITAにTerraform Cloudを登録し作業を行い、各クラウド上にインフラ構築していきます。

その他ITAやAnsible Driverについての詳細は過去の記事を参照してください。
[【随時更新】Exastroの参考になる記事をまとめてみた](https://qiita.com/ooif/items/79952398fb03ca3ec7fd)

また、Exastroの用語説明などについての詳細は、Exastroコミュニティページをご覧ください。
[Exastroコミュニティページ](https://exastro-suite.github.io/docs/index_ja.html)



#作業環境

* Exastro IT Automation ver 1.6.3
* Red Hat Enterprise Linux release 8.3(ITAサーバ用)
 * AWS EC2インスタンス
 * インスタンスタイプ-t2.medium
* Terraform Cloud
* Ansible Core 2.10.6
* AWS
* Microsoft Azure
* Windows 10(ITAクライアントPC)
* Google Chrome
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/652376/a108663d-a7c7-8280-7c1a-e9cc2cb482f9.png)




#概要
今回はTerraform DriverとAnsible Driverの一つであるAnsible-Legacyを使って、各パブリッククラウド上のVM作成と作成したVMに対して、Apacheのインストールと起動を行いたいと思います。
下図のようなMovementと、3つのサブConductorを作成しそれをまたメインConductorでまとめ、実行していきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/652376/f82e5db5-a358-4ca8-a200-c890af5845a5.png)

##具体的な手順はともかくとりあえず実行してみる
具体的な手順を書き連ねる前に、今記事で紹介するConductorを実行するとどのようなインスタンスがAWS・Azure上にできるか見てみましょう。

以下は実行する前のAWS・Azureの状態です。

***AWS***
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/652376/e04bce4f-982b-2494-4929-e50f9be67667.png)
このようにインスタンスが何もありません。

***Azure***
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/652376/3a2f49d8-7f3f-5804-73c8-a258e2e1bffc.png)
Azureに関しては、リソースグループがNetworkWatcherのみで他のリソースグループは存在していません。

それではITA上から
AWSには「t2.micro」のWebサーバを3台
Azureには「Standard_B1ls」のWebサーバを3台と打ち込み・・・
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/652376/789a981d-a905-3caa-e43f-1005b16698d7.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/652376/73bb0420-d315-6651-e55b-1381d6d70897.png)



「Conductor」メニューグループ>>「Conductor作業実行」から先程のConductorを選択し
画面下「実行」ボタンを押下し実行します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/652376/cdc21b57-366e-b594-953c-13f068be6f7b.png)

数分後、Conductorの実行が完了しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/652376/aa8fbdaf-a38a-3520-2b8c-1aa9b05f2424.png)

実行後のAWSにインスタンスが追加されているか確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/652376/40cfbc18-1041-dd0a-6038-5dea490df357.png)

「ita-demo-instance」という名前のインスタンスが3つ作成されていることがわかります。
また、設定通りインスタンスタイプもすべて「t2.micro」です。

一方Azureはどうでしょうか
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/652376/1a9b01aa-3a7c-2514-897d-793e355e78b1.png)

「ita-demo-rg」という名前のリソースグループが作成され、
その中に「ita-demo-web-azure」という仮想マシン3つが建ちました。

作成したVMにブラウザからアクセスしてみると
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/652376/50090795-85a6-d23b-5185-286baf2743e9.png)

このようにhtmlファイルが各VMに配置され、Webサーバとして機能させることができました。

それでは、先程打ち込んだ内容を以下のように変更してもう一度実行します。
>AWS「t2.micro」3台→「t2.small」5台
>Azure　　3台　　　→　　　1台
>htmlファイル→タイトルと本文の修正

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/652376/38eb9fd1-64b8-67d1-6e7e-3df2e36e0692.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/652376/ff1bfdb6-fa61-01e3-7305-d3a185a5dda1.png)


Conductor実行後のAWSインスタンスはどうなっているでしょうか
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/652376/32ac5c58-313c-c9c1-e103-811fcb0e0feb.png)

AWSのインスタンスは3つから5つに増設され、インスタンスタイプもt2.microからt2.smallに変わっています。

Azureは・・・
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/652376/a5f95cd3-9cee-3ac1-6800-916dc9041998.png)

Azureのインスタンスは3つから「ita-demo-web-azure-0」のみの1つになっています。

最後に作成したWebサーバに接続して内容が変更されているか確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/652376/6b165add-b5b7-0935-c038-3f63e94b90c4.png)


以上のように、ITA上の定義内容を変更して実行するだけで
各クラウド上のインスタンスの登録や廃止、変更が一元に行えます。

それではどうすればITAをつかってマルチクラウドのプロビジョニングを行えるのか
具体的な手順を以降で説明したいと思います。


#作業手順
前章冒頭で述べたように、今回はTerraform DriverとAnsible-Legacyを使って各パブリッククラウド上にVMを作成し、そのVMに対してApacheのインストールと起動を行います。各パブリッククラウド上のVM作成と作成したVMに対して、Apacheのインストールと起動を行います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/652376/6767d623-3283-2a4b-b1a1-e9a08cff9cbc.png)

Conductor①・②では、Terraform DriverでVMを作成。その後作成したVMに対し、各リストを取得してITAの「機器一覧」・「ホスト紐付け管理」へ登録します。
また、後にインスタンス数やサイズを変更して実行した場合(IPアドレスやDNSの変更)やVMが削除された場合、
取得したリストと比較してITA上の「機器一覧」・「ホスト紐付け管理」の更新または廃止を行います。

Conductor③では、「機器一覧」・「ホスト紐付け管理」に登録されたホストに対して、ポート開放とApacheのインストール・リブートを行い、事前に用意したhtmlファイルを配置します。
なお、再度実行した際にインスタンスに変更がない場合はリブートを行いません。


具体的な手順は以下のようになります。

1. 事前準備
 1. 作業対象ホストの登録
 2. ホストグループ設定
 3. メニューグループの作成
 4. テンプレートファイルの登録
 5. 投入オペレーション登録

2. Terraform Driver編
 1. インタフェース情報変更
 2. Organization管理情報登録
 3. Workspaceの登録
 3. Movement作成
 3. Module素材登録
 4. Movement詳細へ登録
 5. パラメータシートの作成
 6. 代入値自動登録設定

3. Ansible-Legacy編
 1. Movement作成
 2. Playbook素材登録
 3. Movement詳細へ登録
 4. パラメータシートの作成
 5. 代入値自動登録設定

4. Conductor実行編
 1. パラメータの登録
 2. Conductorの作成
 3. Conductor実行
 4. 実行確認

#1.事前準備
Module素材やPlaybookを登録しMovementを作成する前に、幾つか事前に準備する必要があります。
この章ではその事前準備・設定を行っていきます。

##1.1.作業対象ホストの登録
作業の実行対象となるホストをITAに登録します。

今回作業の対象となるのは、「ITAサーバ自身」と「作成したVM」群になるのですが「作成したVM」群はConductor①・②で実行されるPlaybookですべて登録されるため、今回は登録する対象である「ITAサーバ」を作業対象ホストに登録します。

メインメニュー(DASHBOARD)から「基本コンソール」メニューグループ >> 「機器一覧」を選択します

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/652376/6ab9a2e7-18be-6b43-dd03-3a8ebaf6deeb.png)

画面が遷移するので、登録欄から登録開始を選択します。
ITAサーバのHW機器対象種別、ホスト名、IPアドレス等を入力していきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/652376/482b7244-dd60-5683-4b3a-67d60ceb2f75.png)

入力内容を確認後、「登録」ボタンをクリックして登録します。

##1.2.ホストグループの設定
今回Webサーバ構築のためのPlaybookを、ホストグループに対して実行します。
なのでそのホストグループを事前に設定する必要があります。

###ホストグループについて
ホストグループとは、ホスト群を論理的な単位(機能・役割)でまとめたグループを指します。

先程述べたように、Playbookを使って作成したVM群に対してWebサーバ設定を行うのですが、ITA側はConductorが実行されるまで設定する対象のホスト(VM群)がわかりません。
そこで、ホストグループを利用します。

事前に用意したホストグループに対してパラメータを設定し代入値自動登録を行うことで
実行後に紐づくホスト(VM群)に対しても自動でパラメータを設定することができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/652376/7cd0b103-2965-8c1f-d21a-62988644180e.png)




###ホストグループ設定

メインメニュー(DASHBOARD)から「基本コンソール」メニューグループ >> 「機器一覧」を選択します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/652376/618bd37f-2f96-8c84-e490-41376dca0746.png)

画面が遷移するので、登録欄から登録開始を選択します。
「Webサーバ」「Webサーバ_AWS」「Webサーバ_Azure」を登録します。
優先順位はわかりやすいようにそれぞれ「100」「200」「300」とします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/652376/1e125752-c32b-3287-329c-3f3fff3ca812.png)

入力内容を確認後、「登録」ボタンをクリックして登録します。

次に先程登録した「Webサーバ」と「Webサーバ_AWS」・「Webサーバ_Azure」を、
ホストグループの親子として紐付けします。

親子紐付けをすると、実行対象として親のホストグループが選択された時、親と子の関係にあるすべてのホストグループが選択されます。

左メニューグループから「ホストグループ親子紐付」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/652376/bef84817-d698-2d15-6033-59af58aee8eb.png)

画面が遷移するので、登録欄から登録開始を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/652376/5c9b9d74-932c-75f1-ce5f-6ec158044d55.png)
記入内容を確認後、「登録」ボタンをクリックして登録します。

##1.3.メニューグループ作成
後の手順で、パラメータシートを作成して、変数と紐づけて値を代入します。
その時作成するパラメータシートを所属させるための、メニューグループを作ります。

メインメニュー(DASHBOARD)から「管理コンソール」メニューグループ >> 「メニューグループ管理」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/652376/d7dd4f1c-3c66-b9d2-7593-c7d8efe888b2.png)

画面が遷移するので、登録欄から登録開始を選択します。
「コード管理」と「Webサーバ構築」の2つを登録します。
表示順序はそれぞれ「500」「600」とします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/652376/dace4069-5cac-b7f0-a76d-a46ad194186d.png)
記入内容を確認後、「登録」ボタンをクリックして登録します。

「コード管理」はデータシートを設定するためのメニューグループです。
「Webサーバ構築」はVMの構築やその後のWebサーバを構築するための設定を行うメニューグループです。

##1.4.テンプレートファイルの登録
Webサーバに配置するhtmlファイルを事前にITAに登録しておきます。

今回使用するファイルは以下のものです。

```html:index.html
<!DOCTYPE HTML>
<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>{{ VAR_WebTitleString }}</title>
  </head>
  <body>
    {{ VAR_WebBodyString }}
    <br>
    (ホスト名：{{ __loginhostname__ }})
  </body>
</html>
```
```VAR_WebTitleStrig``` ```VAR_WebBodyString```はそれぞれ変数として定義され、
代入値を設定することでWebのタイトル、本文を設定することができます。
また開いたWebサイトがどのVMなのかわかりやすいように、
```ホスト名：{{ __loginhostname__ }}```でWebサーバのホスト名を表示するようにしました。

以上のファイルを用意して、
メインメニュー(DASHBOARD)から「Ansible共通」メニューグループ >> 「テンプレート管理」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/652376/adc7c353-cfa6-9c1a-d890-e973c407652e.png)

画面が遷移するので、登録欄から登録開始を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/652376/8b6d94b1-7c58-2005-e7b3-095e2d0b4001.png)
記入内容を確認後、「登録」ボタンをクリックして登録します。

##1.5.オペレーションの登録
オペレーションとは、作業全体を示すITA内で使用する作業名称のことを指します。

今回、AWS・Azureに同じPlaybookを流用して設定するので、オペレーションを2つ用意する必要があります。

メインメニュー(DASHBOARD)から「基本コンソール」メニューグループ >> 「投入オペレーション一覧」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/652376/b335c8f0-900e-949f-ad41-8ec79eefd6a2.png)

「demo_sub」は、後にConductorが分岐したときに使用します。

画面が遷移するので、登録欄から登録開始を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/652376/1c898e21-dce2-9f22-2f2f-d58f8c2caad1.png)
記入内容を確認後、「登録」ボタンをクリックして登録します。

※「実施予定日時」はITA内部で保持するデータであり、実際にオペレーションを実施する時間ではありません

#2.Terraform Driver編
この章では、ITAとTerraform Cloudの連携からWorkspaceの作成、Module素材の登録、
パラメータシートの作成等を行っていきます。

##2.1.インタフェース情報変更
Terraform DriverとTerraform Cloudを連携させます。

まずはじめに、ブラウザからTerraform Cloudにログインし、
[User Settings]→[Tokens]→[Create an API token]の順でクリックして得られる
ユーザトークンを発行しておく必要があります。
発行後、メモしておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/652376/5014bccd-26d4-bcf1-e8f9-ab91a63cb1d7.png)

再度ITA画面に戻り、メインメニュー(DASHBOARD)から「Terraform」メニューグループ >> 「インターフェース情報」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/652376/1f6f13e6-a756-59c0-0522-d5a773e6362b.png)
画面が遷移するので、「一覧」欄から「更新」ボタンをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/652376/1f07f1b4-61a3-a48f-37c5-1a3cd0bffb1c.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/652376/c39a3238-9b1b-bab3-96e9-51c1403b8057.png)
記入内容を確認後、「更新」ボタンをクリックして登録内容を更新します。

##2.2.Organizations管理情報登録
Terraform CloudのOrganizationを登録します。
（ない場合はITA上でOrganizationを新規登録できるので、事前に登録しておく必要はありません）

左メニューグループから「Organizations管理」を選択します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/652376/db146ff8-3ea2-d5de-8280-331a57759945.png)
画面が遷移するので、登録欄から登録開始を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/652376/dbb170b5-ed89-494f-a998-bbb3cb335aec.png)
記入内容を確認後、「登録」ボタンをクリックして登録します。
また、「フィルタ」ボタンを押下することで先程登録したレコードを確認できます。
登録したレコードの「連携状態チェック」を押下すると、「連携状態チェック」の下にOrganizationの連携状態が表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/652376/e2700cb7-30d4-b7c7-432e-4a13136ccb78.png)

Terraform Cloudにログインし、Organizationが作成されているか確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/652376/d7c15816-e099-28db-402d-12dc653b84be.png)


##2.3.Workspaceの登録
Terraform CloudのWorkspaceを登録します。
（ない場合はITA上でWorkspaceを新規登録できるので、事前に登録しておく必要はありません)

左メニューグループから「Workspaces管理」を選択します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/652376/b93c7211-c76d-a9f5-016f-3cf8714d74eb.png)
画面が遷移するので、登録欄から登録開始を選択します。
ここではAWS実行用とAzure実行用の2つのWorkspaceを登録します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/652376/e986ea6e-8a86-6b3e-fe04-ef16ea6345ac.png)
記入内容を確認後、「登録」ボタンをクリックして登録します

また、「フィルタ」ボタンを押下することで先程登録したレコードを確認できます。
登録したレコードの「連携状態チェック」を押下すると、「連携状態チェック」の下にOrganizationの連携状態が表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/652376/e442740d-6b09-0a00-cd5e-bcd476b8934a.png)
Terraform Cloudにログインして、Workspaceが作成されているか確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/652376/467c104a-f35a-9053-b64f-e3679d45997f.png)

##2.4.Movementの作成
Module素材に関連付けるMovementの設定を行います。

左メニューグループから「Movement一覧」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/652376/c73b0ecb-8834-2af1-2ba9-a3e3aa4aee3b.png)

画面が遷移するので、登録欄から登録開始を選択します。
ここではAWS実行用とAzure実行用の2つのMovementを登録します。
また、先程登録したWorkspaceと関連付けます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/652376/e4957183-c55d-de41-13f7-2a383412fa49.png)
記入内容を確認後、「登録」ボタンをクリックして登録します。

##2.5.Module素材登録
実行するModule素材をITAに登録します。

###Module素材
今回ITAに登録するModule素材は以下の4つです。

***AWSインスタンス作成用***

aws_create_instance_variables.tf ・・・変数定義ファイル

```tf:aws_create_instance_variables.tf
variable "access_key" {}
variable "secret_key" {}
variable "region" {}
variable "ami" {}
variable "key_name" {}
variable "security_group" {}
variable "tags_name" {}
variable "hello_tf_instance_count" {
    default = 2
}
variable "hello_tf_instance_type" {
    default = "t2.micro"
}
```

aws_create_instance.tf　・・・AWSインスタンス作成用リソース定義ファイル

```tf:aws_create_instance.tf
terraform {
  required_version = "~> 0.12"
}

provider "aws" {
  access_key = var.access_key
  secret_key = var.secret_key
  region = var.region
}

resource "aws_instance" "hello-tf-instance" {
  ami             = var.ami
  key_name        = var.key_name
  security_groups = [var.security_group]
  tags = {
    Name = "${var.tags_name}-${count.index+1}"
  }
  count = var.hello_tf_instance_count
  instance_type = var.hello_tf_instance_type
}
```

***Azureインスタンス作成用***

azure_create_instance_variables.tf　・・・変数定義ファイル

```tf:azure_create_instance_variables.tf

variable "subscription_id" {}
variable "tenant_id" {}
variable "client_id" {}
variable "client_secret" {}
variable "resource_group_name" {}
variable "security_group" {}
variable "location" {}
variable "Vnet_name" {}
variable "Vnet_address_space" {}
variable "subnet_name" {}
variable "address_prefixes" {}
variable "public_ip_name" {}
variable "allocation_method" {}
variable "domain_name_label" {}
variable "network_interface_name" {}
variable "NIC_name" {}
variable "VM_name" {}
variable "VM_size" {}
variable "publisher" {}
variable "offer" {}
variable "sku" {}
variable "source_image_version" {}
variable "admin_username" {}
variable "ssh_public_key" {}
variable "os_disk_name" {}
variable "caching" {}
variable "storage_account_type" {}
variable "VM_count" {}
```

azure_create_instance.tf　・・・Azureインスタンス作成用リソース定義ファイル

```tf:azure_create_instance.tf
provider "azurerm" {
  features {}
  subscription_id = var.subscription_id
  client_id       = var.client_id
  client_secret   = var.client_secret
  tenant_id       = var.tenant_id
}

resource "azurerm_resource_group" "hogehoge" {
  name = var.resource_group_name
  location = var.location
}

resource "azurerm_network_security_group" "hogehoge" {
    name =var.security_group
    location = azurerm_resource_group.hogehoge.location
    resource_group_name = azurerm_resource_group.hogehoge.name

    security_rule {
        name                       = "SSH"
        priority                   = 1001
        direction                  = "Inbound"
        access                     = "Allow"
        protocol                   = "Tcp"
        source_port_range          = "*"
        destination_port_range     = "22"
        source_address_prefix      = "*"
        destination_address_prefix = "*"
    }
    security_rule {
        name                       = "HTTP"
        priority                   = 1002
        direction                  = "Inbound"
        access                     = "Allow"
        protocol                   = "Tcp"
        source_port_range          = "*"
        destination_port_range     = "80"
        source_address_prefix      = "*"
        destination_address_prefix = "*"
    }
}

resource "azurerm_virtual_network" "hogehoge" {
  name = var.Vnet_name
  address_space = [var.Vnet_address_space]
  location = azurerm_resource_group.hogehoge.location
  resource_group_name = azurerm_resource_group.hogehoge.name
}

resource "azurerm_subnet" "hogehoge" {
    name                 = var.subnet_name
    resource_group_name  = azurerm_resource_group.hogehoge.name
    virtual_network_name = azurerm_virtual_network.hogehoge.name
    address_prefixes     = [var.address_prefixes]
}

resource "azurerm_public_ip" "hogehoge" {
  count                 = var.VM_count
  name                  = "${var.public_ip_name}-${count.index}"
  location              = azurerm_resource_group.hogehoge.location
  resource_group_name   = azurerm_resource_group.hogehoge.name
  allocation_method     = var.allocation_method
  domain_name_label     = "${var.domain_name_label}-${count.index}"
}

resource "azurerm_network_interface" "hogehoge" {
    count               = var.VM_count
    name                = "${var.network_interface_name}-${count.index}"
    location            = azurerm_resource_group.hogehoge.location
    resource_group_name = azurerm_resource_group.hogehoge.name

    ip_configuration {
        name                          = var.NIC_name
        subnet_id                     = azurerm_subnet.hogehoge.id
        private_ip_address_allocation = var.allocation_method
        public_ip_address_id          = azurerm_public_ip.hogehoge[count.index].id
    }
}

resource "azurerm_network_interface_security_group_association" "hogehoge" {
  count = var.VM_count
  network_interface_id      = azurerm_network_interface.hogehoge[count.index].id
  network_security_group_id = azurerm_network_security_group.hogehoge.id
}

resource "azurerm_linux_virtual_machine" "hogehoge" {
  count                 = var.VM_count
  name                  = "${var.VM_name}-${count.index}"
  resource_group_name   = azurerm_resource_group.hogehoge.name
  location              = azurerm_resource_group.hogehoge.location
  size                  = var.VM_size
  admin_username        = var.admin_username
  network_interface_ids = [azurerm_network_interface.hogehoge[count.index].id]
  
  admin_ssh_key {
  username   = var.admin_username
  public_key = var.ssh_public_key
  }
  
  os_disk {
    name                 = "${var.os_disk_name}-${count.index}"
    caching              = var.caching
    storage_account_type = var.storage_account_type
  }
  
  source_image_reference {
    publisher = var.publisher
    offer     = var.offer
    sku       = var.sku
    version   = var.source_image_version
  }
}
```

###Module素材登録
左メニューグループから「Module素材集」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/652376/5e026a02-861a-95a9-c02c-01af903e1f2d.png)

画面が遷移するので、登録欄から登録開始を選択します。
登録する4つのModule素材と、それに対応したModule素材名を付けて登録します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/652376/c6b50864-90e5-7c40-2059-50535f293f43.png)
記入内容を確認後、「登録」ボタンをクリックして登録します。

##2.6.Movement詳細へ登録
登録したModule素材とMovementを関連付けます。

左メニューグループから「Module素材集」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/652376/6a1eb77d-e8f2-897f-dd80-5da785f7f4a2.png)

画面が遷移するので、登録欄から登録開始を選択します。
前節で作成したMovement「VM作成(AWS)」と「VM作成(Azure)」に対応したModule素材を登録します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/652376/393b62fc-b7de-0676-d809-fe6b39bfe3e4.png)
記入内容を確認後、「登録」ボタンをクリックして登録します。

##2.7.パラメータシートの作成
Module素材で定義した変数に具体値を代入するためのパラメータシートを作成します。

メインメニュー(DASHBOARD)から「メニュー作成」メニューグループ >> 「メニュー定義/作成」を選択します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/652376/3356a66a-5f77-d6ad-58e0-1e1ba8ee7d68.png)
画面が遷移してメニュー作成画面が表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/652376/1e45ce7a-46ee-de97-2c14-5bc0a81c5bf7.png)


###データシートの作成
ITAではデータシートというものを作成して同じパラメータを複数のパラメータシートで取り扱うことができます。

今回、いくつかのパラメータシートで同じパラメータを使いますが
試しにAWSの「インスタンス名」とAzureの「リソースグループ名」をデータシートにしてしまおうと思います。

画面右の「メニュー作成情報」の作成対象をクリックして「データシート」に切り替えます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/652376/14e3ecd9-5e1d-51a0-13d8-c7facb8b4481.png)

項目を下図のように設定し、「作成」ボタンを押下します。
***インスタンス名***
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/652376/5e72b61d-0477-bcda-b516-7d72fa76e1fa.png)
***リソースグループ名***
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/652376/481561dd-38b9-efb2-1b98-35463049cfbe.png)

また、ここでついでにWebサーバ構築(インストールパッケージ)に使うデータシートも作成します。
***フラグ***
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/652376/6c6ebc0f-ea47-8da0-525a-709c697fe7a6.png)


###パラメータシートの作成
再度、「メニュー定義/作成」を選択し新しくパラメータシートを作成します。

***インスタンス作成(AWS)***
下図のように項目を設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/652376/c4630b3c-c157-3910-36c1-926ac98d599c.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/652376/63cf7ddf-377e-87b7-ec9b-c09ce3afa099.png)
項目内容を確認後、「作成」ボタンを押下します。

***インスタンス作成(Azure)***
下図のように項目を設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/652376/ac7968fa-a8d2-5a24-f75f-cc6dc2fb997b.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/652376/f270afae-b9e4-4576-9798-e0c67446c6d2.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/652376/9c460809-0a07-47b8-873f-44fef8778283.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/652376/bd188705-9765-5bb2-5f8f-32918665cab1.png)
項目内容を確認後、「作成」ボタンを押下します。

##2.8.代入値自動登録設定
パラメータシートのパラメータとModule素材の変数定義を関連付けます。

メインメニュー(DASHBOARD)から「Terraform」メニューグループ >> 「代入値自動登録設定」を選択します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/652376/01a09419-ee28-8e86-4e59-0678d3dfe2cf.png)
画面が遷移するので、登録欄から登録開始を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/652376/32da5406-0fd0-7b67-5f8e-0695897407e1.png)
登録内容は下表を参考にします。

***AWS***
共通項目

|メニューグループ：メニュー|登録方式|Movement|
|-|-|-|
|代入値自動登録用：インスタンス作成(AWS)|Value型|VM作成(AWS)|

設定項目

|項目|Value変数-変数名|
|-|-|
|パラメータ/AWSアクセス情報/セキュリティ/セキュリティグループ|security_group|
|パラメータ/AWSアクセス情報/セキュリティ/キーペア|key_name|
|パラメータ/AWSアクセス情報/セキュリティ/アクセスキー|access_key|
|パラメータ/AWSアクセス情報/セキュリティ/シークレットキー|secret_key|
|パラメータ/AWSアクセス情報/インスタンス情報/リージョン|region|
|パラメータ/AWSアクセス情報/インスタンス情報/インスタンス名(プレフィックス)|tags_name|
|パラメータ/AWSアクセス情報/インスタンス情報/インスタンスタイプ|hello_tf_instance_type|
|パラメータ/AWSアクセス情報/インスタンス情報/インスタンス数|hello_tf_instance_count|
|パラメータ/AWSアクセス情報/インスタンス情報/AMI|ami|

***Azure***
共通項目

|メニューグループ：メニュー|登録方式|Movement|
|-|-|-|
|代入値自動登録用：インスタンス作成(Azure)|Value型|VM作成(Azure)|

設定項目

|項目|Value変数-変数名|
|-|-|
|パラメータ/認証情報/サブスクリプションID|subscription_id|
|パラメータ/認証情報/テナントID|tenant_id|
|パラメータ/認証情報/クライアントID|client_id|
|パラメータ/認証情報/クライアントシークレット|client_secret|
|パラメータ/ターゲット/リソースグループ名|resource_group_name|
|パラメータ/ターゲット/ロケーション|location|
|パラメータ/セキュリティグループ/セキュリティグループ名|security_group|
|パラメータ/仮想ネットワーク/仮想ネットワーク名|Vnet_name|
|パラメータ/仮想ネットワーク/仮想ネットワークアドレス|Vnet_address_space|
|パラメータ/仮想ネットワーク/サブネット/サブネット名|subnet_name|
|パラメータ/仮想ネットワーク/サブネット/プレフィックス|address_prefixes|
|パラメータ/仮想ネットワーク/パブリックIPアドレス/パブリックIPアドレス名(プレフィックス)|public_ip_name|
|パラメータ/仮想ネットワーク/パブリックIPアドレス/アロケーションメソッド|allocation_method|
|パラメータ/仮想ネットワーク/パブリックIPアドレス/ドメイン名ラベル(プレフィックス)|domain_name_label|
|パラメータ/仮想NIC/インタフェース名(プレフィックス)|network_interface_name|
|パラメータ/仮想NIC/NIC名|NIC_name|
|パラメータ/仮想マシン/インスタンス名|VM_name|
|パラメータ/仮想マシン/ソースイメージ/publicher|publisher|
|パラメータ/仮想マシン/ソースイメージ/offer|offer|
|パラメータ/仮想マシン/ソースイメージ/sku|sku|
|パラメータ/仮想マシン/ソースイメージ/version|source_image_version|
|パラメータ/仮想マシン/ディスクシステム/ディスク名(プレフィックス)|os_disk_name|
|パラメータ/仮想マシン/ディスクシステム/タイプ|storage_account_type|
|パラメータ/仮想マシン/ディスクシステム/caching|caching|
|パラメータ/仮想マシン/ユーザ情報/管理者ユーザ名|admin_username|
|パラメータ/仮想マシン/ユーザ情報/SSH公開鍵|ssh_public_key|
|パラメータ/仮想マシン/インスタンスサイズ|VM_size|
|パラメータ/仮想マシン/インスタンス数|VM_count|

各項目記入内容を確認後、「登録」ボタンをクリックして登録します。

#3.Ansible-Legacy編
この章では、Movement作成及びPlaybookの登録、パラメータシートの作成等を行います。

##3.1.Movementの作成
playbookに関連付けるMovementを作成します。

メインメニュー(DASHBOARD)から「Ansible-Legacy」メニューグループ >> 「Movement一覧」を選択します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/652376/33c15994-a9cc-b217-7108-195e1908fdec.png)

画面が遷移するので、登録欄から登録開始を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/652376/cb150ffe-8844-5db5-eb0d-585915bd899c.png)
登録するMovement名は下表すべてを登録します。(「ホスト指定形式」は全て「ホスト名」を選択します)

|Movement名|
|-|
|GetEC2ListFromAWS|
|GetVMListFromAzure|
|RegisterEC2ListToExastroDeviceList|
|RegisterEC2ListToExastroHostLinkList|
|InitialSetting|
|InstallAndStartPackage|
|PutSampleIndexHtml|

各項目記入内容を確認後、「登録」ボタンをクリックして登録します。

##3.2.Playbook素材登録
実行するPlaybook素材をITAに登録します。

###Playbook素材
今回ITAに登録するPlaybook素材は10あります。

それぞれ、「VMリスト取得・連携系」「Webサーバ設定系」の2つに分けて紹介します。

***VMリスト取得・連携系***

***GetEc2ListFromAWS.yml***
AWSよりEC2のリストを取得し、Counductor Work Dir直下にファイル出力する。

```yml:GetEc2ListFromAWS.yml
- name: get VM list
  ec2_instance_info:
    aws_access_key: "{{ VAR_aws_access_key }}"
    aws_secret_key: "{{ VAR_aws_secret_key }}"
    region: "{{ VAR_region }}"
    validate_certs: no
    filters:
      "tag:Name": "{{ VAR_tagName }}*"
      "instance-state-name": [ "running" ]
  register: ec2_info_from_aws

- name: output VM list
  local_action:
    module: copy
    content: "{{ ec2_info_from_aws.instances }}"
    dest: "{{ __conductor_workflowdir__ }}/{{ VAR_VMListFileName }}"

```

***GetVmListFromAzure.yml***
AzureよりVMのリストを取得し、Counductor Work Dir直下にファイル出力する。

```yml:GetVmListFromAzure.yml
- name: get Public IP Address info
  azure_rm_publicipaddress_info:
    subscription_id: "{{ VAR_azure_subscription_id }}"
    tenant: "{{ VAR_azure_tenant_id }}"
    client_id: "{{ VAR_azure_client_id }}"
    secret: "{{ VAR_azure_secret }}"
    cert_validation_mode: "ignore"
    resource_group: "{{ VAR_azure_resource_group }}"
  register: vm_info_from_azure

- name: 取得したデータからFQDNとIPアドレスを抽出し、AWS風の見出し名に加工してファイル出力
  local_action:
    module: blockinfile
    create: yes
    mode: 644
    insertbefore: EOF
    marker: ""
    dest: "{{ __conductor_workflowdir__ }}/{{ VAR_VMListFileName }}"
    content: |
      { "public_dns_name": ""{{ item.dns_settings.fqdn }}"", "public_ip_address": ""{{ item.ip_address }}"" },
  with_items:
    - "{{ vm_info_from_azure.publicipaddresses }}"

- name: ファイルを微修正(1)
  local_action:
    module: replace
    dest: "{{ __conductor_workflowdir__ }}/{{ VAR_VMListFileName }}"
    regexp: '""'
    replace: '"'

- name: ファイルを微修正(2)
  local_action:
    module: replace
    dest: "{{ __conductor_workflowdir__ }}/{{ VAR_VMListFileName }}"
    regexp: '\n'
    replace: ''

- name: ファイルを微修正(3)
  local_action: shell echo "["`cat "{{ __conductor_workflowdir__ }}/{{ VAR_VMListFileName }}" | sed -e 's/,$//g'`"]" > "{{ __conductor_workflowdir__ }}/{{ VAR_VMListFileName }}"

```


※```azure_rm_publicipaddress_info:```を扱うには、「requirements-azure.txt」に記載されたpipモジュールを事前にインストールしておく必要があります。
ITAサーバに接続し、以下を実行してください。

>pipモジュールインストール方法
>
>ITAサーバに接続し、以下を実行します。
>
>```ITAサーバ
># curl https://raw.githubusercontent.com/ansible-collections/azure/dev/requirements-azure.txt > requirements-azure.txt
># pip3 install -r requirements-azure.txt
>```


***RegisterEc2ListToItaDeviceList.yml***
Counductor Work Dir(Conductor実行時、各Movementで共有するディレクトリ)直下のVMリストファイル(※1)を読み込み、Exastro IT Automationの「基本コンソール」メニューグループの「機器一覧」メニューと同期する。
※1　ファイルフォーマットはjsonとし、以下を含むものとする。
    ・public_dns_name
    ・public_ip_address
また、ITAをインストール時、Cobbler Driverをインストールしている場合は
カラム構造が変化するのでyml内指定するカラムに注意する必要がある。

```yml:RegisterEc2ListToItaDeviceList.yml
- name: 「VMリストファイル」を読み込み
  local_action: shell cat "{{ __conductor_workflowdir__ }}/{{ VAR_VMListFileName }}"
  register: responce

- name: 読み込んだデータを(JSON)を整形
  set_fact:
    vm_info_from_file: "{{ responce.stdout | from_json }}"

- name: Exastro IT Automationにアクセスするためのauthorizationを生成
  command: echo "{{ VAR_exastro_user }}:{{ VAR_exastro_pswd }}"
  register: user_n_account

- name: 「機器一覧」メニューからデータを取得(検索条件：ホストグループ名)
  uri:
    url: "https://{{ __loginhostname__ }}/default/menu/07_rest_api_ver1.php?no=2100000303"
    validate_certs: no
    method: POST
    headers:
      Host: "{{ __loginhostname__ }}:443"
      Authorization: "{{ user_n_account.stdout | string | b64encode }}"
      Content-Type: "application/json"
      X-Command: "FILTER"
    body_format: json
    body:
      "1":
        "NORMAL": "0"
      "28":
        "NORMAL": "ホストグループ：{{ VAR_hostgroup_name }}"
  register: device_list_from_exastro

- name: 取得したデータからレコード情報を抽出
  set_fact:
    device_list_from_exastro_body: "{{ device_list_from_exastro.json.resultdata.CONTENTS.BODY }}"

- name: 「機器一覧」に存在しており「VMリストファイル」に存在しないデータは「廃止」
  uri:
    url: "https://{{ __loginhostname__ }}/default/menu/07_rest_api_ver1.php?no=2100000303"
    validate_certs: no
    method: POST
    headers:
      Host: "{{ __loginhostname__ }}:443"
      Authorization: "{{ user_n_account.stdout | string | b64encode }}"
      Content-Type: "application/json"
      X-Command: "EDIT"
    body_format: json
    body:
      "0":
        "0": "廃止"
        "2": "{{ item.2 }}"
        "30": "{{ item.30 }}"
  when:
    - item.0 == None
    - vm_info_from_file | map(attribute='public_dns_name') | list | select('match', item.4) | length == 0
  with_items:
    - "{{ device_list_from_exastro_body }}"

- name: 「機器一覧」と「VMリストファイル」の両方に存在しておりIPアドレスが一致しない場合は「更新」
  uri:
    url: "https://{{ __loginhostname__ }}/default/menu/07_rest_api_ver1.php?no=2100000303"
    validate_certs: no
    method: POST
    headers:
      Host: "{{ __loginhostname__ }}:443"
      Authorization: "{{ user_n_account.stdout | string | b64encode }}"
      Content-Type: "application/json"
      X-Command: "EDIT"
    body_format: json
    body:
      "0":
        "0": "更新"
        "2": "{{ item.2 }}"
        "4": "{{ item.4 }}"
        "5": "{{ vm_info_from_file | selectattr('public_dns_name', '==', item.4) | map(attribute='public_ip_address') | join() }}"
        "20": "{{ item.20 }}"
        "30": "{{ item.30 }}"
  when:
    - item.0 == None
    - vm_info_from_file | map(attribute='public_dns_name') | list | select('match', item.4) | length == 1
    - vm_info_from_file | selectattr('public_dns_name', '==', item.4) | map(attribute='public_ip_address') | join() != item.5
  with_items:
    - "{{ device_list_from_exastro_body }}"

- name: 「機器一覧」からホスト名を抽出してリスト化(見出し行を含む)
  set_fact:
    host_name: "{{ item.4 }}"
  register: device_list_from_exastro_hostnames
  with_items:
    - "{{ device_list_from_exastro_body }}"

- name: 「VMリストファイル」に存在しており「機器一覧」に存在しないデータは「登録」
  uri:
    url: "https://{{ __loginhostname__ }}/default/menu/07_rest_api_ver1.php?no=2100000303"
    validate_certs: no
    method: POST
    headers:
      Host: "{{ __loginhostname__ }}:443"
      Authorization: "{{ user_n_account.stdout | string | b64encode }}"
      Content-Type: "application/json"
      X-Command: "EDIT"
    body_format: json
    body:
      "0":
        "0": "登録"
        "3": "SV"
        "4": "{{ item.0 }}"
        "5": "{{ item.1 }}"
        "8": "{{ VAR_vm_user }}"
        "11": "{{ VAR_keypair_name }}"
        "12": "鍵認証"
        "20": "machine"
        "28": "ホストグループ：{{ VAR_hostgroup_name }}"
      "UPLOAD_FILE":
        "0":
          "11": "{{ VAR_keypair_contents }}"
  when:
    - device_list_from_exastro_hostnames.results | map(attribute='ansible_facts.host_name') | list | select('match', item.0) | length == 0
  with_together:
    - "{{ vm_info_from_file | map(attribute='public_dns_name') | list }}"
    - "{{ vm_info_from_file | map(attribute='public_ip_address') | list }}"
```

***RegisterEc2ListToItaHostLinkList.yml***
Counductor Work Dir(Conductor実行時、各Movementで共有するディレクトリ)直下のVMリストファイル(※2)を読み込み、Exastro IT Automationの「ホストグループ管理」メニューグループの「ホスト紐付管理」メニューと同期する。
※2ファイルフォーマットはjsonとし、以下を含むものとする。
    ・public_dns_name
    ・public_ip_address

```yml:RegisterEc2ListToItaHostLinkList.yml
- name: 「VMリストファイル」を読み込み
  local_action: shell cat "{{ __conductor_workflowdir__ }}/{{ VAR_VMListFileName }}"
  register: responce

- name: 読み込んだデータを(JSON)を整形
  set_fact:
    vm_info_from_file: "{{ responce.stdout | from_json }}"

- name: Exastro IT Automationにアクセスするためのauthorizationを生成
  command: echo "{{ VAR_exastro_user }}:{{ VAR_exastro_pswd }}"
  register: user_n_account

- name: 「ホスト紐付管理」メニューからデータを取得(検索条件：ホストグループ名)
  uri:
    url: "https://{{ __loginhostname__ }}/default/menu/07_rest_api_ver1.php?no=2100170003"
    validate_certs: no
    method: POST
    headers:
      Host: "{{ __loginhostname__ }}:443"
      Authorization: "{{ user_n_account.stdout | string | b64encode }}"
      Content-Type: "application/json"
      X-Command: "FILTER"
    body_format: json
    body:
      "1":
        "NORMAL": "0"
      "3":
        "NORMAL": "{{ VAR_hostgroup_name }}"
  register: host_link_list_from_exastro

- name: 取得したデータからレコード情報を抽出
  set_fact:
    host_link_list_from_exastro_body: "{{ host_link_list_from_exastro.json.resultdata.CONTENTS.BODY }}"

- name: 「ホスト紐付管理」に存在しており「VMリストファイル」に存在しないデータは「廃止」
  uri:
    url: "https://{{ __loginhostname__ }}/default/menu/07_rest_api_ver1.php?no=2100170003"
    validate_certs: no
    method: POST
    headers:
      Host: "{{ __loginhostname__ }}:443"
      Authorization: "{{ user_n_account.stdout | string | b64encode }}"
      Content-Type: "application/json"
      X-Command: "EDIT"
    body_format: json
    body:
      "0":
        "0": "廃止"
        "2": "{{ item.2 }}"
        "9": "{{ item.9 }}"
  when:
    - item.0 == None
    - vm_info_from_file | map(attribute='public_dns_name') | list | select('match', item.5) | length == 0
  with_items:
    - "{{ host_link_list_from_exastro_body }}"

- name: 「ホスト紐付管理」からホスト名を抽出してリスト化(見出し行を含む)
  set_fact:
    host_name: "{{ item.5 }}"
  register: host_link_list_from_exastro_hostnames
  with_items:
    - "{{ host_link_list_from_exastro_body }}"

- name: 「VMリストファイル」に存在しており「ホスト紐付管理」に存在しないデータは「登録」
  uri:
    url: "https://{{ __loginhostname__ }}/default/menu/07_rest_api_ver1.php?no=2100170003"
    validate_certs: no
    method: POST
    headers:
      Host: "{{ __loginhostname__ }}:443"
      Authorization: "{{ user_n_account.stdout | string | b64encode }}"
      Content-Type: "application/json"
      X-Command: "EDIT"
    body_format: json
    body:
      "0":
        "0": "登録"
        "3": "{{ VAR_hostgroup_name }}"
        "5": "{{ item }}"
  when:
    - host_link_list_from_exastro_hostnames.results | map(attribute='ansible_facts.host_name') | list | select('match', item) | length == 0
  with_items:
    - "{{ vm_info_from_file | map(attribute='public_dns_name') | list }}"

```

***Sleep.yml***
設定した時間だけPlaybookの実行を一時停止する。
(RegisterEc2ListToItaHostLinkList.ymlでホスト紐付管理にレコードが登録されてから、Exastro IT Automationの代入値自動登録設定によって作業対象ホスト／代入値管理にレコードが登録されるまでにタイムラグが最大10secあり、それを待ち合わせるためのPlaybook)

```yml:Sleep.yml
- name: interval time
  pause:
    seconds: "{{ VAR_interval_seconds }}"
```


***Webサーバ設定系***

***yum_package_install.yml***
指定したパッケージをインストールします。

```yml:yum_package_install.yml
- name: install the latest version of packages
  yum:
    name: "{{ item }}"
    state: latest
  with_items:
    - "{{ VAR_packages }}"

```

***start_package_services.yml***
インストールしたパッケージを起動します。

```yml:start_package_services.yml
- name: start package services
  systemd:
    name: "{{ item }}"
    state: started
    enabled: yes
  with_items:
    - "{{ VAR_packages }}"

```

***wait_for_ssh_port_up.yml***
SSH接続が開通するまで待機します。

```yml:wait_for_ssh_port_up.yml
- name: wait for SSH port up
  wait_for_connection: 
    delay: 20
    timeout: 300

```

***selinux_setting_n_reboot.yml***
SELinuxの設定を行います。
変更があった場合、マシンのリブートを行います。

```yml:selinux_setting_n_reboot.yml
- name: selinux register
  lineinfile: 
    dest=/etc/sysconfig/selinux
    line='SELINUX={{ VAR_SelinuxStatus }}'
    regexp='^SELINUX=enforcing'
  register: selinux_result

- name: selinux result
  debug:
    msg: "{{ selinux_result }}"

- name: reboot
  shell: sleep 2 && reboot
  async: 1
  poll: 0
  become: true
  when: selinux_result.changed == true

```

***putIndexHtml.yml***
「1.4.テンプレートファイルの登録」で登録したテンプレートファイルをマシンに配置します。

```yml:putIndexHtml.yml
- name: put index html file
  template:
    src: "{{ TPF_IndexHtml }}"
    dest: /var/www/html/index.html
    owner: root
    group: root
    mode: 0644

```

###Playbook素材登録
上記のPlaybookをITAに登録します。

左メニューグループから「プレイブック素材集」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/652376/fc691a76-8089-bd52-c932-5a0f0c481397.png)

画面が遷移するので、登録欄から登録開始を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/652376/207cc0c1-15b4-c583-dfac-8e3dde27836e.png)
登録内容は下表を参照します。

|プレイブック素材名|プレイブック素材|
|-|-|
|GetEC2ListFromAWS|GetEc2ListFromAWS.yml|
|GetEC2ListFromAzure|GetVmListFromAzure.yml|
|register_vm_list_to_exastro_device_list|RegisterEc2ListToItaDeviceList.yml|
|register_vm_list_to_exastro_host_link_list|RegisterEc2ListToItaHostLinkList.yml|
|sleep|Sleep.yml|
|YumPackageInstall|yum_package_install.yml|
|StartPackageServices|start_package_services.yml|
|WaitSshPortUp|wait_for_ssh_port_up.yml|
|SelinuxSetting|selinux_setting_n_reboot.yml|
|PutIndexHtml|putIndexHtml.yml|

各項目記入内容を確認後、「登録」ボタンをクリックして登録します。

##3.3.Movement詳細へ登録
登録したPlaybookとMovementを関連付けます。

左メニューグループから「Movement詳細」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/652376/b6c58c13-50ea-f965-89fb-21a618a6ad42.png)

画面が遷移するので、登録欄から登録開始を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/652376/be062e4e-c246-7402-ccee-e614814a256b.png)
登録内容は下表を参照します。

|Movement|プレイブック素材|インクルード順序|
|-|-|-|
|GetEC2ListFromAWS|GetEC2ListFromAWS|1|
|GetVMListFromAzure|GetEC2ListFromAzure|1|
|RegisterEC2ListToExastroDeviceList|register_vm_list_to_exastro_device_list|1|
|RegisterEC2ListToExastroHostLinkList|register_vm_list_to_exastro_host_link_list|1|
|RegisterEC2ListToExastroHostLinkList|sleep|2|
|InitialSetting|WaitSshPortUp|1|
|InitialSetting|SelinuxSetting|2|
|InstallAndStartPackage|WaitSshPortUp|1|
|InstallAndStartPackage|YumPackageInstall|2|
|InstallAndStartPackage|StartPackageServices|3|
|PutSampleIndexHtml|PutIndexHtml|1|

各項目記入内容を確認後、「登録」ボタンをクリックして登録します。

##3.4.パラメータシートの作成
Module素材で定義した変数に具体値を代入するためのパラメータシートを作成します。

メインメニュー(DASHBOARD)から「メニュー作成」メニューグループ >> 「メニュー定義/作成」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/652376/3356a66a-5f77-d6ad-58e0-1e1ba8ee7d68.png)
画面が遷移してメニュー作成画面が表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/652376/1e45ce7a-46ee-de97-2c14-5bc0a81c5bf7.png)
前章同様に、以下の図のように項目を設定、作成してください。

***EC2連携(AWS)***
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/652376/62d89b2d-00b0-861b-234d-7d465c287a93.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/652376/987774e6-30c3-d29f-157b-abe65d7f7a36.png)

***VM連携(Azure)***
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/652376/98e02749-71de-921c-f774-2a0b70af5c7c.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/652376/3be3c015-a08c-c834-1a72-ff7b4ecb3665.png)

***Webサーバ設定***
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/652376/80d8999f-71ed-3631-f213-994efc7c1341.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/652376/c5486185-6daa-63c4-3928-bdcd2fba1bd2.png)

項目内容を確認後、「作成」ボタンを押下します。

##3.5.代入値自動登録設定
パラメータシートのパラメータと、Playbookの変数を関連付けます。

メインメニュー(DASHBOARD)から「Ansible-Legacy」メニューグループ>>「代入値自動登録設定」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/652376/5f79ef79-05f5-aa44-f055-8e27a2f2530f.png)

画面が遷移するので、登録欄から登録開始を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/652376/f813bc60-a419-4f74-6243-13b1d56d699f.png)
登録内容は下表を参考にします。

***EC2連携(AWS)***
共通項目

|メニューグループ：メニュー|登録方式|
|-|-|
|EC2連携(AWS)|Value型|

設定項目

|項目|Movement|Value変数-変数名|
|-|-|-|
|パラメータ/AWSアクセス情報/セキュリティ/アクセスキー|GetEC2ListFromAWS|VAR_aws_access_key|
|パラメータ/AWSアクセス情報/セキュリティ/シークレットキー|GetEC2ListFromAWS|VAR_aws_secret_key|
|パラメータ/AWSアクセス情報/インスタンス情報/リージョン|GetEC2ListFromAWS|VAR_region|
|パラメータ/AWSアクセス情報/インスタンス情報/インスタンス名(プレフィックス)|GetEC2ListFromAWS|VAR_tagName|
|パラメータ/exastro情報/保存ファイル名|GetEC2ListFromAWS|VAR_VMListFileName|
|パラメータ/exastro情報/保存ファイル名|RegisterEC2ListToExastroDeviceList|VAR_VMListFileName|
|パラメータ/exastro情報/exastroユーザID|RegisterEC2ListToExastroDeviceList|VAR_exastro_user|
|パラメータ/exastro情報/exastroパスワード|RegisterEC2ListToExastroDeviceList|VAR_exastro_pswd|
|パラメータ/exastro情報/ホストグループ名|RegisterEC2ListToExastroDeviceList|VAR_hostgroup_name|
|パラメータ/仮想マシン/ホスト|RegisterEC2ListToExastroDeviceList|VAR_vm_user|
|パラメータ/仮想マシン/キーペア|RegisterEC2ListToExastroDeviceList|VAR_keypair_name|
|パラメータ/仮想マシン/キー内容|RegisterEC2ListToExastroDeviceList|VAR_keypair_contents|
|パラメータ/exastro情報/保存ファイル名|RegisterEC2ListToExastroHostLinkList|VAR_VMListFileName|
|パラメータ/exastro情報/exastroユーザID|RegisterEC2ListToExastroHostLinkList|VAR_exastro_user|
|パラメータ/exastro情報/exastroパスワード|RegisterEC2ListToExastroHostLinkList|VAR_exastro_pswd|
|パラメータ/exastro情報/ホストグループ名|RegisterEC2ListToExastroHostLinkList|VAR_hostgroup_name|
|パラメータ/遅延タイマー[秒]|RegisterEC2ListToExastroHostLinkList|VAR_interval_seconds|





***VM連携(Azure)***
共通項目

|メニューグループ：メニュー|登録方式|
|-|-|
|VM連携(Azure)|Value型|

設定項目

|項目|Movement|Value変数-変数名|
|-|-|-|
|パラメータ/Azureアクセス情報/セキュリティ/サブスクリプションID|GetVMListFromAzure|VAR_azure_subscription_id|
|パラメータ/Azureアクセス情報/セキュリティ/テナントID|GetVMListFromAzure|VAR_azure_tenant_id|
|パラメータ/Azureアクセス情報/セキュリティ/クライアントID|GetVMListFromAzure|VAR_azure_client_id|
|パラメータ/Azureアクセス情報/セキュリティ/クライアントシークレット|GetVMListFromAzure|VAR_azure_secret|
|パラメータ/Azureアクセス情報/ターゲット/リソースグループ名|GetVMListFromAzure|VAR_azure_resource_group|
|パラメータ/exastro情報/保存ファイル名|GetVMListFromAzure|VAR_VMListFileName|
|パラメータ/exastro情報/保存ファイル名|RegisterEC2ListToExastroDeviceList|VAR_VMListFileName|
|パラメータ/exastro情報/exastroユーザID|RegisterEC2ListToExastroDeviceList|VAR_exastro_user|
|パラメータ/exastro情報/exastroパスワード|RegisterEC2ListToExastroDeviceList|VAR_exastro_pswd|
|パラメータ/exastro情報/ホストグループ名|RegisterEC2ListToExastroDeviceList|VAR_hostgroup_name|
|パラメータ/仮想マシン/ホスト|RegisterEC2ListToExastroDeviceList|VAR_vm_user|
|パラメータ/仮想マシン/キーペア|RegisterEC2ListToExastroDeviceList|VAR_keypair_name|
|パラメータ/仮想マシン/キー内容|RegisterEC2ListToExastroDeviceList|VAR_keypair_contents|
|パラメータ/exastro情報/保存ファイル名|RegisterEC2ListToExastroHostLinkList|VAR_VMListFileName|
|パラメータ/exastro情報/exastroユーザID|RegisterEC2ListToExastroHostLinkList|VAR_exastro_user|
|パラメータ/exastro情報/exastroパスワード|RegisterEC2ListToExastroHostLinkList|VAR_exastro_pswd|
|パラメータ/exastro情報/ホストグループ名|RegisterEC2ListToExastroHostLinkList|VAR_hostgroup_name|
|パラメータ/遅延タイマー[秒]|RegisterEC2ListToExastroHostLinkList|VAR_interval_seconds|

***Webサーバ設定***

|メニューグループ：メニュー|項目|登録方式|Movement|Key変数-変数名|Value変数-変数名|
|-|-|-|-|-|-|
|Webサーバ設定|パラメータ/パッケージ/httpd|Key型|InstallAndStartPackage|VAR_packages||
|Webサーバ設定|パラメータ/初期設定/selinux|Value型|InitialSetting||VAR_SelinuxStatus|
|Webサーバ設定|パラメータ/コンテンツ/webタイトル|Value型|PutSampleIndexHtml||VAR_SelinuxStatus|
|Webサーバ設定|パラメータ/コンテンツ/web本文|Value型|PutSampleIndexHtml||VAR_SelinuxStatus|

各項目記入内容を確認後、「登録」ボタンをクリックして登録します。

#4.Conductor実行編
この章では、作成したパラメータシート(データシート)で設定した値を確認後、Conductorを作成・実行し、実際に動作しているかを確認します。
##4.1.パラメータの登録
前章までに作成したパラメータシート・データシートに具体的なパラメータを設定します。

正常にパラメータシート・データシートが作成されている場合、メインメニュー(DASHBOARD)に「コード管理」「Webサーバ構築」の2つのメニューグループパネルが追加されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/652376/83dd0df8-b974-3baf-f962-2a85c1ab3c6d.png)


###データシートへデータを登録
はじめに、データシートに値を設定します。

メインメニュー(DASHBOARD)から「コード管理」メニューグループを開き
下図のように各データシートへ値を登録します。

***インスタンス名***
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/652376/c62749f1-a4a3-2d60-cea5-60876f6305e1.png)

***リソースグループ名***
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/652376/eedb545e-cd9a-981a-6eff-560d870e876e.png)

***フラグ***
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/652376/9adc8b1a-4af7-38ef-34ef-ce893caf3f2c.png)

###パラメータシートへパラメータを登録
パラメータシートに具体的な値を設定します。

メインメニュー(DASHBOARD)から「Webサーバ構築」メニューグループを開き、値を設定する対象のメニューを選択し、登録作業を行います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/652376/d1fda895-cc80-6cc3-235a-d540ceae5aa3.png)

***インスタンス作成(AWS)***
左メニューから「インスタンス作成(AWS)」を選択すると画面が遷移するので、登録欄から登録開始を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/652376/d1858794-38e1-5b1d-f261-c7c65120a3e8.png)

登録内容は下表を参考にします。

|オペレーション|セキュリティグループ|キーペア |アクセスキー|シークレットキー|
|-|-|-|-|-|
|demo|ita-demo-sg|ita-demo-key|(AWSアクセスキー)|(AWSシークレットキー)|

|リージョン|インスタンス名|AMI|インスタンスタイプ|インスタンス数|
|-|-|-|-|-|
|ap-south-1|ita-demo-instance|ami-03baa7be5df91381d(PureCentOS7)|t2.micro|3|

各項目記入内容を確認後、「登録」ボタンをクリックして登録します。

***EC2連携(AWS)***
左メニューから「EC2連携(AWS)」を選択すると画面が遷移するので、登録欄から登録開始を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/652376/d27380a1-0925-bd80-f259-1e4d597267c4.png)

登録内容は下表を参考にします。

|ホスト名|オペレーション|セキュリティ-<br>アクセスキー|セキュリティ-<br>アクセスキー|インスタンス情報-<br>リージョン|
|-|-|-|-|-|
|localhost|demo|(AWSアクセスキー)|(AWSシークレットキー)|ap-south-1|

|インスタンス情報-<br>インスタンス名(プレフィックス)|exastroユーザID|exastroパスワード|保存ファイル名|ホストグループ名|
|-|-|-|-|-|
|ita-demo-instance|administrator|(exastroユーザに基づいたパスワード)|VM_list.txt|Webサーバ_AWS|

|仮想マシン-<br>ホスト|仮想マシン-<br>キーペア|仮想マシン-<br>キー内容|遅延タイマー[秒]|
|-|-|-|-|
|centos|ita-demo-key.pem<br>(VMの秘密鍵ファイル名)|(秘密鍵の内容)(※3)|12|

※3 秘密鍵をパラメータシートに登録する際、秘密鍵をBase64エンコードする必要があります。
以下のコマンドを実行して事前に取得しておきます。

```
# base64 ita-demo-key.pem -w 0
```

各項目記入内容を確認後、「登録」ボタンをクリックして登録します。

***インスタンス作成(Azure)***
左メニューから「インスタンス作成(Azure)」を選択すると画面が遷移するので、登録欄から登録開始を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/652376/abab7c7a-5f81-d3f9-6297-54c22b8b51d6.png)

登録内容は下表を参考にします。

|オペレーション|サブスクリプションID,テナントID<br>クライアントID,クライアントシークレット|リソースグループ名|ロケーション|
|-|-|-|-|
|demo_sub|(認証情報)|ita-demo-rg|ita-demo-web-azure|japaneast|

セキュリティグループ名|仮想ネットワーク名|仮想ネットワークアドレス|サブネット-<br>サブネット名 |サブネット-<br>プレフィックス|
|-|-|-|-|-|
|ita-demo-security-group|ita-demo-vnet|10.0.0.0/16|ita-demo-subnet|10.0.2.0/24|

|パブリックIPアドレス名<br>(プレフィックス)|パブリックIPアドレス-<br>アロケーションメソッド|パブリックIPアドレス-<br>ドメイン名ラベル|仮想NIC-<br>インタフェース名<br>(プレフィックス)|仮想NIC-<br>NIC名|
|-|-|-|-|-|
|ita-demo-public-ip|Dynamic|ita-demo-domain|ita-demo-nwif|ita-demo-NIC|

|インスタンス名|ソースイメージ-<br>publisher|ソースイメージ-<br>offer|ソースイメージ-<br>sku|ソースイメージ-<br>version|
|-|-|-|-|-|
|ita-demo-web-azure|OpenLogic|CentOS|8_2|latest|

|ディスクシステム-<br>ディスク名(プレフィックス)|ディスクシステム-<br>タイプ|ディスクシステム-<br>caching|ユーザ情報-<br>管理者ユーザ名|ユーザ情報-<br>SSH公開鍵|
|-|-|-|-|-|
|ita-demo-os-disk|Standard_LRS|ReadWrite|ita-demo|(AWSの「ita-demo-key」の<br>公開鍵を利用)|

|インスタンスサイズ|インスタンス数|
|-|-|
|Standard_B1ls|3|


各項目記入内容を確認後、「登録」ボタンをクリックして登録します。

***VM連携(Azure)***
左メニューから「VM連携(Azure)」を選択すると画面が遷移するので、登録欄から登録開始を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/652376/ea398115-c0fe-32ed-1406-9d1f92b3040b.png)


登録内容は下表を参考にします。

|ホスト名|オペレーション|サブスクリプションID,テナントID<br>クライアントID,クライアントシークレット|リソースグループ名|
|-|-|-|-|
|localhost|demo_sub|(認証情報)|ita-demo-rg|

|exastroユーザID|exastroパスワード|保存ファイル名|ホストグループ名|
|-|-|-|-|
|administrator(※)|(exastroユーザに基づいたパスワード)|VM_list.txt|Webサーバ_Azure|

|仮想マシン-<br>ホスト|仮想マシン-<br>キーペア|仮想マシン-<br>キー内容|遅延タイマー[秒]|
|-|-|-|-|
|ita-demo|ita-demo-key.pem<br>(VMの秘密鍵ファイル名)|(秘密鍵の内容)|12|

各項目記入内容を確認後、「登録」ボタンをクリックして登録します。

***Webサーバ設定***
左メニューから「Webサーバ設定」を選択すると画面が遷移するので、登録欄から登録開始を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/652376/56261524-4711-692b-e90b-6d580dfca82c.png)


登録内容は下表を参考にします。

|ホスト名/ホストグループ名|オペレーション|パッケージ-httpd|selinux|
|-|-|-|-|
|[HG]Webサーバ|demo|●|disabled|

|コンテンツ-<br>Webタイトル|コンテンツ-<br>Web本文|
|-|-|
|タイトル|本文です```<br>```<br>マルチクラウド ```<br>```|

各項目記入内容を確認後、「登録」ボタンをクリックして登録します。

###代入値が自動登録されているか確認

「Terraform」・「Ansible-Driver」に登録した値が自動で代入値管理に登録されているかを確認します。

***「Terraform」メニューグループ>>「代入値管理」***
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/652376/8793dea2-4f73-9987-4ccb-80c21395e617.png)

***「Ansible-Legacy」メニューグループ>>「代入値管理」***
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/652376/9673c555-9868-8d5b-ab4a-20527a4ddd56.png)

設定した値がすべて「代入値自動登録設定プロシージャ」によって更新されていたらOKです。

##4.2.Conductorの作成
「Terraform」・「Ansible-Legacy」で作成したMovementをConductorにまとめます。

メインメニュー(DASHBOAD)から「Conductor」メニューグループ>>「Conductorクラス編集」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/652376/9d6f781d-530a-d1d3-7cd3-ba9a4dcaff9d.png)

すると、「Conductorクラス編集」画面に遷移します。

<details><summary>Conductorクラス編集の仕方</summary>
Conductorクラス編集では、Movementを右下ノード欄からドラッグ＆ドロップで追加し、作業順にノード同士をつなぎます。
「start」から並べたノードの「in」から「out」をつなぎ、「end」までつなげます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/652376/d4aba217-e671-ec2a-a464-f69d137c4ee3.png)
また右下ノード欄の「Function」を選択すると、さまざまな条件に応じたノードを設定することができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/652376/4a0b3100-f360-09dd-9d9a-9d7358425e7d.png)
***Conductor pause***
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/652376/ccb1ca18-6e7f-9a3c-eb0a-999f802d9644.png)
ワークフローを一時停止します。解除すると次の処理に進みます。
***Conductor call***
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/652376/504d23d7-ff5f-a257-c90a-852ebcdf58d7.png)
別の登録済みのConductorクラスを呼び出します。
***Symphony call***
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/652376/bb7e9acb-ba8f-673a-a9b6-36bb8e452ff0.png)
登録済みのSymphonyクラスを呼び出します。
***Conditional branch***
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/652376/839ad3be-a80e-b73b-3076-76e56616c665.png)
接続されたノードの結果によって後続の処理を分岐させます。
***Parallel branch***
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/652376/0eb603cb-97cd-a7ed-694c-e2a770893c3f.png)
並列してノードを実行します。
***Parallel merge***
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/652376/d8f2c31d-c00e-409a-2b9c-3ee66113fa95.png)
接続しているノードの処理が完了した後、次の処理を実行します。</details>

まずはじめに元となる3つのConductorを作成します。

***Conductor①「VM作成(AWS)」***
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/652376/4aecee08-9f9d-78c2-fc7b-3d7ca8456680.png)

接続順
「Terraform VM作成(AWS)」-「Ansible-Legacy GetEC2ListFromAWS」-「RegisterEC2ListToExastroDeviceList」-「RegisterEC2ListTpExastroHostLinkList」

***Conductor②「VM作成(Azure)」***
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/652376/98ada3a5-006a-543a-5b2e-98df05aaacda.png)

接続順
「Terraform VM作成(Azure)」-「Ansible-Legacy GetVMListFromAzure」-「RegisterEC2ListToExastroDeviceList」-「RegisterEC2ListTpExastroHostLinkList」

***Conductor③ 「ServerSetting」***
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/652376/edcb9703-9272-a66f-72d9-0890d83340fa.png)

接続順
「Ansible-Legacy InitialSetting」-「Ansible-Legacy InstallAndStartPackage」-「Ansible-Legacy PutSampleIndexHtml」

3つのConductorを作成したら、そのConductorをさらにConductorでまとめます。

***「VM作成・設定」Conductor***
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/652376/34aac872-704f-388e-73f8-ef1b0ee3b31c.png)

また、「VM作成(Azure)」にオペレーション「demo_sub」を選択させます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/652376/063885cb-5af1-ab4c-f4f4-b664d265730e.png)


それぞれ、接続先等確認して「登録」ボタンを押して登録します。

##4.3.Conductorの実行
それではいよいよConductorの実行です。

「Conductor」メニューグループ>>「Conductor作業実行」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/652376/8261688d-cf5b-bb87-8dc5-9ba475ca1a24.png)

画面が遷移しますので、作成したConductorとオペレーションを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/652376/c1aa1b44-1756-64bd-0842-9eca5dfe50d0.png)

画面下に移動し、「実行」ボタンを押下することで、Conductorを実行させます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/652376/9e55e6eb-0f96-0578-05b5-c4c612a383f7.png)

ボタンを押下すると、実行中のConductor作業確認画面に遷移します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/652376/b80f7e07-08ca-6553-c0f0-4b08d0371272.png)

すべて作業完了すると、以下のような表記になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/652376/aa8fbdaf-a38a-3520-2b8c-1aa9b05f2424.png)

##4.4.実行確認
以上のConductorを実行すると、AWS・Azureは本記事冒頭「具体的な手順はともかくとにかく実行してみる」で述べたように、設定した通りのVMが生成されます。

ここでは、ITAの「機器一覧」「ホスト紐付管理」が実行前と後ではどうなっているのかを確かめたいと思います。


###実行前

***ITA「基本メニュー」メニューグループ-「機器一覧」***
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/652376/0e2b42ae-0434-7ed7-12c5-74f675bcc80a.png)

***ITA「ホストグループ管理」メニューグループ-「ホスト紐付け」***
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/652376/c0a7c3bf-206f-2d30-6684-f3c15c2db31a.png)

「機器一覧」にはPlaybookを実行するためのレコードが１つだけ入っていますが、
その他のレコードはなにも入っていないことがわかります。

###実行後

***「基本メニュー」メニューグループ-「機器一覧」***
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/652376/2fadf7d1-fb54-8871-5b45-6443ebb1ef1a.png)
***ITA「ホストグループ管理」メニューグループ-「ホスト紐付け」***
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/652376/08964465-6e13-5baf-4627-8810f684c56e.png)
6つの仮想マシンがITAに新たに追加されています。

###実行後(代入値を変更)

***「基本メニュー」メニューグループ-「機器一覧」***
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/652376/ed536e2b-2be5-1b33-6100-44a0d2cce1c3.png)
***ITA「ホストグループ管理」メニューグループ-「ホスト紐付け」***
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/652376/dfc41a07-5f75-69dc-dcfc-0dea2ca846b9.png)

AWSのインスタンス情報が5台に増え、Azureのインスタンス情報は1つに減っています。
このようにインスタンスが減っても増えてもそれに対応して(被ったレコードを登録すること無く)更新・廃止ができています。

#おわりに
今回はそのマルチクラウドのプロビジョニング(AWS+Azure)をExastro×Terraform×Ansibleで、
AWS上に建てたITAサーバから各パブリッククラウド上のVM作成、初期設定、http(apache)サーバを建てるまでを行いました。
また、数値が変わっても冪等性を保っているプロジェクトであることを説明しました。

###索引
+ [ExastroSuite コミュニティページ](https://exastro-suite.github.io/docs/index_ja.html)
+ [Exastro IT Automation](https://exastro-suite.github.io/it-automation-docs/index_ja.html)
+ [【随時更新】Exastroの参考になる記事をまとめてみた](https://qiita.com/ooif/items/79952398fb03ca3ec7fd)