如何使用 Terraform 管理云基础设施

如何使用 Terraform 管理云基础设施

在这篇文章中我们将了解 Terraform 的组成,并逐步推出我们自己的基础设施 借助 VMware 在云中 — 我们将准备三个虚拟机用于不同的目的:代理、文件存储和 CMS。

关于一切细节,分三个阶段:

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。

我们将使用我们的示例编写代码并执行它 VMware vCloud Director 上的云。 我们的用户会收到一个具有组织管理员权限的帐户。如果您在另一个 VMware 云中使用具有相同权限的帐户,则可以重现我们示例中的代码。 去!

首先,让我们为新项目创建一个目录,其中将放置描述基础设施的文件。

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 模块的变量: 让我们回想一下,在我们的示例中,我们使用 自己的云mClouds,如果您与其他提供商合作,请与他们检查这些值。 

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 管理云基础设施正在创建的 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 及其配置。

如何使用 Terraform 管理云基础设施虚拟机配置

让我们创建一个 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. 基础设施初始化

如何使用 Terraform 管理云基础设施初始化模块和插件

工作时,我们使用简单的“绅士套件”:一台装有 Windows 10 操作系统的笔记本电脑和官方网站上的分发套件 terraform.io。 让我们使用以下命令解压并初始化: terraform.exe init

在描述了计算和网络基础设施之后,我们开始计划测试我们的配置,在这里我们可以看到将创建什么以及它将如何相互连接。

  1. 执行命令 - terraform plan -var-file=vcd.tfvars.

  2. 我们得到结果 - Plan: 16 to add, 0 to change, 0 to destroy. 也就是说,按照这个计划,将会创建16个资源。

  3. 我们按照命令启动计划 - 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 — 虚拟数据中心的名称。

如何使用 Terraform 管理云基础设施导入 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

添加评论