Πώς να διαχειριστείτε την υποδομή Cloud με το Terraform

Πώς να διαχειριστείτε την υποδομή Cloud με το Terraform

Σε αυτό το άρθρο, θα δούμε τι αποτελείται από το Terraform και θα λανσάρουμε τη δική μας υποδομή σταδιακά στο cloud με VMware - ετοιμάστε τρία VM για διαφορετικούς σκοπούς: διακομιστή μεσολάβησης, αποθήκευση αρχείων και CMS.

Όλα αναλυτικά και σε τρία στάδια:

1. Terraform - περιγραφή, οφέλη και εξαρτήματα

Το Terraform είναι ένα εργαλείο IaC (Infrastructure-as-Code) για τη δημιουργία και τη διαχείριση εικονικής υποδομής με χρήση κώδικα.

Κατά την εργασία με το εργαλείο, σημειώσαμε πολλά πλεονεκτήματα:

  • Η ταχύτητα ανάπτυξης νέων ενοικιαστών (προσαρμοσμένα εικονικά περιβάλλοντα). Συνήθως, όσο περισσότεροι νέοι πελάτες, τόσο περισσότερα «κλικ» χρειάζονται για το προσωπικό τεχνικής υποστήριξης για τη δημοσίευση νέων πόρων. Με το Terraform, οι χρήστες μπορούν να αλλάξουν τις παραμέτρους των εικονικών μηχανών (για παράδειγμα, να τερματίσουν αυτόματα το λειτουργικό σύστημα και να αυξήσουν το διαμέρισμα εικονικού δίσκου) χωρίς τη συμμετοχή τεχνικής υποστήριξης και να τερματίσουν τη λειτουργία του ίδιου του μηχανήματος.

  • Άμεση επαλήθευση του σχεδίου ενεργοποίησης νέος ενοικιαστής. Χρησιμοποιώντας την περιγραφή του κωδικού υποδομής, μπορούμε αμέσως να ελέγξουμε τι θα προστεθεί και με ποια σειρά, καθώς και σε ποια τελική κατάσταση θα είναι αυτή ή εκείνη η εικονική μηχανή ή το εικονικό δίκτυο με συνδέσεις σε εικονικές μηχανές.

  • Δυνατότητα περιγραφής των πιο δημοφιλών πλατφορμών cloud. Μπορείτε να χρησιμοποιήσετε το εργαλείο από το Amazon και το Google Cloud έως τις ιδιωτικές πλατφόρμες που βασίζονται στο VMware vCloud Director που προσφέρουν λύσεις IaaS, SaaS και PaaS.

  • Διαχειριστείτε πολλούς παρόχους cloud και να διανείμουν την υποδομή μεταξύ τους για να βελτιώσουν την ανοχή σφαλμάτων, χρησιμοποιώντας μια ενιαία διαμόρφωση για τη δημιουργία, τη διάγνωση και τη διαχείριση πόρων cloud.

  • Βολική χρήση για τη δημιουργία περιπτέρων επίδειξης για τη δοκιμή και τον εντοπισμό σφαλμάτων λογισμικού. Μπορείτε να δημιουργήσετε και να μεταφέρετε πάγκους για το τμήμα δοκιμών, να δοκιμάσετε λογισμικό παράλληλα σε διαφορετικά περιβάλλοντα και να αλλάξετε και να διαγράψετε άμεσα πόρους δημιουργώντας μόνο ένα σχέδιο δημιουργίας πόρων

"Terrarium" Terraform

Μιλήσαμε εν συντομία για τα πλεονεκτήματα του εργαλείου, τώρα θα το αναλύσουμε στα συστατικά του

Πάροχοι (πάροχοι). 

