في هذه المقالة ، سنلقي نظرة على مكونات Terraform ، وسنطلق أيضًا البنية التحتية الخاصة بنا على مراحل
كل شيء بالتفصيل وعلى ثلاث مراحل:
1. Terraform - الوصف والفوائد والمكونات
Terraform هي أداة IaC (البنية التحتية كرمز) لبناء وإدارة البنية التحتية الافتراضية باستخدام التعليمات البرمجية.
عند العمل مع الأداة ، لاحظنا عدة مزايا:
-
سرعة انتشار المستأجرين الجدد (بيئات افتراضية مخصصة). عادةً ، كلما زاد عدد العملاء الجدد ، زاد عدد "النقرات" التي يحتاجها فريق الدعم الفني لنشر موارد جديدة. باستخدام Terraform ، يمكن للمستخدمين تغيير معلمات الأجهزة الافتراضية (على سبيل المثال ، إغلاق نظام التشغيل تلقائيًا وزيادة قسم القرص الظاهري) دون مشاركة الدعم الفني وإغلاق الجهاز نفسه.
-
التحقق الفوري من خطة التفعيل جديد تينانت. باستخدام وصف رمز البنية التحتية ، يمكننا على الفور التحقق مما سيتم إضافته وبأي ترتيب ، وكذلك في الحالة النهائية التي ستكون عليها هذه الآلة الافتراضية أو تلك الشبكة الافتراضية مع اتصالات بالأجهزة الافتراضية.
-
القدرة على وصف الأنظمة الأساسية السحابية الأكثر شيوعًا. يمكنك استخدام الأداة من Amazon و Google Cloud إلى الأنظمة الأساسية الخاصة القائمة على VMware vCloud Director التي تقدم حلول IaaS و SaaS و PaaS.
-
إدارة العديد من موفري السحابة وتوزيع البنية التحتية بينهما لتحسين التسامح مع الأخطاء ، باستخدام تكوين واحد لإنشاء موارد السحابة وتشخيصها وإدارتها.
-
استخدام مناسب لإنشاء منصات عرض لاختبار البرامج وتصحيح الأخطاء. يمكنك إنشاء مقاعد ونقلها لقسم الاختبار ، واختبار البرامج بالتوازي في بيئات مختلفة ، وتغيير الموارد وحذفها فورًا عن طريق إنشاء خطة بناء موارد واحدة فقط
"تراريوم" Terraform
تحدثنا بإيجاز عن مزايا الأداة ، والآن سنقوم بتحليلها إلى مكوناتها
الموفرون (الموفرون).
في Terraform ، يمكن تمثيل أي نوع من البنية التحتية تقريبًا كمورد. يتم توفير الاتصال بين الموارد والنظام الأساسي لواجهة برمجة التطبيقات من خلال وحدات الموفر ، والتي تتيح لك إنشاء موارد داخل نظام أساسي معين ، مثل Azure أو VMware vCloud Director.
داخل المشروع ، يمكنك التفاعل مع موفرين مختلفين على منصات مختلفة.
الموارد (وصف الموارد).
يسمح لك وصف الموارد بإدارة مكونات النظام الأساسي ، مثل الأجهزة أو الشبكات الافتراضية.
يمكنك إنشاء وصف مورد لموفر VMware vCloud Director بنفسك واستخدام هذا الوصف لإنشاء موارد لأي موفر استضافة يستخدم vCloud Director. ما عليك سوى تغيير معلمات المصادقة ومعلمات اتصال الشبكة لموفر الاستضافة المطلوب
الممولين.
يتيح هذا المكون إمكانية إجراء عمليات التثبيت الأولي لنظام التشغيل وصيانته بعد إنشاء الأجهزة الافتراضية. بمجرد إنشاء مورد جهاز ظاهري ، يمكنك استخدام الموفرين للتهيئة والاتصال عبر SSH ، وترقية نظام التشغيل ، وتنزيل برنامج نصي وتنفيذه.
إدخال وإخراج المتغيرات.
متغيرات الإدخال - متغيرات الإدخال لأي نوع من أنواع الكتل.
تسمح متغيرات الإخراج بحفظ القيم بعد إنشاء المورد ويمكن استخدامها كمتغيرات إدخال في الوحدات النمطية الأخرى ، مثل مجموعة Provisioners.
تنص على.
تخزن ملفات الدول معلومات حول تكوين موارد النظام الأساسي للموفر. عند إنشاء النظام الأساسي لأول مرة ، لا توجد معلومات حول الموارد ، وقبل أي عملية ، يقوم Terraform بتحديث الحالة بالبنية التحتية الحقيقية للموارد التي تم وصفها بالفعل.
الغرض الرئيسي من الدول هو حفظ مجموعة من الكائنات من الموارد التي تم إنشاؤها بالفعل لمقارنة تكوين الموارد والكائنات المضافة لتجنب إعادة الإنشاء والتغييرات على النظام الأساسي.
يتم تخزين معلومات الحالة محليًا في ملف terraform.tfstate افتراضيًا ، ولكن يمكنك استخدام التخزين البعيد للعمل الجماعي إذا لزم الأمر.
يمكنك أيضًا استيراد موارد النظام الأساسي الحالية إلى الحالة من أجل زيادة التفاعل مع الموارد الأخرى ، والتي تم إنشاؤها بدورها دون مساعدة Terraform.
2. إنشاء البنية التحتية
تم تفكيك المكونات ، والآن بمساعدة Terraform ، سننشئ تدريجياً بنية تحتية بثلاثة أجهزة افتراضية. الأول مع خادم وكيل nginx مثبت ، والثاني مع تخزين الملفات على أساس Nextcloud والثالث مع Bitrix CMS.
سنكتب التعليمات البرمجية وننفذها باستخدام مثالنا
أولاً ، لنقم بإنشاء دليل لمشروعنا الجديد ، والذي سيحتوي على ملفات تصف البنية التحتية.
mkdir project01
ثم نصف مكونات البنية التحتية. ينشئ Terraform روابط ويعالج الملفات بناءً على الوصف الموجود في الملفات. يمكن تسمية الملفات نفسها بناءً على الغرض من الكتل الموصوفة ، على سبيل المثال ، network.tf - تصف معلمات الشبكة للبنية التحتية.
لوصف مكونات بنيتنا التحتية ، قمنا بإنشاء الملفات التالية:
قائمة الملفات.
main.tf - وصف معلمات البيئة الافتراضية - الأجهزة الافتراضية والحاويات الافتراضية ؛
network.tf - وصف معلمات الشبكة الافتراضية و NAT وقواعد جدار الحماية ؛
المتغيرات. tf - قائمة المتغيرات التي نستخدمها ؛
vcd.tfvars - مشروع القيم المتغيرة لوحدة VMware vCloud Director.
لغة التكوين في Terraform تعريفية ولا يهم ترتيب الكتل ، باستثناء كتل المزود ، لأن في هذه الكتلة ، نصف الأوامر التي سيتم تنفيذها عند إعداد البنية التحتية وسيتم تنفيذها بالترتيب.
هيكل الكتلة.
<BLOCK TYPE> "<BLOCK LABEL>" "<BLOCK LABEL>" {
# Block body
<IDENTIFIER> = <EXPRESSION> # Argument
}
يتم وصف الكتل باستخدام لغة البرمجة الخاصة بها HCL (لغة تكوين HashiCorp) ، ومن الممكن وصف البنية التحتية باستخدام JSON. لمزيد من المعلومات حول بناء الجملة ، انظر
تكوين متغير البيئة ، المتغيرات. 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 لواجهة برمجة التطبيقات ،
-
vcd_org_edge_name - اسم جهاز التوجيه الظاهري ،
-
vcd_org_catalog - اسم الدليل مع قوالب الآلة الافتراضية ،
-
vcd_edge_external_ip - عنوان IP العام ،
-
vcd_edge_external_network - اسم الشبكة الخارجية ،
-
vcd_org_hdd_sp - اسم سياسة تخزين محرك الأقراص الثابتة ،
-
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، عبر يعتمد على. نستخدم هذا الخيار لأن بعض التبعيات قد يتم التعرف عليها ضمنيًا في التكوين.
بعد ذلك ، سننشئ قواعد تسمح بالوصول إلى المنافذ من الشبكة الخارجية ونحدد عنوان 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]
}
أضف قاعدة 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 على الفور بالشبكة الافتراضية ، نضيف أيضًا المعلمة تعتمد على:
قم بإنشاء حاوية
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 لإضافة جهاز افتراضي جديد إليه ،
-
catalogname / Templatename - اسم الكتالوج واسم قالب الجهاز الظاهري ،
-
storageprofile - سياسة التخزين الافتراضية.
معلمات كتلة الشبكة:
-
النوع - نوع الشبكة المتصلة ،
-
الاسم - أي شبكة افتراضية لتوصيل VM بها ،
-
أساسي - محول الشبكة الأساسي ،
-
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.
دعنا نفكر في كيفية تحديث نظام التشغيل وتشغيل برنامج تثبيت Bitrix CMS باستخدام كتلة الموفر.
لنقم بتثبيت حزم خدمة 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.
تبين أن الأداة مريحة للغاية وتسمح لك بوصف البنية الأساسية الخاصة بك على أنها رمز ، بدءًا من الأجهزة الافتراضية لموفر خدمة سحابية واحد إلى وصف موارد مكونات الشبكة.
في الوقت نفسه ، يجعل الاستقلال عن البيئة من الممكن العمل مع الموارد المحلية والسحابة ، وانتهاءً بإدارة النظام الأساسي. وإذا لم يكن هناك نظام أساسي مدعوم وترغب في إضافة نظام جديد ، فيمكنك كتابة المزود الخاص بك واستخدامه.
المصدر: www.habr.com