9
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

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

Last updated at Posted at 2021-03-24

※本記事はExastro IT AutomationをAWSインスタンス上にインストールしていることを前提としています。
インストールについては過去記事「Exastro IT Automationをインストールしてみた(v1.6.3)
をご覧ください。

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

マルチクラウドにはどんな恩恵があるのか?
複数のベンダーを併用して利用することで、システムの冗長化やバックアップ、リカバリーといったリスクの分散(災害対策)が容易となります。
image.png

また複数のベンダーで同じ機能が提供されている場合には、
価格が安い方の機能を主に使うことによって運用コストを抑えることができます。
image.png

逆に別々の機能が提供されている場合には、
それらの各クラウドで使える機能を組み合わせて使うことにより、機能の選択肢が増えます。
image.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

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

その他ITAやAnsible Driverについての詳細は過去の記事を参照してください。
【随時更新】Exastroの参考になる記事をまとめてみた

また、Exastroの用語説明などについての詳細は、Exastroコミュニティページをご覧ください。
Exastroコミュニティページ

#作業環境

  • 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

#概要
今回はTerraform DriverとAnsible Driverの一つであるAnsible-Legacyを使って、各パブリッククラウド上のVM作成と作成したVMに対して、Apacheのインストールと起動を行いたいと思います。
下図のようなMovementと、3つのサブConductorを作成しそれをまたメインConductorでまとめ、実行していきます。
image.png

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

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

AWS
image.png
このようにインスタンスが何もありません。

Azure
image.png
Azureに関しては、リソースグループがNetworkWatcherのみで他のリソースグループは存在していません。

それではITA上から
AWSには「t2.micro」のWebサーバを3台
Azureには「Standard_B1ls」のWebサーバを3台と打ち込み・・・
image.png
image.png

「Conductor」メニューグループ>>「Conductor作業実行」から先程のConductorを選択し
画面下「実行」ボタンを押下し実行します。
image.png

数分後、Conductorの実行が完了しました。
image.png

実行後のAWSにインスタンスが追加されているか確認します。
image.png

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

一方Azureはどうでしょうか
image.png

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

作成したVMにブラウザからアクセスしてみると
image.png

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

それでは、先程打ち込んだ内容を以下のように変更してもう一度実行します。

AWS「t2.micro」3台→「t2.small」5台
Azure  3台   →   1台
htmlファイル→タイトルと本文の修正

image.png
image.png

Conductor実行後のAWSインスタンスはどうなっているでしょうか
image.png

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

Azureは・・・
image.png

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

最後に作成したWebサーバに接続して内容が変更されているか確認します。
image.png

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

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

#作業手順
前章冒頭で述べたように、今回はTerraform DriverとAnsible-Legacyを使って各パブリッククラウド上にVMを作成し、そのVMに対してApacheのインストールと起動を行います。各パブリッククラウド上のVM作成と作成したVMに対して、Apacheのインストールと起動を行います。
image.png

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

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

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

  1. 事前準備

  2. 作業対象ホストの登録

  3. ホストグループ設定

  4. メニューグループの作成

  5. テンプレートファイルの登録

  6. 投入オペレーション登録

  7. Terraform Driver編

  8. インタフェース情報変更

  9. Organization管理情報登録

  10. Workspaceの登録

  11. Movement作成

  12. Module素材登録

  13. Movement詳細へ登録

  14. パラメータシートの作成

  15. 代入値自動登録設定

  16. Ansible-Legacy編

  17. Movement作成

  18. Playbook素材登録

  19. Movement詳細へ登録

  20. パラメータシートの作成

  21. 代入値自動登録設定

  22. Conductor実行編

  23. パラメータの登録

  24. Conductorの作成

  25. Conductor実行

  26. 実行確認

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

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

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

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

image.png

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

image.png

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

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

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

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

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

image.png

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

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

