En aquest article veurem en què consisteix Terraform, i també posarem en marxa la nostra pròpia infraestructura
Sobre tot en detall i en tres etapes:
1. Terraform - descripció, avantatges i components
Terraform és una eina IaC (Infrastructure-as-Code) per construir i gestionar infraestructures virtuals mitjançant codi.
Hem observat diversos avantatges en treballar amb l'eina:
-
Velocitat de desplegament de nous llogaters (entorns virtuals personalitzats). Normalment, com més clients nous hi hagi, més "clics" ha de fer el personal d'assistència tècnica per publicar nous recursos. Amb Terraform, els usuaris poden canviar la configuració de la màquina virtual (per exemple, tancar automàticament el sistema operatiu i augmentar la partició del disc virtual) sense necessitat d'assistència tècnica ni apagar la pròpia màquina.
-
Verificació instantània del pla d'activació nou Tennant. Mitjançant la descripció del codi d'infraestructura, podem comprovar immediatament què s'afegirà i en quin ordre, així com en quin estat final estarà aquesta o aquella màquina virtual o xarxa virtual amb connexions a màquines virtuals.
-
Capacitat per descriure les plataformes al núvol més populars. Podeu utilitzar l'eina des d'Amazon i Google Cloud, fins a plataformes privades basades en VMware vCloud Director, oferint serveis dins de solucions IaaS, SaaS i PaaS.
-
Gestioneu diversos proveïdors de núvol i distribuir la infraestructura entre ells per millorar la tolerància a fallades, utilitzant una única configuració per crear, diagnosticar i gestionar els recursos del núvol.
-
Ús convenient per crear estands de demostració per a proves i depuració de programari. Podeu crear i transferir estands per al departament de proves, provar programari en diferents entorns en paral·lel i canviar i suprimir recursos a l'instant creant un sol pla de creació de recursos.
Terraform "Terrari".
Hem parlat breument dels avantatges de l'eina, ara anem a desglossar-la en els seus components
Proveïdors.
A Terraform, gairebé qualsevol tipus d'infraestructura es pot representar com a recurs. La connexió entre els recursos i la plataforma API la proporcionen mòduls de proveïdors, que us permeten crear recursos dins d'una plataforma específica, per exemple, Azure o VMware vCloud Director.
Com a part del projecte, podeu interactuar amb diferents proveïdors en diferents plataformes.
Recursos (descripció del recurs).
La descripció de recursos us permet gestionar components de la plataforma, com ara màquines virtuals o xarxes.
Podeu crear vosaltres mateixos una descripció de recursos per al proveïdor de VMware vCloud Director i utilitzar aquesta descripció per crear recursos amb qualsevol proveïdor d'allotjament que utilitzi vCloud Director. Només cal que canvieu els paràmetres d'autenticació i els paràmetres de connexió de xarxa al proveïdor d'allotjament necessari
Proveïdors.
Aquest component permet realitzar operacions per a la instal·lació inicial i manteniment del sistema operatiu després de crear màquines virtuals. Un cop hàgiu creat un recurs de màquina virtual, podeu utilitzar proveïdors per configurar i connectar-vos mitjançant SSH, actualitzar el sistema operatiu i descarregar i executar un script.
Variables d'entrada i de sortida.
Variables d'entrada: variables d'entrada per a qualsevol tipus de bloc.
Les variables de sortida permeten desar valors després de crear recursos i es poden utilitzar com a variables d'entrada en altres mòduls, per exemple al bloc Provisioners.
Estats.
Els fitxers d'estats emmagatzemen informació sobre la configuració dels recursos de la plataforma del proveïdor. Quan es crea la plataforma per primera vegada, no hi ha informació sobre els recursos i abans de qualsevol operació, Terraform actualitza l'estat amb la infraestructura real dels recursos ja descrits.
L'objectiu principal dels estats és desar un munt d'objectes de recursos ja creats per comparar la configuració dels recursos i objectes afegits per evitar la creació i canvis repetits a la plataforma.
Per defecte, la informació de l'estat s'emmagatzema al fitxer terraform.tfstate local, però si cal, és possible utilitzar l'emmagatzematge remot per treballar en equip.
També podeu importar els recursos actuals de la plataforma a l'estat per interactuar encara més amb altres recursos que al seu torn es van crear sense l'ajuda de Terraform.
2. Creació d'infraestructures
Els components s'han resolt, ara amb Terraform anirem creant una infraestructura amb tres màquines virtuals. El primer amb el servidor intermediari nginx instal·lat, el segon amb emmagatzematge de fitxers basat en Nextcloud i el tercer amb CMS Bitrix.
Escriurem codi i l'executarem amb el nostre exemple
Primer, creem un directori per al nostre nou projecte en el qual es col·locaran els fitxers que descriuen la infraestructura.
mkdir project01
A continuació, descriurem els components de la infraestructura. Terraform crea relacions i processa fitxers en funció de la descripció dels fitxers. Els mateixos fitxers es poden anomenar en funció del propòsit dels blocs que es descriuen, per exemple, network.tf: descriu els paràmetres de xarxa per a la infraestructura.
Per descriure els components de la nostra infraestructura, hem creat els fitxers següents:
Llista de fitxers.
main.tf - descripció dels paràmetres per a l'entorn virtual - màquines virtuals, contenidors virtuals;
network.tf - descripció dels paràmetres de la xarxa virtual i les regles de NAT i tallafoc;
variables.tf - llista de variables que fem servir;
vcd.tfvars: valors de les variables del projecte per al mòdul VMware vCloud Director.
El llenguatge de configuració a Terraform és declaratiu i l'ordre dels blocs no importa, excepte els blocs de subministrament, perquè en aquest bloc es descriuen les ordres a executar en preparar la infraestructura i s'executaran en ordre.
Estructura de blocs.
<BLOCK TYPE> "<BLOCK LABEL>" "<BLOCK LABEL>" {
# Block body
<IDENTIFIER> = <EXPRESSION> # Argument
}
Per descriure blocs, s'utilitza el seu propi llenguatge de programació HCL (HashiCorp Configuration Language); és possible descriure la infraestructura mitjançant JSON. Podeu obtenir més informació sobre la sintaxi
Configuració de variables d'entorn, variables.tf i vcd.tfvars
Primer, creem dos fitxers que descriguin la llista de totes les variables utilitzades i els seus valors per al mòdul VMware vCloud Director. Primer, creem el fitxer variables.tf.
Contingut del fitxer 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" {}
Valors variables que rebem del proveïdor.
-
vcd_org_user: nom d'usuari amb drets d'administrador de l'organització,
-
vcd_org_password — contrasenya d'usuari,
-
vcd_org — nom de l'organització,
-
vcd_org_vdc — nom del centre de dades virtual,
-
vcd_org_url - URL de l'API,
-
vcd_org_edge_name — nom de l'encaminador virtual,
-
vcd_org_catalog — nom del directori amb plantilles de màquines virtuals,
-
vcd_edge_external_ip — adreça IP pública,
-
vcd_edge_external_network — nom de la xarxa externa,
-
vcd_org_hdd_sp — nom de la política d'emmagatzematge del disc dur,
-
vcd_org_ssd_sp — nom de la política d'emmagatzematge SSD.
I introduïu les nostres variables:
-
vcd_edge_local_ip_nginx — adreça IP de la màquina virtual amb NGINX,
-
vcd_edge_local_ip_bitrix: adreça IP de la màquina virtual amb 1C: Bitrix,
-
vcd_edge_local_ip_nextcloud — Adreça IP de la màquina virtual amb Nextcloud.
Amb el segon fitxer creem i especifiquem variables per al mòdul VMware vCloud Director al fitxer vcd.tfvars: Recordem que en el nostre exemple fem servir
Contingut del fitxer 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"
Configuració de la xarxa, network.tf.
Les variables d'entorn estan configurades, ara configurarem l'esquema de connexió de la màquina virtual: assignarem una adreça IP privada a cada màquina virtual i utilitzarem Destination NAT per "reenviar" els ports a la xarxa externa. Per limitar l'accés als ports de gestió, establirem l'accés només per a la nostra adreça IP.
Diagrama de xarxa per a la plataforma Terraform que s'està creant
Creem una xarxa organitzativa virtual amb el nom net_lan01, la passarel·la per defecte: 192.168.110.254, i també amb l'espai d'adreces: 192.168.110.0/24.
Descrivim una xarxa virtual.
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"
}
}
Creem regles de tallafocs que permetin a les màquines virtuals accedir a Internet. Dins d'aquest bloc, tots els recursos virtuals del núvol tindran accés a Internet:
Descriurem les regles per a l'accés de VM a 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]
}
Una vegada establerta la dependència que després de processar el bloc vcdnetworkrouted.net, procedim a configurar el bloc vcdnsxvfirewallrule, mitjançant l'ús de depén de. Utilitzem aquesta opció perquè algunes dependències es poden reconèixer implícitament a la configuració.
A continuació, crearem regles que permetin l'accés als ports des de la xarxa externa i indicarem la nostra adreça IP per connectar-nos mitjançant SSH als servidors. Qualsevol usuari d'Internet té accés als ports 80 i 443 del servidor web, i un usuari amb una adreça IP de 90.1.15.1 té accés als ports SSH dels servidors virtuals.
Permet l'accés als ports des de la xarxa externa.
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]
}
Creem regles de NAT font per accedir a Internet des d'una xarxa local al núvol:
Descrivim les regles de la font 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]
}
I per completar la configuració del bloc de xarxa, afegim regles Destination NAT per accedir als serveis des de la xarxa externa:
Afegint regles de NAT de destinació.
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]
}
Afegiu una regla NAT per a la traducció de ports al servidor SSH a Nginx.
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]
}
Afegiu una regla NAT per a la traducció de ports al servidor SSH amb 1C-Bitrix.
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]
}
Afegiu una regla NAT per a la traducció de ports al servidor SSH amb Nextcloud.
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]
}
Configuració de l'entorn virtual Main.tf
Tal com teníem previst al principi de l'article, crearem tres màquines virtuals. Es prepararan mitjançant "Personalització de convidats". Establirem els paràmetres de xarxa segons els paràmetres que hem especificat i la contrasenya d'usuari es generarà automàticament.
Anem a descriure la vApp en què s'ubicaran les màquines virtuals i la seva configuració.
Configuració de la màquina virtual
Creem un contenidor de vApp. Perquè puguem connectar immediatament la vApp i la VM a la xarxa virtual, també afegim el paràmetre depends_on:
Crea un contenidor
resource "vcd_vapp" "vapp" {
name = "web"
power_on = "true"
depends_on = [vcd_network_routed.net]
}
Creem una màquina virtual amb una descripció
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
}
}
Paràmetres principals a la descripció de la VM:
-
nom — nom de la màquina virtual,
-
vappname - nom de la vApp a la qual afegir una nova VM,
-
nom de catàleg / nom de plantilla: nom de catàleg i nom de plantilla de màquina virtual,
-
storageprofile - política d'emmagatzematge predeterminada.
Paràmetres del bloc de xarxa:
-
tipus: tipus de xarxa connectada,
-
nom: a quina xarxa virtual connectar la VM,
-
isprimary - adaptador de xarxa principal,
-
ipallocation_mode — Mode d'assignació d'adreces MANUAL / DHCP / POOL,
-
ip — Adreça IP de la màquina virtual, l'especificarem manualment.
bloc override_template_disk:
-
sizeinmb — mida del disc d'arrencada per a la màquina virtual
-
storage_profile — política d'emmagatzematge del disc
Creem una segona màquina virtual amb una descripció de l'emmagatzematge de fitxers 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 ]
}
A la secció vcdvminternal_disk descriurem un nou disc virtual connectat a la màquina virtual.
Explicacions per al bloc vcdvmininternaldisk:
-
bustype - tipus de controlador de disc
-
sizeinmb — mida del disc
-
busnumber / unitnumber - ubicació de connexió a l'adaptador
-
storage_profile — política d'emmagatzematge del disc
Anem a descriure l'última màquina virtual de 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
}
}
Actualització del sistema operatiu i instal·lació de scripts addicionals
Es prepara la xarxa, es descriuen les màquines virtuals. Abans d'importar la nostra infraestructura, podem realitzar l'aprovisionament inicial amb antelació mitjançant blocs de subministrament i sense utilitzar Ansible.
Vegem com actualitzar el sistema operatiu i executar l'script d'instal·lació de CMS Bitrix mitjançant el bloc de subministrament.
Primer, instal·lem els paquets d'actualització de 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" ]
}
}
}
Designació dels components:
-
provisioner "remote-exec": connecteu el bloc de subministrament remot
-
Al bloc de connexió es descriu el tipus i els paràmetres de la connexió:
-
tipus — protocol, en el nostre cas SSH;
-
usuari — nom d'usuari;
-
password — contrasenya d'usuari. En el nostre cas, apuntem al paràmetre vcdvappvm.nginx.customization[0].admin_password, que emmagatzema la contrasenya generada per a l'usuari del sistema.
-
host — adreça IP externa per a la connexió;
-
port — port per a la connexió, que s'havia especificat anteriorment a la configuració de DNAT;
-
en línia: llista la llista d'ordres que s'introduiran. Les ordres s'introduiran en l'ordre indicat en aquesta secció.
Com a exemple, executem, a més, l'script d'instal·lació 1C-Bitrix. La sortida del resultat de l'execució de l'script estarà disponible mentre s'executa el pla. Per instal·lar l'script, primer descrivim el bloc:
Anem a descriure la instal·lació de 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"
]
}
I de seguida descriurem l'actualització de Bitrix.
Un exemple d'aprovisionament 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"
]
}
}
Important! És possible que l'script no funcioni si no desactiveu SELinux per endavant! Si necessiteu un article detallat sobre la instal·lació i la configuració de CMS 1C-Bitrix mitjançant bitrix-env.sh, oo podeu
3. Inicialització d'infraestructura
Inicialització de mòduls i complements
Per treballar, utilitzem un senzill "kit de gentleman": un ordinador portàtil amb sistema operatiu Windows 10 i un kit de distribució del lloc web oficial terraform.exe init
Després de descriure la infraestructura informàtica i de xarxa, iniciem la planificació per provar la nostra configuració, on podem veure què es crearà i com es connectarà entre ells.
-
Executeu l'ordre
- terraform plan -var-file=vcd.tfvars
. -
Obtenim el resultat
- Plan: 16 to add, 0 to change, 0 to destroy.
És a dir, segons aquest pla, es crearan 16 recursos. -
Llencem el pla al comandament
- terraform.exe apply -var-file=vcd.tfvars
.
Es crearan màquines virtuals i, a continuació, els paquets que hem enumerat s'executaran dins de la secció de subministrament: el sistema operatiu s'actualitzarà i s'instal·larà CMS Bitrix.
Recepció de dades de connexió
Després d'executar el pla, volem rebre dades en forma de text per connectar-nos als servidors, per això formarem la secció de sortida de la següent manera:
output "nginxpassword" {
value = vcdvappvm.nginx.customization[0].adminpassword
}
I la sortida següent ens indica la contrasenya per a la màquina virtual creada:
Outputs: nginx_password = F#4u8!!N
Com a resultat, tenim accés a màquines virtuals amb un sistema operatiu actualitzat i paquets preinstal·lats per al nostre treball posterior. Tot a punt!
Però, què passa si ja tens una infraestructura existent?
3.1. Treballant Terraform amb la infraestructura existent
És senzill, podeu importar màquines virtuals actuals i els seus contenidors vApp mitjançant l'ordre d'importació.
Descrivim el recurs vAPP i la màquina virtual.
resource "vcd_vapp" "Monitoring" {
name = "Monitoring"
org = "mClouds"
vdc = "mClouds"
}
resource "vcd_vapp_vm" "Zabbix" {
name = "Zabbix"
org = "mClouds"
vdc = "mClouds"
vapp = "Monitoring"
}
El següent pas és importar les propietats dels recursos de vApp en el format vcdvapp.<vApp> <org>.<orgvdc>.<vApp>
on:
-
vApp: nom de vApp;
-
org — nom de l'organització;
-
org_vdc — nom del centre de dades virtual.
Importació de propietats de recursos vAPP
Importem les propietats dels recursos de VM en el format: vcdvappvm.<VM> <org>.<orgvdc>.<vApp>.<VM>
, en quin:
-
VM: nom de VM;
-
vApp: nom de vApp;
-
org — nom de l'organització;
-
orgvdc és el nom del centre de dades virtual.
La importació ha estat correcta
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.
Ara podem mirar el nou recurs importat:
Recurs importat
> 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"
}
}
Ara definitivament estem preparats: hem acabat amb l'últim punt (importar a la infraestructura existent) i hem considerat tots els punts principals de treballar amb Terraform.
L'eina va resultar molt convenient i us permet descriure la vostra infraestructura com a codi, començant des de les màquines virtuals d'un proveïdor de núvol fins a descriure els recursos dels components de la xarxa.
Al mateix temps, la independència de l'entorn permet treballar amb recursos locals, al núvol, i fins i tot gestionar la plataforma. I si no hi ha cap plataforma compatible i en voleu afegir una de nova, podeu escriure el vostre propi proveïdor i utilitzar-lo.
Font: www.habr.com