尝试使用Exastro IT Automation的Terraform驱动程序(ver1.8)

首先

首先,我们之前已经讲解了Exastro IT Automation(以下简称ITA)的安装以及ITA的Ansible Driver的三种模式。在本文中,我们将重点介绍ITA的Terraform Driver,并详细解释其使用方法。

相关链接

相关链接

    • Exastroコミュニティページ

 

    • Exastro IT Automation

 

    • Exastro IT Automationをインストールしてみた(v1.8.0)

 

    【随時更新】Exastroの参考になる記事をまとめてみた

Exastro IT自动化是什么?

ITA是一个开源框架,它将系统配置转化为代码进行统一管理。
它可以管理设备信息、配置值、工作历史等与系统构建相关的信息,并可以将这些值输出为Excel数据。
此外,ITA还具备将各设备的系统构建和运维设置等作为工作流程进行管理或执行的功能,并能够与各种PF构建工具进行协作。

本次活动将作为体验ITA的快速起步,使用ITA的标准集成功能Terraform-Driver来进行公共云的创建。同时,将定义策略并确认是否按照策略来创建虚拟机。

Terraform 是什么?

Terraform是HashiCorp所提供的開源工具,可以根據定義文件在雲端上生成、刪除、操作資源,並將基礎設施的構建和設定轉化為程式碼。其特點在於可以以聲明方式定義基礎設施配置,而不需要從頭開始編寫建構步驟,可以專注於配置定義。

Exastro中的Terraform驱动程序作为ITA系统的选项,可以与在ITA系统中注册的Terraform Enterprise或Terraform Cloud进行交互,包括创建Organization,创建Workspace,定义策略,执行操作以及获取操作日志。

这次我们将在ITA上注册Terraform Enterprise并进行工作。

工作环境

    • Exastro IT Automation ver 1.8.1

 

    • CentOS Linux 7.8(ITAサーバ用)

 

    • Terraform Enterprise

 

    • AWS

 

    • Azure

 

    • Windows 10 (クライアント)

 

    Google Chrome (Win10側)
image.png

作业的摘要

本次使用Terraform驱动程序,在每个公共云(AWS、Azure)上创建符合定义的策略的虚拟机。

具体步骤如下所示。

【练成阶段】

    1. 注册接口信息

 

    1. 注册和连接组织

 

    1. 注册和连接工作区

 

    1. 注册运动模式

 

    1. 注册模块材料

 

    1. 注册策略

 

    1. 注册策略集

 

    1. 将策略关联到策略集

 

    1. 将工作区关联到策略集

 

    在运动模式中指定模块材料

【执行篇】

    1. 注册操作

 

    1. 设置变量值

 

    1. 确认计划

 

    1. 执行操作

 

    1. 确认执行状态

 

    更改变量值并重新执行

只需將以上的【仕込編】一次性註冊並連接,之後的操作只需重複執行【執行編】,即可進行對目標的重新設定和重新登錄。(自動化)

准备篇

1. 注册接口信息

我們將協調 Terraform Driver 與 Terraform Enterprise 之間的整合。

image.png
image.png
image.png
image.png

请参考下表填写并点击”更新”按钮以更新注册内容。

HostnameUser Token(Terraform Enterpriseのドメイン名)(発行したユーザトークン)

2. 注册和联络与组织的机构进行连接。

注册 Terraform Enterprise 的组织。

image.png
image.png

请根据下表填写相关信息,点击“注册”按钮进行注册。

Organization NameEmail addressITAlearn_org(Terraformユーザのメールアドレス)

您可以通过点击“筛选”按钮来查看先前注册的记录。
当您点击注册记录的“协作状态检查”时,组织的协作状态将显示在“协作状态检查”的下方。
请登录Terraform Enterprise并确认是否已创建组织。

image.png

3. Workspace的注册和协作.

我将注册 Terraform Enterprise 的 Workspace。

image.png
image.png

请根据下方的表格填写信息,点击”注册”按钮完成注册。

OrganizationWorkspace NameITAlearn_orgITA-demo-AWSITAlearn_orgITA-demo-Azure
image.png

4. 注册工作模式(动作)

我們將為模組素材進行相關的運動設定。

image.png
image.png

请根据下表填写信息,然后点击“注册”按钮完成注册。

Movement名Organization:WorkspaceVM作成(AWS)ITAlearn_org:ITA-demo-AWSVM作成(Azure)ITAlearn_org:ITA-demo-Azure

5. 模組素材的註冊

将要执行的Module素材登记到ITA。

模块的素材

以下是在ITA注册的模块素材,共有4个。
请使用UTF-8字符编码,换行符使用LF,并以”tf”为文件扩展名进行创建。