Στο Terraform, σχεδόν κάθε τύπος υποδομής μπορεί να αναπαρασταθεί ως πόρος. Η σύνδεση μεταξύ των πόρων και της πλατφόρμας API παρέχεται από λειτουργικές μονάδες παρόχου, οι οποίες σας επιτρέπουν να δημιουργήσετε πόρους σε μια συγκεκριμένη πλατφόρμα, όπως το Azure ή το VMware vCloud Director.

Μέσα σε ένα έργο, μπορείτε να αλληλεπιδράσετε με διαφορετικούς παρόχους σε διαφορετικές πλατφόρμες.

Πόροι (περιγραφή πόρων).

Η περιγραφή των πόρων σάς επιτρέπει να διαχειρίζεστε στοιχεία πλατφόρμας, όπως εικονικές μηχανές ή δίκτυα. 

Μπορείτε να δημιουργήσετε μόνοι σας μια περιγραφή πόρων για έναν πάροχο VMware vCloud Director και να χρησιμοποιήσετε αυτήν την περιγραφή για να δημιουργήσετε πόρους για οποιονδήποτε πάροχο φιλοξενίας που χρησιμοποιεί vCloud Director. Χρειάζεται μόνο να αλλάξετε τις παραμέτρους ελέγχου ταυτότητας και τις παραμέτρους σύνδεσης δικτύου στον απαιτούμενο πάροχο φιλοξενίας

Προμηθευτές.

Αυτό το στοιχείο καθιστά δυνατή την εκτέλεση εργασιών για την αρχική εγκατάσταση και συντήρηση του λειτουργικού συστήματος μετά τη δημιουργία εικονικών μηχανών. Αφού δημιουργήσετε έναν πόρο εικονικής μηχανής, μπορείτε να χρησιμοποιήσετε προμηθευτές για να ρυθμίσετε και να συνδεθείτε μέσω SSH, να αναβαθμίσετε το λειτουργικό σύστημα και να κάνετε λήψη και εκτέλεση ενός σεναρίου. 

Μεταβλητές Είσοδος και Έξοδος.

Μεταβλητές εισόδου — μεταβλητές εισόδου για οποιουσδήποτε τύπους μπλοκ. 

Οι μεταβλητές εξόδου επιτρέπουν την αποθήκευση τιμών μετά τη δημιουργία πόρων και μπορούν να χρησιμοποιηθούν ως μεταβλητές εισόδου σε άλλες μονάδες, όπως το μπλοκ Provisioners.

πολιτείες.

Τα αρχεία καταστάσεων αποθηκεύουν πληροφορίες σχετικά με τη διαμόρφωση πόρων πλατφόρμας του παρόχου. Όταν δημιουργείται για πρώτη φορά η πλατφόρμα, δεν υπάρχουν πληροφορίες για τους πόρους και πριν από οποιαδήποτε λειτουργία, η Terraform ενημερώνει την κατάσταση με την πραγματική υποδομή των ήδη περιγραφόμενων πόρων.

Ο κύριος σκοπός των καταστάσεων είναι να αποθηκεύσουν μια δέσμη αντικειμένων ήδη δημιουργημένων πόρων για σύγκριση της διαμόρφωσης προστιθέμενων πόρων και αντικειμένων, προκειμένου να αποφευχθεί η επαναδημιουργία και οι αλλαγές στην πλατφόρμα.

Οι πληροφορίες κατάστασης αποθηκεύονται τοπικά στο αρχείο terraform.tfstate από προεπιλογή, αλλά μπορείτε να χρησιμοποιήσετε απομακρυσμένο χώρο αποθήκευσης για ομαδική εργασία, εάν χρειάζεται.

Μπορείτε επίσης να εισαγάγετε τους τρέχοντες πόρους της πλατφόρμας στην κατάσταση προκειμένου να αλληλεπιδράσετε περαιτέρω με άλλους πόρους, οι οποίοι με τη σειρά τους δημιουργήθηκαν χωρίς τη βοήθεια του Terraform.  

2. Δημιουργία υποδομών

