ในบทความนี้เราจะดูว่า Terraform ประกอบด้วยอะไรบ้าง และจะค่อยๆ เปิดตัวโครงสร้างพื้นฐานของเราเอง
เกี่ยวกับทุกสิ่งโดยละเอียดและในสามขั้นตอน:
1. Terraform - คำอธิบายข้อดีและส่วนประกอบ
Terraform เป็นเครื่องมือ IaC (Infrastructure-as-Code) สำหรับการสร้างและจัดการโครงสร้างพื้นฐานเสมือนโดยใช้โค้ด
เราสังเกตเห็นข้อดีหลายประการในการทำงานกับเครื่องมือนี้:
-
ความเร็วในการปรับใช้ของผู้เช่ารายใหม่ (สภาพแวดล้อมเสมือนที่กำหนดเอง) โดยทั่วไปแล้ว ยิ่งมีลูกค้าใหม่มากเท่าไร เจ้าหน้าที่ฝ่ายสนับสนุนด้านเทคนิคก็จะมี "คลิก" มากขึ้นเพื่อเผยแพร่แหล่งข้อมูลใหม่ ด้วย Terraform ผู้ใช้สามารถเปลี่ยนการตั้งค่าเครื่องเสมือนได้ (เช่น การปิดระบบปฏิบัติการโดยอัตโนมัติและเพิ่มพาร์ติชั่นดิสก์เสมือน) โดยไม่ต้องขอความช่วยเหลือด้านเทคนิคหรือปิดเครื่องเอง
-
การตรวจสอบแผนการเปิดใช้งานทันที เทนแนนท์ใหม่ เมื่อใช้คำอธิบายของรหัสโครงสร้างพื้นฐาน เราสามารถตรวจสอบได้ทันทีว่าอะไรจะถูกเพิ่มและในลำดับใด รวมถึงในสถานะสุดท้ายนี้หรือเครื่องเสมือนหรือเครือข่ายเสมือนที่มีการเชื่อมต่อกับเครื่องเสมือนจะเป็นอย่างไร
-
ความสามารถในการอธิบายแพลตฟอร์มคลาวด์ยอดนิยม คุณสามารถใช้เครื่องมือ จาก Amazon และ Google Cloud ไปจนถึงแพลตฟอร์มส่วนตัวที่ใช้ VMware vCloud Director นำเสนอบริการภายในโซลูชัน IaaS, SaaS และ PaaS
-
จัดการผู้ให้บริการคลาวด์หลายราย และกระจายโครงสร้างพื้นฐานระหว่างกันเพื่อปรับปรุงความทนทานต่อข้อผิดพลาด โดยใช้การกำหนดค่าเดียวเพื่อสร้าง วินิจฉัย และจัดการทรัพยากรบนคลาวด์
-
ใช้งานได้สะดวกสำหรับการสร้างแท่นสาธิต สำหรับการทดสอบและการดีบักซอฟต์แวร์ คุณสามารถสร้างและถ่ายโอนย่อมาจากแผนกทดสอบ ทดสอบซอฟต์แวร์ในสภาพแวดล้อมที่แตกต่างกันในแบบคู่ขนาน และเปลี่ยนแปลงและลบทรัพยากรได้ทันทีโดยการสร้างแผนการสร้างทรัพยากรเพียงแผนเดียว
"เทอร์ราเรียม" Terraform
เราได้พูดคุยกันสั้นๆ เกี่ยวกับข้อดีของเครื่องมือ ตอนนี้เรามาแบ่งมันออกเป็นส่วนประกอบต่างๆ กัน
ผู้ให้บริการ
ใน 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 Configuration Language) เป็นไปได้ที่จะอธิบายโครงสร้างพื้นฐานโดยใช้ JSON คุณสามารถเรียนรู้เพิ่มเติมเกี่ยวกับไวยากรณ์ได้
การกำหนดค่าตัวแปรสภาพแวดล้อม, Variables.tf และ vcd.tfvars
ขั้นแรก เรามาสร้างไฟล์สองไฟล์ที่อธิบายรายการตัวแปรที่ใช้ทั้งหมดและค่าของตัวแปรสำหรับโมดูล VMware vCloud Director ขั้นแรก เรามาสร้างไฟล์ Variable.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 - URL ของ API
-
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 - ที่อยู่ IP ของเครื่องเสมือนด้วย NGINX
-
vcd_edge_local_ip_bitrix - ที่อยู่ IP ของเครื่องเสมือนด้วย 1C: Bitrix
-
vcd_edge_local_ip_nextcloud - ที่อยู่ IP ของเครื่องเสมือนด้วย Nextcloud
ด้วยไฟล์ที่สองเราสร้างและระบุตัวแปรสำหรับโมดูล VMware vCloud Director ในไฟล์ vcd.tfvars: ให้เราจำไว้ว่าในตัวอย่างของเราเราใช้
เนื้อหาของไฟล์ 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 ส่วนตัวให้กับเครื่องเสมือนแต่ละเครื่อง และใช้ Destination 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"
}
}
มาสร้างกฎไฟร์วอลล์ที่อนุญาตให้เครื่องเสมือนเข้าถึงอินเทอร์เน็ต ภายในบล็อกนี้ ทรัพยากรเสมือนทั้งหมดในคลาวด์จะสามารถเข้าถึงอินเทอร์เน็ตได้:
เราอธิบายกฎสำหรับการเข้าถึง VM สู่อินเทอร์เน็ต
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, s помощью ขึ้นอยู่กับ. เราใช้ตัวเลือกนี้เนื่องจากการขึ้นต่อกันบางอย่างอาจรับรู้โดยปริยายในการกำหนดค่า
ต่อไป เราจะสร้างกฎที่อนุญาตการเข้าถึงพอร์ตจากเครือข่ายภายนอกและระบุที่อยู่ IP ของเราสำหรับการเชื่อมต่อผ่าน SSH ไปยังเซิร์ฟเวอร์ ผู้ใช้อินเทอร์เน็ตทุกคนสามารถเข้าถึงพอร์ต 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]
}
เราสร้างกฎ Source NAT สำหรับการเข้าถึงอินเทอร์เน็ตจากเครือข่ายท้องถิ่นบนคลาวด์:
เราอธิบายกฎ Source 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]
}
เพิ่มกฎ NAT สำหรับการแปลพอร์ตไปยังเซิร์ฟเวอร์ SSH ภายใต้ 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]
}
เพิ่มกฎ NAT สำหรับการแปลพอร์ตไปยังเซิร์ฟเวอร์ SSH ด้วย 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]
}
เพิ่มกฎ NAT สำหรับการแปลพอร์ตไปยังเซิร์ฟเวอร์ SSH ด้วย 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]
}
การกำหนดค่าสภาพแวดล้อมเสมือน Main.tf
ตามที่เราวางแผนไว้ในตอนต้นของบทความ เราจะสร้างเครื่องเสมือนสามเครื่อง พวกเขาจะจัดเตรียมโดยใช้ "การปรับแต่งแขก" เราจะตั้งค่าพารามิเตอร์เครือข่ายตามการตั้งค่าที่เราระบุ และรหัสผ่านผู้ใช้จะถูกสร้างขึ้นโดยอัตโนมัติ
เรามาอธิบาย vApp ที่จะวางเครื่องเสมือนและการกำหนดค่า
การกำหนดค่าเครื่องเสมือน
มาสร้างคอนเทนเนอร์ vApp กันดีกว่า เพื่อให้เราสามารถเชื่อมต่อ vApp และ VM กับเครือข่ายเสมือนได้ทันที เรายังเพิ่มพารามิเตอร์ depend_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:
-
ชื่อ — ชื่อของเครื่องเสมือน
-
vappname - ชื่อของ vApp ที่จะเพิ่ม VM ใหม่
-
Catalogname / templatename - ชื่อแค็ตตาล็อกและชื่อเทมเพลตเครื่องเสมือน
-
storageprofile - นโยบายการจัดเก็บข้อมูลเริ่มต้น
พารามิเตอร์บล็อกเครือข่าย:
-
ประเภท — ประเภทของเครือข่ายที่เชื่อมต่อ
-
ชื่อ — เครือข่ายเสมือนใดที่จะเชื่อมต่อ VM ด้วย
-
isprimary - อะแดปเตอร์เครือข่ายหลัก
-
ipallocation_mode - โหมดการจัดสรรที่อยู่ MANUAL / DHCP / POOL
-
ip — ที่อยู่ IP สำหรับเครื่องเสมือน เราจะระบุด้วยตนเอง
บล็อก override_template_disk:
-
sizeinmb - ขนาดดิสก์สำหรับบูตสำหรับเครื่องเสมือน
-
storage_profile - นโยบายการจัดเก็บสำหรับดิสก์
มาสร้าง VM ตัวที่สองพร้อมคำอธิบายของที่เก็บไฟล์ 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 - ขนาดดิสก์
-
busnumber / unitnumber - ตำแหน่งการเชื่อมต่อในอะแดปเตอร์
-
storage_profile - นโยบายการจัดเก็บสำหรับดิสก์
มาอธิบาย VM ล่าสุดบน 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” - เชื่อมต่อบล็อกการจัดเตรียมระยะไกล
-
ในบล็อกการเชื่อมต่อ เราอธิบายประเภทและพารามิเตอร์สำหรับการเชื่อมต่อ:
-
ประเภท — โปรโตคอล ในกรณีของเรา SSH;
-
ผู้ใช้ — ชื่อผู้ใช้;
-
รหัสผ่าน — รหัสผ่านผู้ใช้ ในกรณีของเรา เราชี้ไปที่พารามิเตอร์ vcdvappvm.nginx.customization[0].admin_password ซึ่งเก็บรหัสผ่านที่สร้างขึ้นสำหรับผู้ใช้ระบบ
-
โฮสต์ — ที่อยู่ IP ภายนอกสำหรับการเชื่อมต่อ
-
พอร์ต — พอร์ตสำหรับการเชื่อมต่อซึ่งระบุไว้ก่อนหน้านี้ในการตั้งค่า 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 ล่วงหน้า! หากคุณต้องการบทความโดยละเอียดเกี่ยวกับการติดตั้งและกำหนดค่า CMS 1C-Bitrix โดยใช้ bitrix-env.sh คุณสามารถทำได้
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 ด้วยโครงสร้างพื้นฐานที่มีอยู่
ง่ายมาก คุณสามารถนำเข้าเครื่องเสมือนปัจจุบันและคอนเทนเนอร์ 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 - ชื่อ 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 แล้ว
เครื่องมือนี้สะดวกมากและช่วยให้คุณสามารถอธิบายโครงสร้างพื้นฐานของคุณเป็นโค้ดได้ เริ่มตั้งแต่เครื่องเสมือนของผู้ให้บริการคลาวด์รายหนึ่งไปจนถึงการอธิบายทรัพยากรของส่วนประกอบเครือข่าย
ในขณะเดียวกัน ความเป็นอิสระจากสภาพแวดล้อมทำให้สามารถทำงานร่วมกับทรัพยากรระบบคลาวด์ในพื้นที่ และแม้แต่จัดการแพลตฟอร์มได้ และหากไม่มีแพลตฟอร์มที่รองรับและคุณต้องการเพิ่มแพลตฟอร์มใหม่ คุณสามารถเขียนผู้ให้บริการของคุณเองและใช้งานได้
ที่มา: will.com