尝试使用Exastro IT Automation的Terraform Driver(版本1.9)

首先

在本篇文章中,我們將重點介紹ITA的Terraform Driver並解說其使用方法。

相关链接

    • Exastroコミュニティページ

 

    • Exastro IT Automation

 

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

 

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

Exastro IT Automation是什么?

ITA是一个开源框架,用于将系统配置转化为基础设施即代码(IaC)并进行统一管理。
它可以管理设备信息、配置值、操作历史等与系统配置相关的信息,并可以将这些值以Excel数据的形式导出。
此外,ITA还具有管理和执行各个设备的系统构建和运营配置等工作流功能,并可以与各种平台(PF)构建工具进行协作。

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

Terraform是什么?

Terraform 是由 HashiCorp 公司提供的开源工具,可以根据定义文件在云上生成、销毁和操作资源,实现基础架构的构建和配置代码化。它的特点是能够声明式地定义基础架构配置,无需从头编写构建步骤,可以专注于配置定义。

Exastro中的Terraform Driver作为ITA系统的选项,可用于注册到ITA系统中的Terraform Enterprise或Terraform Cloud,可以执行组织的创建、工作区的创建、策略的定义、操作的执行以及获取操作日志。

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

工作环境

    • Exastro IT Automation ver 1.9.0

 

    • 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. 确认执行状态

 

    更改变量值并重新执行

一旦注册并关联直到上述“准备篇”,之后的操作可以通过重复执行“执行篇”来进行,从而实现目标的重新设置和重新注册(自动化)。

进行培训篇

注册接口信息

将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ユーザのメールアドレス)

同時,“按下”按钮再次可以查看先前注册的记录。按下“关联状态检查”按钮可以在“关联状态检查”下方显示Organization的关联状态。登录到Terraform Enterprise并确认是否已创建Organization。

image.png

3. 进行Workspace的注册和关联

我将注册Terraform Enterprise的工作区。

image.png
image.png

请依照下表的参考进行填写,并点击“注册”按钮完成注册。

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

注册作业模式(Movement)

进行与模块素材相关的动作设置。

image.png
image.png

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

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

5. 模块素材的注册

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

模块的资源库

这次要注册到ITA的模块材料有以下四个。
字符编码请使用”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的政策材料有以下4个。
请使用UTF-8字符编码,LF换行符,以.sentinel扩展名创建。

限制每月费用的策略。
如果每月费用超过50美元,则不会应用。
此外,还会输出该月费用的总估计。
适用于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和Workspace关联,可以在工作执行时为目标Workspace启用Policy。

image.png
image.png
PolicySet名PolicySet_demo

8. 将策略集PolicySet与策略Policy关联。

我们将先前注册的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. 将 Movement 指定为 Module 素材

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

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. 设定变量值

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

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_label(任意のグローバルなドメイン名)Terraform_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

请使用事先准备的SSH公钥进行操作。
具体值为SSH公钥文本「ssh-rsa xxxxxxxx~」。

3. 确认计划

在之前的工作中,我们完成了创建运动并注册赋值的步骤。现在,让我们检查一下创建的模块是否符合定义的策略。

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

我們可以看到已經建立了三個名稱為「ita-demo-instance」的實例。
此外,根據設定,這些實例的類型都是「t2.micro」。

image.png

创建了名为「ita-demo-rg」的资源组,
其中包含了3台名为「ita-demo-web-azure」的虚拟机。

6. 修改变量值并重新运行

最后,我们将更改要创建的实例数量的具体值,并再次执行相同的移动操作。
Terraform >> 我们将根据下表中的参考值从变量管理中更改具体值。

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

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

image.png

根据更改,AWS上的实例从3台增加到了5台,Azure上的实例则减少到了1台。

结束

这次我们使用ITA的Terraform-Driver进行了公共云的自动化部署。
通过这个部署的虚拟机,可以使用ITA的Ansible-Driver对服务器进行配置等操作。
另外,使用Conductor可以更轻松地进行多云的自动化部署。

目录

    • ExastroSuite コミュニティページ

 

    • Exastro IT Automation

 

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