Τα εξαρτήματα έχουν αποσυναρμολογηθεί, τώρα με τη βοήθεια της Terraform θα δημιουργήσουμε σταδιακά μια υποδομή με τρεις εικονικές μηχανές. Το πρώτο με εγκατεστημένο διακομιστή μεσολάβησης nginx, το δεύτερο με αποθήκευση αρχείων που βασίζεται στο Nextcloud και το τρίτο με Bitrix CMS.

Θα γράψουμε κώδικα και θα τον εκτελέσουμε χρησιμοποιώντας το παράδειγμα μας σύννεφα στο 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. Αρχικά, ας δημιουργήσουμε το αρχείο 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 - Όνομα πολιτικής αποθήκευσης σκληρού δίσκου,

  • 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: Θυμηθείτε ότι στο παράδειγμά μας χρησιμοποιούμε δικά τους cloud 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 μας.

Πώς να διαχειριστείτε την υποδομή Cloud με το 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"

  }

}

Ας δημιουργήσουμε κανόνες για το τείχος προστασίας, το οποίο σας επιτρέπει να παρέχετε σε εικονικές μηχανές πρόσβαση στο Διαδίκτυο. Μέσα σε αυτό το μπλοκ, όλοι οι εικονικοί πόροι στο cloud θα έχουν πρόσβαση στο Διαδίκτυο:

Περιγράφουμε τους κανόνες για την πρόσβαση 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 του διακομιστή web και ένας χρήστης με διεύθυνση 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 πηγής για πρόσβαση στο Διαδίκτυο από το τοπικό δίκτυο cloud:

Περιγράψτε τους κανόνες 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 στο οποίο θα βρίσκονται οι εικονικές μηχανές και η διαμόρφωσή τους.

Πώς να διαχειριστείτε την υποδομή Cloud με το TerraformΔιαμόρφωση εικονικής μηχανής

Ας δημιουργήσουμε ένα κοντέινερ vApp. Για να μπορούμε να συνδέσουμε αμέσως το vApp και το VM στο εικονικό δίκτυο, προσθέτουμε επίσης την παράμετροdependent_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,

  • όνομα καταλόγου / όνομα προτύπου - όνομα καταλόγου και όνομα προτύπου εικονικής μηχανής,

  • αποθηκευτικό προφίλ - προεπιλεγμένη πολιτική αποθήκευσης.

Παράμετροι μπλοκ δικτύου:

  • τύπος — τύπος συνδεδεμένου δικτύου,

  • όνομα - σε ποιο εικονικό δίκτυο να συνδέσετε το 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 - μέγεθος δίσκου

  • αριθμός bus / αριθμός μονάδας - σημείο σύνδεσης στον προσαρμογέα

  • 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 χρησιμοποιώντας το μπλοκ παρόχου.

Ας εγκαταστήσουμε πρώτα τα Service Pack του 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. Αρχικοποίηση υποδομής

Πώς να διαχειριστείτε την υποδομή Cloud με το 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 είναι το όνομα του εικονικού κέντρου δεδομένων.

Πώς να διαχειριστείτε την υποδομή Cloud με το 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. 

Το εργαλείο αποδείχθηκε πολύ βολικό και σας επιτρέπει να περιγράψετε την υποδομή σας ως κώδικα, από εικονικές μηχανές ενός παρόχου cloud έως την περιγραφή των πόρων των στοιχείων δικτύου.

Ταυτόχρονα, η ανεξαρτησία από το περιβάλλον καθιστά δυνατή την εργασία με τοπικούς πόρους, cloud και, τελειώνοντας με τη διαχείριση πλατφόρμας. Και αν δεν υπάρχει υποστηριζόμενη πλατφόρμα και θέλετε να προσθέσετε μια νέα, μπορείτε να γράψετε τον δικό σας πάροχο και να τον χρησιμοποιήσετε.

Πηγή: www.habr.com

Προσθέστε ένα σχόλιο