วิธีจัดการโครงสร้างพื้นฐานคลาวด์ด้วย Terraform

วิธีจัดการโครงสร้างพื้นฐานคลาวด์ด้วย Terraform

ในบทความนี้เราจะดูว่า Terraform ประกอบด้วยอะไรบ้าง และจะค่อยๆ เปิดตัวโครงสร้างพื้นฐานของเราเอง ในระบบคลาวด์ด้วย VMware — เราจะเตรียม VM สามเครื่องเพื่อวัตถุประสงค์ที่แตกต่างกัน: พร็อกซี พื้นที่จัดเก็บไฟล์ และ CMS

เกี่ยวกับทุกสิ่งโดยละเอียดและในสามขั้นตอน:

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

เราจะเขียนโค้ดและดำเนินการโดยใช้ตัวอย่างของเรา บนคลาวด์บน 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 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: ให้เราจำไว้ว่าในตัวอย่างของเราเราใช้ 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 ส่วนตัวให้กับเครื่องเสมือนแต่ละเครื่อง และใช้ Destination 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"

  }

}

มาสร้างกฎไฟร์วอลล์ที่อนุญาตให้เครื่องเสมือนเข้าถึงอินเทอร์เน็ต ภายในบล็อกนี้ ทรัพยากรเสมือนทั้งหมดในคลาวด์จะสามารถเข้าถึงอินเทอร์เน็ตได้:

เราอธิบายกฎสำหรับการเข้าถึง 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 ที่จะวางเครื่องเสมือนและการกำหนดค่า

วิธีจัดการโครงสร้างพื้นฐานคลาวด์ด้วย Terraformการกำหนดค่าเครื่องเสมือน

มาสร้างคอนเทนเนอร์ 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. การเริ่มต้นโครงสร้างพื้นฐาน

วิธีจัดการโครงสร้างพื้นฐานคลาวด์ด้วย 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 ด้วยโครงสร้างพื้นฐานที่มีอยู่

ง่ายมาก คุณสามารถนำเข้าเครื่องเสมือนปัจจุบันและคอนเทนเนอร์ 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 - ชื่อ 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

เพิ่มความคิดเห็น