画面が遷移するので、登録欄から登録開始を選択します。
「Webサーバ」「Webサーバ_AWS」「Webサーバ_Azure」を登録します。
優先順位はわかりやすいようにそれぞれ「100」「200」「300」とします。
image.png

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

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

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

左メニューグループから「ホストグループ親子紐付」を選択します。
image.png

画面が遷移するので、登録欄から登録開始を選択します。
image.png
記入内容を確認後、「登録」ボタンをクリックして登録します。

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

メインメニュー(DASHBOARD)から「管理コンソール」メニューグループ >> 「メニューグループ管理」を選択します。
image.png

画面が遷移するので、登録欄から登録開始を選択します。
「コード管理」と「Webサーバ構築」の2つを登録します。
表示順序はそれぞれ「500」「600」とします。
image.png
記入内容を確認後、「登録」ボタンをクリックして登録します。

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

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

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

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

画面が遷移するので、登録欄から登録開始を選択します。
image.png
記入内容を確認後、「登録」ボタンをクリックして登録します。

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

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

メインメニュー(DASHBOARD)から「基本コンソール」メニューグループ >> 「投入オペレーション一覧」を選択します。
image.png

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

画面が遷移するので、登録欄から登録開始を選択します。
image.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

再度ITA画面に戻り、メインメニュー(DASHBOARD)から「Terraform」メニューグループ >> 「インターフェース情報」を選択します。
image.png
画面が遷移するので、「一覧」欄から「更新」ボタンをクリックします。
image.png
image.png
記入内容を確認後、「更新」ボタンをクリックして登録内容を更新します。

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

左メニューグループから「Organizations管理」を選択します
image.png
画面が遷移するので、登録欄から登録開始を選択します。
image.png
記入内容を確認後、「登録」ボタンをクリックして登録します。
また、「フィルタ」ボタンを押下することで先程登録したレコードを確認できます。
登録したレコードの「連携状態チェック」を押下すると、「連携状態チェック」の下にOrganizationの連携状態が表示されます。
image.png

Terraform Cloudにログインし、Organizationが作成されているか確認します。
image.png

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

左メニューグループから「Workspaces管理」を選択します
image.png
画面が遷移するので、登録欄から登録開始を選択します。
ここではAWS実行用とAzure実行用の2つのWorkspaceを登録します。
image.png
記入内容を確認後、「登録」ボタンをクリックして登録します

また、「フィルタ」ボタンを押下することで先程登録したレコードを確認できます。
登録したレコードの「連携状態チェック」を押下すると、「連携状態チェック」の下にOrganizationの連携状態が表示されます。
image.png
Terraform Cloudにログインして、Workspaceが作成されているか確認します。
image.png

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

左メニューグループから「Movement一覧」を選択します。
image.png

画面が遷移するので、登録欄から登録開始を選択します。
ここではAWS実行用とAzure実行用の2つのMovementを登録します。
また、先程登録したWorkspaceと関連付けます。
image.png
記入内容を確認後、「登録」ボタンをクリックして登録します。

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

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

AWSインスタンス作成用

aws_create_instance_variables.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インスタンス作成用リソース定義ファイル

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 ・・・変数定義ファイル

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インスタンス作成用リソース定義ファイル

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

画面が遷移するので、登録欄から登録開始を選択します。
登録する4つのModule素材と、それに対応したModule素材名を付けて登録します。
image.png
記入内容を確認後、「登録」ボタンをクリックして登録します。

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

左メニューグループから「Module素材集」を選択します。
image.png

画面が遷移するので、登録欄から登録開始を選択します。
前節で作成したMovement「VM作成(AWS)」と「VM作成(Azure)」に対応したModule素材を登録します。
image.png
記入内容を確認後、「登録」ボタンをクリックして登録します。

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

メインメニュー(DASHBOARD)から「メニュー作成」メニューグループ >> 「メニュー定義/作成」を選択します
image.png
画面が遷移してメニュー作成画面が表示されます。
image.png

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

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

