نحوه مدیریت زیرساخت های ابری با Terraform

نحوه مدیریت زیرساخت های ابری با Terraform

در این مقاله ما به آنچه Terraform تشکیل شده است نگاه خواهیم کرد و همچنین به تدریج زیرساخت های خود را راه اندازی خواهیم کرد در فضای ابری با VMware - ما سه VM را برای اهداف مختلف آماده خواهیم کرد: پروکسی، ذخیره سازی فایل و CMS.

درباره همه چیز با جزئیات و در سه مرحله:

1. Terraform - توضیحات، مزایا و اجزای سازنده

Terraform یک ابزار IaC (Infrastructure-as-Code) برای ساخت و مدیریت زیرساخت مجازی با استفاده از کد است.

ما چندین مزیت را در کار با ابزار ذکر کردیم:

  • سرعت استقرار مستاجران جدید (محیط های مجازی سفارشی). به طور معمول، هر چه مشتریان جدید بیشتر باشد، کارکنان پشتیبانی فنی باید «کلیک‌های» بیشتری برای انتشار منابع جدید انجام دهند. با Terraform، کاربران می توانند تنظیمات ماشین مجازی (به عنوان مثال، خاموش کردن خودکار سیستم عامل و افزایش پارتیشن دیسک مجازی) را بدون نیاز به پشتیبانی فنی یا خاموش کردن خود ماشین تغییر دهند.

  • تأیید فوری طرح فعال سازی مستاجر جدید با استفاده از توضیحات کد زیرساخت می توانیم بلافاصله بررسی کنیم که چه چیزی و به چه ترتیبی اضافه می شود و همچنین این یا آن ماشین مجازی یا شبکه مجازی با اتصال به ماشین های مجازی در چه وضعیت نهایی خواهد بود.

  • قابلیت توصیف محبوب ترین پلتفرم های ابری. می توانید از ابزار استفاده کنید از آمازون و گوگل کلود گرفته تا پلتفرم های خصوصی مبتنی بر 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. کاربران ما یک حساب کاربری با حقوق Administrator سازمان دریافت می‌کنند. اگر از حسابی با حقوق مشابه در ابر 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 توضیح دهد. ابتدا اجازه دهید فایل variables.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 برای "Forward" پورت‌ها به شبکه خارجی استفاده می‌کنیم. برای محدود کردن دسترسی به پورت های مدیریتی، دسترسی را فقط برای آدرس 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 می کنیم.، با استفاده از بستگی دارد به. ما از این گزینه استفاده می کنیم زیرا ممکن است برخی از وابستگی ها به طور ضمنی در پیکربندی شناسایی شوند.

در مرحله بعد، قوانینی ایجاد می کنیم که اجازه دسترسی به پورت ها از شبکه خارجی را می دهد و آدرس 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]

}

ما قوانین منبع NAT را برای دسترسی به اینترنت از یک شبکه محلی ابری ایجاد می کنیم:

قوانین منبع 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]

}

و برای تکمیل پیکربندی بلوک شبکه، قوانین Destination 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]

}

با 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 را به شبکه مجازی متصل کنیم، پارامتر بستگی_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 جدید به آن اضافه می شود،

  • نام کاتالوگ / نام قالب - نام کاتالوگ و نام قالب ماشین مجازی،

  • Storageprofile - سیاست ذخیره سازی پیش فرض.

پارامترهای بلوک شبکه:

  • نوع - نوع شبکه متصل،

  • نام - به کدام شبکه مجازی VM متصل شود،

  • isprimary - آداپتور شبکه اولیه،

  • ipallocation_mode — حالت تخصیص آدرس دستی / 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 - اندازه دیسک

  • 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 مشخص شده بود.

  • inline - لیستی از دستوراتی که وارد می شوند را فهرست کنید. دستورات به ترتیبی که در این قسمت نشان داده شده وارد می شوند.

به عنوان مثال، اجازه دهید اسکریپت نصب 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راه اندازی ماژول ها و پلاگین ها

برای کار، ما از یک "کیت جنتلمن" ساده استفاده می کنیم: یک لپ تاپ با سیستم عامل ویندوز 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 آنها را با استفاده از دستور import وارد کنید.

بیایید منبع 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 را در نظر گرفته ایم. 

این ابزار بسیار راحت بود و به شما امکان می دهد زیرساخت خود را به عنوان کد توصیف کنید، از ماشین های مجازی یک ارائه دهنده ابر تا توصیف منابع اجزای شبکه.

در عین حال، استقلال از محیط، کار با منابع محلی، ابری و حتی مدیریت پلتفرم را ممکن می کند. و اگر پلتفرم پشتیبانی نشده ای وجود ندارد و می خواهید پلتفرم جدیدی اضافه کنید، می توانید ارائه دهنده خود را بنویسید و از آن استفاده کنید.

منبع: www.habr.com

اضافه کردن نظر