用于创建AWS实例

aws_create_instance_variables.tf 文件是用于定义 AWS 实例创建所需的变量文件。
变量中将被赋值具体值变量。

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上预先创建好安全组和密钥对。

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 实例创建变量的文件。
变量将被赋予具体值变量。


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 实例的资源定义文件。
它包括创建资源组、网络安全组和虚拟网络。
此外,还会创建所需数量的虚拟机、磁盘和网络接口。

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
  }
}

模块素材登记

image.png
image.png

请根据下表填写相关信息,然后点击“注册”按钮进行注册。

Module素材名Module素材aws_create_instance_variablesaws_create_instance_variables.tfaws_create_instance_bodyaws_create_instance.tfazure_create_instance_variablesazure_create_instance_variables.tfazure_create_instance_bodyazure_create_instance.tf

6. 政策的注册

将要执行的策略材料注册到ITA。

政策内容
政策材料
政策资料
策略信息

本次注册到ITA的Policy素材有以下4个。
请使用UTF-8字符编码、LF换行符和.sentinel扩展名来创建。

这是一个限制提议的每月成本的策略。
如果每月成本超过$50,则不会执行Apply操作。
此外,该月总成本估计将被输出。
适用于AWS和Azure两个云平台。

import "tfrun"
import "decimal"

limit = decimal.new(50)

cost_limit_by_workspace = func() {
  if tfrun.cost_estimate else null is null {
    print("no cost estimates available")
    return false
    }

  workspace_name = tfrun.workspace.name

  proposed_cost = decimal.new(tfrun.cost_estimate.proposed_monthly_cost)

  if proposed_cost.less_than(limit) {
    print("Proposed monthly cost", proposed_cost.string,
      "of workspace", workspace_name,
      "is under the limit: $", limit)
    return true
  }

  if proposed_cost.greater_than(limit) {
    print("Proposed monthly cost", proposed_cost.string,
       "of workspace", workspace_name,
       "is over the limit: $", limit)
    return false
    }
}

cost_validated = cost_limit_by_workspace()

main = rule {
  cost_validated
}

政策素材注册

image.png
image.png

请根据下表填写相关信息,然后点击”注册”按钮进行注册。

Policy名Policy素材limit-proposed-monthly-costlimit-proposed-monthly-cost.sentinel

7. 注册PolicySet

請登錄PolicySet。
透過將PolicySet與Policy和Worksoace關聯起來,可以在工作執行時對目標Workspace啟用Policy。

image.png
image.png
PolicySet名PolicySet_demo

8. 将策略与策略集相关联。

将刚刚注册的Policy和PolicySet进行关联。

image.png
image.png

请根据下表填写相关信息,并点击”注册”按钮完成注册。

Policy SetPolicy1:PolicySet_demo1:limit-proposed-monthly-cost

9. 将Workspace与PolicySet绑定在一起。

将已注册的PolicySet和Workspace进行关联。

image.png

请根据下表填写内容,然后点击”注册”按钮进行注册。

Policy SetOrganization:Workspace1:PolicySet_demoITAlearn_org:ITA-demo-AWS1:PolicySet_demoITAlearn_org:ITA-demo-Azure

10. 指定将Module素材移动至Movement

将已注册的模块素材与动作进行关联。

image.png
image.png

请按照下表填写并点击“注册”按钮进行注册。

MovementModule素材VM作成(AWS)aws_create_instance_variablesVM作成(AWS)aws_create_instance_bodyVM作成(Azure)azure_create_instance_variablesVM作成(Azure)azure_create_instance_body

执行部分

1. 注册操作

注册操作。
操作是指在ITA中使用的表示整个操作的操作名称。

image.png
image.png

请按照下表填写相应信息,并点击”注册”按钮进行注册。

オペレーション名実施予定日時Terraform_demo(任意の日時を記入)

※ 「実施予定日時」为ITA内部保存的数据,并不代表实际执行操作的时间。

2. 设置变量值 zhí)

将具体的的数值赋给模块的变量。

image.png
image.png

AWS代入值登记内容

オペレーションMovement変数名具体値Terraform_demoVM作成(AWS)security_groupita-demo-sg※Terraform_demoVM作成(AWS)key_nameita-demo-key※Terraform_demoVM作成(AWS)access_key(AWSアクセスキー)Terraform_demoVM作成(AWS)secret_key(AWSシークレットキー)Terraform_demoVM作成(AWS)region(任意のリージョン)Terraform_demoVM作成(AWS)tags_nameita-demo-instanceTerraform_demoVM作成(AWS)hello_tf_instance_typet2.largeTerraform_demoVM作成(AWS)hello_tf_instance_count3Terraform_demoVM作成(AWS)ami(任意のAMI)

