在这篇文章中我们将了解 Terraform 的组成,并逐步推出我们自己的基础设施
关于一切细节,分三个阶段:
1. Terraform - 描述、优点和组件
Terraform 是一种 IaC(基础设施即代码)工具,用于使用代码构建和管理虚拟基础设施。
我们注意到使用该工具的几个优点:
-
新租户部署速度 (自定义虚拟环境)。 通常,新客户越多,技术支持人员发布新资源所需的“点击”次数就越多。 使用 Terraform,用户可以更改虚拟机设置(例如,自动关闭操作系统和增加虚拟磁盘分区),而无需技术支持或关闭机器本身。
-
即时验证激活计划 新坦南特。 使用基础设施代码的描述,我们可以立即检查将添加的内容以及添加的顺序,以及这个或那个虚拟机或连接到虚拟机的虚拟网络的最终状态。
-
能够描述最流行的云平台。 您可以使用该工具 从 Amazon 和 Google Cloud 到基于 VMware vCloud Director 的私有平台,在 IaaS、SaaS 和 PaaS 解决方案中提供服务。
-
管理多个云提供商 并在它们之间分配基础设施以提高容错能力,使用单一配置来创建、诊断和管理云资源。
-
方便用于创建演示台 用于软件测试和调试。 您可以为测试部门创建和转移代表,在不同环境中并行测试软件,只需创建一个资源构建计划即可立即更改和删除资源
“玻璃容器”地形
我们简要讨论了该工具的优点,现在让我们将其分解为各个组件
提供商。
在 Terraform 中,几乎任何类型的基础设施都可以表示为资源。 资源和 API 平台之间的连接由提供程序模块提供,这些模块允许您在特定平台(例如 Azure 或 VMware vCloud Director)中创建资源。
作为项目的一部分,您可以与不同平台上的不同提供商进行交互。
资源(资源描述)。
资源描述允许您管理平台组件,例如虚拟机或网络。
您可以自行为 VMware vCloud Director 提供程序创建资源描述,并使用此描述为任何使用 vCloud Director 的托管提供程序创建资源。 您只需将身份验证参数和网络连接参数更改为所需的托管提供商
供给者。
该组件可以在创建虚拟机后执行操作系统的初始安装和维护操作。 创建虚拟机资源后,您可以使用配置程序通过 SSH 配置和连接、更新操作系统以及下载和运行脚本。
输入和输出变量。
输入变量 - 任何块类型的输入变量。
输出变量允许您在创建资源后保存值,并且可以用作其他模块中的输入变量,例如在 Provisioners 块中。
状态.
状态文件存储有关提供商平台资源配置的信息。 首次创建平台时,没有有关资源的信息,在进行任何操作之前,Terraform 使用已描述的资源的真实基础架构更新状态。
状态的主要目的是保存一堆已经创建的资源的对象,以便比较添加的资源和对象的配置,以避免平台的重复创建和更改。
默认情况下,状态信息存储在本地 terraform.tfstate 文件中,但如果需要,可以使用远程存储进行团队工作。
您还可以将当前平台资源导入状态,以进一步与无需 Terraform 帮助而创建的其他资源进行交互。
2. 基础设施建设
组件已经整理完毕,现在使用 Terraform 我们将逐步创建具有三个虚拟机的基础架构。 第一个安装了 nginx 代理服务器,第二个安装了基于 Nextcloud 的文件存储,第三个安装了 CMS Bitrix。
我们将使用我们的示例编写代码并执行它
首先,让我们为新项目创建一个目录,其中将放置描述基础设施的文件。
mkdir project01
接下来,我们描述基础设施组件。 Terraform 根据文件中的描述创建关系并处理文件。 文件本身可以根据所描述的块的用途来命名,例如,network.tf - 描述基础设施的网络参数。
为了描述我们的基础设施的组件,我们创建了以下文件:
文件列表。
main.tf - 虚拟环境参数描述 - 虚拟机、虚拟容器;
network.tf——虚拟网络参数以及NAT和防火墙规则的描述;
Variables.tf - 我们使用的变量列表;
vcd.tfvars - VMware vCloud Director 模块的项目变量值。
Terraform 中的配置语言是声明性的,除了配置程序块之外,块的顺序并不重要,因为在本块中,我们描述了准备基础设施时要执行的命令,并且它们将按顺序执行。
块结构。
<BLOCK TYPE> "<BLOCK LABEL>" "<BLOCK LABEL>" {
# Block body
<IDENTIFIER> = <EXPRESSION> # Argument
}
为了描述块,使用了它自己的编程语言 HCL(HashiCorp 配置语言);可以使用 JSON 来描述基础设施。 您可以了解有关语法的更多信息
环境变量配置,variables.tf和vcd.tfvars
首先,我们创建两个文件来描述 VMware vCloud Director 模块的所有使用的变量及其值的列表。 首先,让我们创建变量.tf 文件。
Variables.tf 文件的内容。
variable "vcd_org_user" {
description = "vCD Tenant User"
}
variable "vcd_org_password" {
description = "vCD Tenant Password"
}
variable "vcd_org" {
description = "vCD Tenant Org"
}
variable "vcd_org_vdc" {
description = "vCD Tenant VDC"
}
variable "vcd_org_url" {
description = "vCD Tenant URL"
}
variable "vcd_org_max_retry_timeout" {
default = "60"
}
variable "vcd_org_allow_unverified_ssl" {
default = "true"
}
variable "vcd_org_edge_name" {
description = "vCD edge name"
}
variable "vcd_org_catalog" {
description = "vCD public catalog"
}
variable "vcd_template_os_centos7" {
description = "OS CentOS 7"
default = "CentOS7"
}
variable "vcd_org_ssd_sp" {
description = "Storage Policies"
default = "Gold Storage Policy"
}
variable "vcd_org_hdd_sp" {
description = "Storage Policies"
default = "Bronze Storage Policy"
}
variable "vcd_edge_local_subnet" {
description = "Organization Network Subnet"
}
variable "vcd_edge_external_ip" {
description = "External public IP"
}
variable "vcd_edge_local_ip_nginx" {}
variable "vcd_edge_local_ip_bitrix" {}
variable "vcd_edge_local_ip_nextcloud" {}
variable "vcd_edge_external_network" {}
我们从提供者处收到的变量值。
-
vcd_org_user — 具有组织管理员权限的用户名,
-
vcd_org_password — 用户密码,
-
vcd_org — 组织名称,
-
vcd_org_vdc — 虚拟数据中心的名称,
-
vcd_org_url - API URL,
-
vcd_org_edge_name — 虚拟路由器的名称,
-
vcd_org_catalog — 包含虚拟机模板的目录名称,
-
vcd_edge_external_ip — 公共 IP 地址,
-
vcd_edge_external_network — 外部网络的名称,
-
vcd_org_hdd_sp — HDD 存储策略的名称,
-
vcd_org_ssd_sp — SSD 存储策略的名称。
并输入我们的变量:
-
vcd_edge_local_ip_nginx — 带有 NGINX 的虚拟机的 IP 地址,
-
vcd_edge_local_ip_bitrix - 具有 1C 的虚拟机的 IP 地址:Bitrix,
-
vcd_edge_local_ip_nextcloud — Nextcloud 虚拟机的 IP 地址。
使用第二个文件,我们在 vcd.tfvars 文件中创建并指定 VMware vCloud Director 模块的变量: 让我们回想一下,在我们的示例中,我们使用
vcd.tfvars 文件的内容。
vcd_org_url = "https://vcloud.mclouds.ru/api"
vcd_org_user = "orgadmin"
vcd_org_password = "*"
vcd = "org"
vcd_org_vdc = "orgvdc"
vcd_org_maxretry_timeout = 60
vcd_org_allow_unverified_ssl = true
vcd_org_catalog = "Templates"
vcd_templateos_centos7 = "CentOS7"
vcd_org_ssd_sp = "Gold Storage Policy"
vcd_org_hdd_sp = "Bronze Storage Policy"
vcd_org_edge_name = "MCLOUDS-EDGE"
vcd_edge_external_ip = "185.17.66.1"
vcd_edge_local_subnet = "192.168.110.0/24"
vcd_edge_local_ip_nginx = "192.168.110.1"
vcd_edge_local_ip_bitrix = "192.168.110.10"
vcd_edge_local_ip_nextcloud = "192.168.110.11"
vcd_edge_external_network = "NET-185-17-66-0"
网络配置,network.tf。
环境变量设置完毕,现在我们将设置虚拟机连接方案 - 我们将为每个虚拟机分配一个私有 IP 地址,并使用目标 NAT 将端口“转发”到外部网络。 为了限制对管理端口的访问,我们将仅设置对我们的 IP 地址的访问。
正在创建的 Terraform 平台的网络图
我们创建一个名为 net_lan01 的虚拟组织网络,默认网关:192.168.110.254,地址空间:192.168.110.0/24。
我们描述一个虚拟网络。
resource "vcd_network_routed" "net" {
name = "net_lan01"
edge_gateway = var.vcd_org_edge_name
gateway = "192.168.110.254"
dns1 = "1.1.1.1"
dns2 = "8.8.8.8"
static_ip_pool {
start_address = "192.168.110.1"
end_address = "192.168.110.253"
}
}
让我们创建允许虚拟机访问 Internet 的防火墙规则。 在这个区块内,云中的所有虚拟资源都可以访问互联网:
我们描述了虚拟机访问互联网的规则。
resource "vcd_nsxv_firewall_rule" "fw_internet_access" {
edge_gateway = var.vcdorgedgename
name = "Internet Access"
source {
gateway_interfaces = ["internal"]
}
destination {
gateway_interfaces = ["external"]
}
service {
protocol = "any"
}
depends_on = [vcdnetworkrouted.net]
}
建立了处理 vcdnetworkrouted.net 块后的依赖关系,我们继续配置 vcdnsxvfirewallrule 块, 通过使用 依赖于取决于。 我们使用此选项是因为某些依赖项可能会在配置中隐式识别。
接下来,我们将创建允许从外部网络访问端口的规则,并指示我们通过 SSH 连接到服务器的 IP 地址。 任何 Internet 用户都可以访问 Web 服务器上的端口 80 和 443,IP 地址为 90.1.15.1 的用户可以访问虚拟服务器的 SSH 端口。
允许从外部网络访问端口。
resource "vcd_nsxv_firewall_rule" "fwnatports" {
edge_gateway = var.vcd_org_edge_name
name = "HTTPs Access"
source {
gateway_interfaces = ["external"]
}
destination {
gateway_interfaces = ["internal"]
}
service {
protocol = "tcp"
port = "80"
}
service {
protocol = "tcp"
port = "443"
}
depends_on = [vcd_network_routed.net]
}
resource "vcd_nsxv_firewall_rule" "fw_nat_admin_ports" {
edge_gateway = var.vcd_org_edge_name
name = "Admin Access"
source {
ip_addresses = [ "90.1.15.1" ]
}
destination {
gateway_interfaces = ["internal"]
}
service {
protocol = "tcp"
port = "58301"
}
service {
protocol = "tcp"
port = "58302"
}
service {
protocol = "tcp"
port = "58303"
}
depends_on = [vcd_network_routed.net]
}
我们创建源 NAT 规则用于从云本地网络访问 Internet:
我们描述源 NAT 规则。
resource "vcd_nsxv_snat" "snat_local" {
edge_gateway = var.vcd_org_edge_name
network_type = "ext"
network_name = var.vcdedgeexternalnetwork
original_address = var.vcd_edge_local_subnet
translated_address = var.vcd_edge_external_ip
depends_on = [vcd_network_routed.net]
}
为了完成网络块的配置,我们添加用于从外部网络访问服务的目标 NAT 规则:
添加目标 NAT 规则。
resource "vcd_nsxv_dnat" "dnat_tcp_nginx_https" {
edge_gateway = var.vcd_org_edge_name
network_name = var.vcd_edge_external_network
network_type = "ext"
description = "NGINX HTTPs"
original_address = var.vcd_edge_external_ip
original_port = 443
translated_address = var.vcd_edge_local_ip_nginx
translated_port = 443
protocol = "tcp"
depends_on = [vcd_network_routed.net]
}
resource "vcd_nsxv_dnat" "dnat_tcp_nginx_http" {
edge_gateway = var.vcd_org_edge_name
network_name = var.vcd_edge_external_network
network_type = "ext"
description = "NGINX HTTP"
original_address = var.vcd_edge_external_ip
original_port = 80
translated_address = var.vcd_edge_local_ip_nginx
translated_port = 80
protocol = "tcp"
depends_on = [vcd_network_routed.net]
}
为Nginx下的SSH服务器添加端口转换的NAT规则。
resource "vcd_nsxv_dnat" "dnat_tcp-nginx_ssh" {
edge_gateway = var.vcd_org_edge_name
network_name = var.vcd_edge_external_network
network_type = "ext"
description = "SSH NGINX"
original_address = var.vcd_edge_external_ip
original_port = 58301
translated_address = var.vcd_edge_local_ip_nginx
translated_port = 22
protocol = "tcp"
depends_on = [vcd_network_routed.net]
}
使用 1C-Bitrix 添加 NAT 规则以将端口转换到 SSH 服务器。
resource "vcd_nsxv_dnat" "dnat_tcp_bitrix_ssh" {
edge_gateway = var.vcd_org_edge_name
network_name = var.vcd_edge_external_network
network_type = "ext"
description = "SSH Bitrix"
original_address = var.vcd_edge_external_ip
original_port = 58302
translated_address = var.vcd_edge_local_ip_bitrix
translated_port = 22
protocol = "tcp"
depends_on = [vcd_network_routed.net]
}
使用 Nextcloud 添加 NAT 规则以将端口转换到 SSH 服务器。
resource "vcd_nsxv_dnat" "dnat_tcp_nextcloud_ssh" {
edge_gateway = var.vcd_org_edge_name
network_name = var.vcd_edge_external_network
network_type = "ext"
description = "SSH Nextcloud"
original_address = var.vcd_edge_external_ip
original_port = 58303
translated_address = var.vcd_edge_local_ip_nextcloud
translated_port = 22
protocol = "tcp"
depends_on = [vcd_network_routed.net]
}
Main.tf虚拟环境配置
正如我们在文章开头所计划的那样,我们将创建三个虚拟机。 他们将使用“宾客定制”来准备。 我们将根据我们指定的设置来设置网络参数,并且用户密码将自动生成。
我们来描述虚拟机所在的 vApp 及其配置。
虚拟机配置
让我们创建一个 vApp 容器。 为了让我们能够立即将 vApp 和 VM 连接到虚拟网络,我们还添加了 dependent_on 参数:
创建一个容器
resource "vcd_vapp" "vapp" {
name = "web"
power_on = "true"
depends_on = [vcd_network_routed.net]
}
让我们创建一个带有描述的虚拟机
resource "vcd_vapp_vm" "nginx" {
vapp_name = vcd_vapp.vapp.name
name = "nginx"
catalog_name = var.vcd_org_catalog
template_name = var.vcd_template_os_centos7
storage_profile = var.vcd_org_ssd_sp
memory = 8192
cpus = 1
cpu_cores = 1
network {
type = "org"
name = vcd_network_routed.net.name
is_primary = true
adapter_type = "VMXNET3"
ip_allocation_mode = "MANUAL"
ip = var.vcd_edge_local_ip_nginx
}
override_template_disk {
bus_type = "paravirtual"
size_in_mb = "32768"
bus_number = 0
unit_number = 0
storage_profile = var.vcd_org_ssd_sp
}
}
VM描述中主要参数:
-
name — 虚拟机的名称,
-
vappname - 要添加新虚拟机的 vApp 的名称,
-
Catalogname / templatename - 目录名称和虚拟机模板名称,
-
storageprofile - 默认存储策略。
网络块参数:
-
type — 连接网络的类型,
-
name — 将虚拟机连接到哪个虚拟网络,
-
isprimary - 主网络适配器,
-
ipallocation_mode — MANUAL / DHCP / POOL 地址分配模式,
-
ip — 虚拟机的 IP 地址,我们将手动指定它。
override_template_disk 块:
-
sizeinmb — 虚拟机的启动磁盘大小
-
storage_profile — 磁盘的存储策略
让我们创建第二个虚拟机,其中包含 Nextcloud 文件存储的描述
resource "vcd_vapp_vm" "nextcloud" {
vapp_name = vcd_vapp.vapp.name
name = "nextcloud"
catalog_name = var.vcd_org_catalog
template_name = var.vcd_template_os_centos7
storage_profile = var.vcd_org_ssd_sp
memory = 8192
cpus = 1
cpu_cores = 1
network {
type = "org"
name = vcd_network_routed.net.name
is_primary = true
adapter_type = "VMXNET3"
ip_allocation_mode = "MANUAL"
ip = var.vcd_edge_local_ip_nextcloud
}
override_template_disk {
bus_type = "paravirtual"
size_in_mb = "32768"
bus_number = 0
unit_number = 0
storage_profile = var.vcd_org_ssd_sp
}
}
resource "vcd_vm_internal_disk" "disk1" {
vapp_name = vcd_vapp.vapp.name
vm_name = "nextcloud"
bus_type = "paravirtual"
size_in_mb = "102400"
bus_number = 0
unit_number = 1
storage_profile = var.vcd_org_hdd_sp
allow_vm_reboot = true
depends_on = [ vcd_vapp_vm.nextcloud ]
}
在 vcdvminternal_disk 部分中,我们将描述连接到虚拟机的新虚拟磁盘。
vcdvminternaldisk 块的说明:
-
Bustype - 磁盘控制器类型
-
sizeinmb — 磁盘大小
-
总线号/单元号 - 适配器中的连接位置
-
storage_profile — 磁盘的存储策略
我们来描述一下 Bitrix 上最新的虚拟机
resource "vcd_vapp_vm" "bitrix" {
vapp_name = vcd_vapp.vapp.name
name = "bitrix"
catalog_name = var.vcd_org_catalog
template_name = var.vcd_template_os_centos7
storage_profile = var.vcd_org_ssd_sp
memory = 8192
cpus = 1
cpu_cores = 1
network {
type = "org"
name = vcd_network_routed.net.name
is_primary = true
adapter_type = "VMXNET3"
ip_allocation_mode = "MANUAL"
ip = var.vcd_edge_local_ip_bitrix
}
override_template_disk {
bus_type = "paravirtual"
size_in_mb = "81920"
bus_number = 0
unit_number = 0
storage_profile = var.vcd_org_ssd_sp
}
}
更新操作系统并安装其他脚本
网络已准备好,虚拟机已描述。 在导入基础设施之前,我们可以使用配置程序块提前进行初始配置,而无需使用 Ansible。
让我们看看如何使用配置程序块更新操作系统并运行 CMS Bitrix 安装脚本。
首先,让我们安装 CentOS 更新包。
resource "null_resource" "nginx_update_install" {
provisioner "remote-exec" {
connection {
type = "ssh"
user = "root"
password = vcd_vapp_vm.nginx.customization[0].admin_password
host = var.vcd_edge_external_ip
port = "58301"
timeout = "30s"
}
inline = [
"yum -y update && yum -y upgrade",
"yum -y install wget nano epel-release net-tools unzip zip" ]
}
}
}
组件名称:
-
配置程序“remote-exec” - 连接远程配置块
-
在连接块中,我们描述连接的类型和参数:
-
type — 协议,在我们的例子中是 SSH;
-
用户——用户名;
-
密码——用户密码。 在我们的例子中,我们指向参数vcdvappvm.nginx.customization[0].admin_password,它存储为系统用户生成的密码。
-
host——用于连接的外部IP地址;
-
port — 连接端口,之前在 DNAT 设置中指定;
-
内联 - 列出将输入的命令列表。 命令将按照本节中所示的顺序输入。
作为示例,我们另外执行 1C-Bitrix 安装脚本。 计划运行时,脚本执行结果的输出将可用。 要安装脚本,首先我们描述该块:
我们来描述一下1C-Bitrix的安装。
provisioner "file" {
source = "prepare.sh"
destination = "/tmp/prepare.sh"
connection {
type = "ssh"
user = "root"
password = vcd_vapp_vm.nginx.customization[0].admin_password
host = var.vcd_edge_external_ip
port = "58301"
timeout = "30s"
}
}
provisioner "remote-exec" {
inline = [
"chmod +x /tmp/prepare.sh", "./tmp/prepare.sh"
]
}
我们将立即描述 Bitrix 更新。
1C-Bitrix 配置示例。
resource "null_resource" "install_update_bitrix" {
provisioner "remote-exec" {
connection {
type = "ssh"
user = "root"
password = vcd_vapp_vm.bitrix.customization[0].admin_password
host = var.vcd_edge_external_ip
port = "58302"
timeout = "60s"
}
inline = [
"yum -y update && yum -y upgrade",
"yum -y install wget nano epel-release net-tools unzip zip",
"wget http://repos.1c-bitrix.ru/yum/bitrix-env.sh -O /tmp/bitrix-env.sh",
"chmod +x /tmp/bitrix-env.sh",
"/tmp/bitrix-env.sh"
]
}
}
重要的! 如果不提前禁用 SELinux,该脚本可能无法运行! 如果您需要有关使用 bitrix-env.sh 安装和配置 CMS 1C-Bitrix 的详细文章,您可以
3. 基础设施初始化
初始化模块和插件
工作时,我们使用简单的“绅士套件”:一台装有 Windows 10 操作系统的笔记本电脑和官方网站上的分发套件 terraform.exe init
在描述了计算和网络基础设施之后,我们开始计划测试我们的配置,在这里我们可以看到将创建什么以及它将如何相互连接。
-
执行命令
- terraform plan -var-file=vcd.tfvars
. -
我们得到结果
- Plan: 16 to add, 0 to change, 0 to destroy.
也就是说,按照这个计划,将会创建16个资源。 -
我们按照命令启动计划
- terraform.exe apply -var-file=vcd.tfvars
.
将创建虚拟机,然后我们列出的软件包将在配置程序部分中执行 - 将更新操作系统并安装 CMS Bitrix。
接收连接信息
执行计划后,我们希望接收文本形式的数据以连接到服务器,为此我们将格式化输出部分,如下所示:
output "nginxpassword" {
value = vcdvappvm.nginx.customization[0].adminpassword
}
以下输出告诉我们创建的虚拟机的密码:
Outputs: nginx_password = F#4u8!!N
因此,我们可以访问具有更新操作系统和预安装软件包的虚拟机,以进行进一步的工作。 一切准备就绪!
但是如果您已经拥有现有的基础设施怎么办?
3.1. 使用现有基础设施使用 Terraform
很简单,您可以使用 import 命令导入当前的虚拟机及其 vApp 容器。
我们来描述一下vAPP资源和虚拟机。
resource "vcd_vapp" "Monitoring" {
name = "Monitoring"
org = "mClouds"
vdc = "mClouds"
}
resource "vcd_vapp_vm" "Zabbix" {
name = "Zabbix"
org = "mClouds"
vdc = "mClouds"
vapp = "Monitoring"
}
下一步是以以下格式导入 vApp 资源的属性 vcdvapp.<vApp> <org>.<orgvdc>.<vApp>
哪里:
-
vApp - vApp 名称;
-
org——组织名称;
-
org_vdc — 虚拟数据中心的名称。
导入 vAPP 资源属性
让我们以以下格式导入 VM 资源的属性: vcdvappvm.<VM> <org>.<orgvdc>.<vApp>.<VM>
, 其中:
-
VM - 虚拟机名称;
-
vApp - vApp 名称;
-
org——组织名称;
-
orgvdc 是虚拟数据中心的名称。
导入成功
C:UsersMikhailDesktopterraform>terraform import vcd_vapp_vm.Zabbix mClouds.mClouds.Monitoring.Zabbix
vcd_vapp_vm.Zabbix: Importing from ID "mClouds.mClouds.Monitoring.Zabbix"...
vcd_vapp_vm.Zabbix: Import prepared!
Prepared vcd_vapp_vm for import
vcd_vapp_vm.Zabbix: Refreshing state... [id=urn:vcloud:vm:778f4a89-1c8d-45b9-9d94-0472a71c4d1f]
Import successful!
The resources that were imported are shown above. These resources are now in
your Terraform state and will henceforth be managed by Terraform.
现在我们可以查看新导入的资源:
进口资源
> terraform show
...
# vcd_vapp.Monitoring:
resource "vcd_vapp" "Monitoring" {
guest_properties = {}
href = "https://vcloud.mclouds.ru/api/vApp/vapp-fe5db285-a4af-47c4-93e8-55df92f006ec"
id = "urn:vcloud:vapp:fe5db285-a4af-47c4-93e8-55df92f006ec"
ip = "allocated"
metadata = {}
name = "Monitoring"
org = "mClouds"
status = 4
status_text = "POWERED_ON"
vdc = "mClouds"
}
…
# vcd_vapp_vm.Zabbix:
resource "vcd_vapp_vm" "Zabbix" {
computer_name = "Zabbix"
cpu_cores = 1
cpus = 2
expose_hardware_virtualization = false
guest_properties = {}
hardware_version = "vmx-14"
href = "https://vcloud.mclouds.ru/api/vApp/vm-778f4a89-1c8d-45b9-9d94-0472a71c4d1f"
id = "urn:vcloud:vm:778f4a89-1c8d-45b9-9d94-0472a71c4d1f"
internal_disk = [
{
bus_number = 0
bus_type = "paravirtual"
disk_id = "2000"
iops = 0
size_in_mb = 122880
storage_profile = "Gold Storage Policy"
thin_provisioned = true
unit_number = 0
},
]
memory = 8192
metadata = {}
name = "Zabbix"
org = "mClouds"
os_type = "centos8_64Guest"
storage_profile = "Gold Storage Policy"
vapp_name = "Monitoring"
vdc = "mClouds"
customization {
allow_local_admin_password = true
auto_generate_password = true
change_sid = false
enabled = false
force = false
join_domain = false
join_org_domain = false
must_change_password_on_first_login = false
number_of_auto_logons = 0
}
network {
adapter_type = "VMXNET3"
ip_allocation_mode = "DHCP"
is_primary = true
mac = "00:50:56:07:01:b1"
name = "MCLOUDS-LAN01"
type = "org"
}
}
现在我们已经完全准备好了 - 我们已经完成了最后一点(导入现有基础设施),并考虑了使用 Terraform 的所有要点。
事实证明,该工具非常方便,允许您将基础设施描述为代码,从一个云提供商的虚拟机开始到描述网络组件的资源。
同时,独立于环境使得可以使用本地、云资源,甚至管理平台。 如果没有受支持的平台并且您想添加新的平台,您可以编写自己的提供程序并使用它。
来源: habr.com