尝试使用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側)

任务摘要
本次使用Terraform驱动器,在各个公共云(AWS、Azure)上根据所定义的策略创建符合条件的虚拟机。
具体操作如下:
【预备篇】
-
- 注册接口信息
-
- 注册并关联组织
-
- 注册并关联工作空间
-
- 注册工作模式(动作)
-
- 注册模块素材
-
- 注册策略
-
- 注册策略集
-
- 将策略绑定到策略集
-
- 将工作空间绑定到策略集
- 为动作指定模块素材
【执行篇】
-
- 注册操作
-
- 设置变量值
-
- 确认计划
-
- 执行操作
-
- 确认执行状态
- 更改变量值并重新执行
一旦注册并关联直到上述“准备篇”,之后的操作可以通过重复执行“执行篇”来进行,从而实现目标的重新设置和重新注册(自动化)。
进行培训篇
注册接口信息
将Terraform Driver与Terraform Enterprise进行整合。




请参考下表填写并点击”更新”按钮以更新注册内容。
2. 组织的注册和协作
注册Terraform Enterprise的组织。


请按照下表填写相关信息,然后点击”注册”按钮进行注册。
同時,“按下”按钮再次可以查看先前注册的记录。按下“关联状态检查”按钮可以在“关联状态检查”下方显示Organization的关联状态。登录到Terraform Enterprise并确认是否已创建Organization。

3. 进行Workspace的注册和关联
我将注册Terraform Enterprise的工作区。


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

注册作业模式(Movement)
进行与模块素材相关的动作设置。


请根据下表填写信息,然后点击“注册”按钮进行注册。
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
}
}
模块材料注册


请按照下表填写内容,然后点击“注册”按钮完成注册。
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
}
政策素材登録


请根据下表填写信息,点击”注册”按钮进行注册。
7. 注册PolicySet
我们将注册PolicySet。
通过将PolicySet与Policy和Workspace关联,可以在工作执行时为目标Workspace启用Policy。


8. 将策略集PolicySet与策略Policy关联。
我们将先前注册的Policy和PolicySet进行关联。


请根据下表填写相关信息,然后点击”注册”按钮完成注册。
9. 将Workspace与PolicySet关联。
将已注册的PolicySet与Workspace进行关联。

请根据下表填写信息,并点击“注册”按钮进行注册。
10. 将 Movement 指定为 Module 素材
将注册的模块素材与动作进行关联。


请参考下表填写,并点击“注册”按钮进行注册。
执行部分
1. 注册操作
我要注册操作。
操作是指在ITA中用于表示整个工作的工作名称。


请参考下表填写并点击“注册”按钮进行注册。
※「计划执行日期时间」是ITA内部保存的数据,不代表实际操作执行的时间。
2. 设定变量值
将具体的的数值赋给模块的变量。


AWS的参数设置内容
在开展工作之前,必须事先创建安全组和密钥对。
Azure的输入值登记内容
请使用事先准备的SSH公钥进行操作。
具体值为SSH公钥文本「ssh-rsa xxxxxxxx~」。
3. 确认计划
在之前的工作中,我们完成了创建运动并注册赋值的步骤。现在,让我们检查一下创建的模块是否符合定义的策略。


查看PolicyCheck日志

更改变量的值,并重新运行
在前面的案例中发现了违反策略的赋值。所以,让我们改变赋值然后再次执行吧。
使用 Terraform,根据下表提供的参考进入值管理,修改代入值。
完成更改后,请再次执行相同的操作。

4. 进行任务执行
我们可以确认已经应用了执行模块所定义的策略。最后执行Movement,并在目标主机上确认结果。

确认执行状态

当画面跳转至终端后,如果能够确认执行状态为“完成”,
实际上我们需要通过浏览器访问AWS、Azure,以确保实例是否已经成功创建。

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

创建了名为「ita-demo-rg」的资源组,
其中包含了3台名为「ita-demo-web-azure」的虚拟机。
6. 修改变量值并重新运行
最后,我们将更改要创建的实例数量的具体值,并再次执行相同的移动操作。
Terraform >> 我们将根据下表中的参考值从变量管理中更改具体值。
完成更改后,再次执行相同的操作。

根据更改,AWS上的实例从3台增加到了5台,Azure上的实例则减少到了1台。
结束
这次我们使用ITA的Terraform-Driver进行了公共云的自动化部署。
通过这个部署的虚拟机,可以使用ITA的Ansible-Driver对服务器进行配置等操作。
另外,使用Conductor可以更轻松地进行多云的自动化部署。
目录
-
- ExastroSuite コミュニティページ
-
- Exastro IT Automation
- 【随時更新】Exastroの参考になる記事をまとめてみた