需要事先创建安全组和密钥对。

Azure的值註冊內容

オペレーションMovement変数名具体値Terraform_demoVM作成(Azure)subscription_id(Azure認証情報)Terraform_demoVM作成(Azure)tenant_id(Azure認証情報)Terraform_demoVM作成(Azure)client_id(Azure認証情報)Terraform_demoVM作成(Azure)client_secret(Azure認証情報)Terraform_demoVM作成(Azure)resource_group_nameita-demo-rgTerraform_demoVM作成(Azure)locationjapaneastTerraform_demoVM作成(Azure)security_groupita-demo-security-groupTerraform_demoVM作成(Azure)Vnet_nameita-demo-vnetTerraform_demoVM作成(Azure)Vnet_address_space10.0.0.0/16Terraform_demoVM作成(Azure)subnet_nameita-demo-subnetTerraform_demoVM作成(Azure)address_prefixes10.0.2.0/24Terraform_demoVM作成(Azure)public_ip_namepublic_ip_nameTerraform_demoVM作成(Azure)allocation_methodDynamicTerraform_demoVM作成(Azure)domain_name_labelita-demo-domainTerraform_demoVM作成(Azure)network_interface_nameita-demo-nwifTerraform_demoVM作成(Azure)NIC_nameita-demo-NICTerraform_demoVM作成(Azure)VM_nameta-demo-web-azureTerraform_demoVM作成(Azure)publisherOpenLogicTerraform_demoVM作成(Azure)offerCentOSTerraform_demoVM作成(Azure)sku8_2Terraform_demoVM作成(Azure)source_image_versionlatestTerraform_demoVM作成(Azure)os_disk_nameos_disk_nameTerraform_demoVM作成(Azure)storage_account_typeStandard_LRSTerraform_demoVM作成(Azure)cachingReadWriteTerraform_demoVM作成(Azure)admin_usernameita-demoTerraform_demoVM作成(Azure)ssh_public_key(任意のSSH公開鍵)Terraform_demoVM作成(Azure)VM_sizeStandard_B2MSTerraform_demoVM作成(Azure)VM_count3

确认计划

在进行到目前为止的工作中,创建和赋值移动(Movement)已经完成。
接下来,让我们确保创建的模块是否符合定义的策略。

image.png
image.png

查看PolicyCheck日志

image.png

更改参数值并重新执行。

根据前面的内容,我们发现了输入值违反了策略。
因此,让我们更改输入值并重新执行。

使用Terraform根据代入值管理,并参考下表修改代入值。

オペレーションMovement変数名具体値(変更前)具体値(変更後)Terraform_demoVM作成(AWS)hello_tf_instance_typet2.larget2.microTerraform_demoVM作成(Azure)VM_sizeStandard_B2MSStandard_B1LS

在完成更改后,让我们再次执行相同的操作。

image.png

4.执行任务

我们确认了执行的模块正在应用所定义的策略。最后,执行Movement并在目标主机上进行确认结果。

image.png

确认执行状态

image.png

当画面跳转到另一个页面后,如果能够确认执行状态为”完成”,
请实际从浏览器访问AWS、Azure,以确认实例是否已成功创建。

image.png

可以看到有3个名为「ita-demo-instance」的实例被创建。
另外,根据配置,所有实例类型都是「t2.micro」。

image.png

被命名为「ita-demo-rg」的资源组已经创建,并在其中建立了3台名为「ita-demo-web-azure」的虚拟机。

6. 修改变量值后再次执行。

最后,我们将更改创建实例的具体数量值,并再次运行相同的Movement。 我们将参考Terraform的分配值管理,并按照下表进行具体值的更改。

オペレーションMovement変数名具体値(変更前)具体値(変更後)Terraform_demoVM作成(AWS)hello_tf_instance_count35Terraform_demoVM作成(Azure)VM_count31

变更完成后,请再次以相同的方式执行。

image.png

根据修改的要求,AWS上的实例数量从3台增加到了5台。而Azure上的实例则由3台减少到了1台。

最后

这次我们使用ITA的Terraform-Driver进行了公共云的供应,现在可以使用ITA的Ansible-Driver对这些虚拟机进行服务器配置等操作。
而且,似乎可以通过使用Conductor来轻松实现多云的供应。

检索

    • ExastroSuite コミュニティページ

 

    • Exastro IT Automation

 

    【随時更新】Exastroの参考になる記事をまとめてみた
广告
将在 10 秒后关闭
bannerAds