画面右の「メニュー作成情報」の作成対象をクリックして「データシート」に切り替えます
image.png

項目を下図のように設定し、「作成」ボタンを押下します。
インスタンス名
image.png
リソースグループ名
image.png

また、ここでついでにWebサーバ構築(インストールパッケージ)に使うデータシートも作成します。
フラグ
image.png

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

インスタンス作成(AWS)
下図のように項目を設定します。
image.png
image.png
項目内容を確認後、「作成」ボタンを押下します。

インスタンス作成(Azure)
下図のように項目を設定します。
image.png
image.png
image.png
image.png
項目内容を確認後、「作成」ボタンを押下します。

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

メインメニュー(DASHBOARD)から「Terraform」メニューグループ >> 「代入値自動登録設定」を選択します
image.png
画面が遷移するので、登録欄から登録開始を選択します。
image.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

画面が遷移するので、登録欄から登録開始を選択します。
image.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直下にファイル出力する。

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直下にファイル出力する。

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サーバに接続し、以下を実行します。

# 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内指定するカラムに注意する必要がある。

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

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)

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

Webサーバ設定系

yum_package_install.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
インストールしたパッケージを起動します。

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接続が開通するまで待機します。

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の設定を行います。
変更があった場合、マシンのリブートを行います。

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.テンプレートファイルの登録」で登録したテンプレートファイルをマシンに配置します。

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

画面が遷移するので、登録欄から登録開始を選択します。
image.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

画面が遷移するので、登録欄から登録開始を選択します。
image.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
画面が遷移してメニュー作成画面が表示されます。
image.png
前章同様に、以下の図のように項目を設定、作成してください。

EC2連携(AWS)
image.png
image.png

VM連携(Azure)
image.png
image.png

Webサーバ設定
image.png
image.png

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

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

メインメニュー(DASHBOARD)から「Ansible-Legacy」メニューグループ>>「代入値自動登録設定」を選択します。
image.png

画面が遷移するので、登録欄から登録開始を選択します。
image.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

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

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

インスタンス名
image.png

リソースグループ名
image.png

フラグ
image.png

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

メインメニュー(DASHBOARD)から「Webサーバ構築」メニューグループを開き、値を設定する対象のメニューを選択し、登録作業を行います。
image.png

インスタンス作成(AWS)
左メニューから「インスタンス作成(AWS)」を選択すると画面が遷移するので、登録欄から登録開始を選択します。
image.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

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

ホスト名 オペレーション セキュリティ-
アクセスキー
セキュリティ-
アクセスキー
インスタンス情報-
リージョン
localhost demo (AWSアクセスキー) (AWSシークレットキー) ap-south-1
インスタンス情報-
インスタンス名(プレフィックス)
exastroユーザID exastroパスワード 保存ファイル名 ホストグループ名
ita-demo-instance administrator (exastroユーザに基づいたパスワード) VM_list.txt Webサーバ_AWS
仮想マシン-
ホスト
仮想マシン-
キーペア
仮想マシン-
キー内容
遅延タイマー[秒]
centos ita-demo-key.pem
(VMの秘密鍵ファイル名)
(秘密鍵の内容)(※3) 12

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

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

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

インスタンス作成(Azure)
左メニューから「インスタンス作成(Azure)」を選択すると画面が遷移するので、登録欄から登録開始を選択します。
image.png

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

オペレーション サブスクリプションID,テナントID
クライアントID,クライアントシークレット
リソースグループ名 ロケーション
demo_sub (認証情報) ita-demo-rg ita-demo-web-azure
セキュリティグループ名 仮想ネットワーク名 仮想ネットワークアドレス サブネット-
サブネット名
サブネット-
プレフィックス
ita-demo-security-group ita-demo-vnet 10.0.0.0/16 ita-demo-subnet 10.0.2.0/24
パブリックIPアドレス名
(プレフィックス)
パブリックIPアドレス-
アロケーションメソッド
パブリックIPアドレス-
ドメイン名ラベル
仮想NIC-
インタフェース名
(プレフィックス)
仮想NIC-
NIC名
ita-demo-public-ip Dynamic ita-demo-domain ita-demo-nwif ita-demo-NIC
インスタンス名 ソースイメージ-
publisher
ソースイメージ-
offer
ソースイメージ-
sku
ソースイメージ-
version
ita-demo-web-azure OpenLogic CentOS 8_2 latest
ディスクシステム-
ディスク名(プレフィックス)
ディスクシステム-
タイプ
ディスクシステム-
caching
ユーザ情報-
管理者ユーザ名
ユーザ情報-
SSH公開鍵
ita-demo-os-disk Standard_LRS ReadWrite ita-demo (AWSの「ita-demo-key」の
公開鍵を利用)
インスタンスサイズ インスタンス数
Standard_B1ls 3

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

VM連携(Azure)
左メニューから「VM連携(Azure)」を選択すると画面が遷移するので、登録欄から登録開始を選択します。
image.png

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

ホスト名 オペレーション サブスクリプションID,テナントID
クライアントID,クライアントシークレット
リソースグループ名
localhost demo_sub (認証情報) ita-demo-rg
exastroユーザID exastroパスワード 保存ファイル名 ホストグループ名
administrator(※) (exastroユーザに基づいたパスワード) VM_list.txt Webサーバ_Azure
仮想マシン-
ホスト
仮想マシン-
キーペア
仮想マシン-
キー内容
遅延タイマー[秒]
ita-demo ita-demo-key.pem
(VMの秘密鍵ファイル名)
(秘密鍵の内容) 12

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

Webサーバ設定
左メニューから「Webサーバ設定」を選択すると画面が遷移するので、登録欄から登録開始を選択します。
image.png

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

ホスト名/ホストグループ名 オペレーション パッケージ-httpd selinux
[HG]Webサーバ demo disabled
コンテンツ-
Webタイトル
コンテンツ-
Web本文
タイトル 本文です<br>
マルチクラウド <br>

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

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

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

「Terraform」メニューグループ>>「代入値管理」
image.png

「Ansible-Legacy」メニューグループ>>「代入値管理」
image.png

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

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

メインメニュー(DASHBOAD)から「Conductor」メニューグループ>>「Conductorクラス編集」を選択します。
image.png

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

Conductorクラス編集の仕方 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) 接続しているノードの処理が完了した後、次の処理を実行します。

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

Conductor①「VM作成(AWS)」
image.png

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

Conductor②「VM作成(Azure)」
image.png

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

Conductor③ 「ServerSetting」
image.png

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

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

「VM作成・設定」Conductor
image.png

また、「VM作成(Azure)」にオペレーション「demo_sub」を選択させます。
image.png

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

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

「Conductor」メニューグループ>>「Conductor作業実行」を選択します。
image.png

画面が遷移しますので、作成したConductorとオペレーションを選択します。
image.png

画面下に移動し、「実行」ボタンを押下することで、Conductorを実行させます。
image.png

ボタンを押下すると、実行中のConductor作業確認画面に遷移します。
image.png

すべて作業完了すると、以下のような表記になります。
image.png

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

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

###実行前

ITA「基本メニュー」メニューグループ-「機器一覧」
image.png

ITA「ホストグループ管理」メニューグループ-「ホスト紐付け」
image.png

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

###実行後

「基本メニュー」メニューグループ-「機器一覧」
image.png
ITA「ホストグループ管理」メニューグループ-「ホスト紐付け」
image.png
6つの仮想マシンがITAに新たに追加されています。

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

「基本メニュー」メニューグループ-「機器一覧」
image.png
ITA「ホストグループ管理」メニューグループ-「ホスト紐付け」
image.png

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

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

###索引

9
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?