Σε αυτό το άρθρο, θα δούμε τι αποτελείται από το Terraform και θα λανσάρουμε τη δική μας υποδομή σταδιακά
Όλα αναλυτικά και σε τρία στάδια:
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.
Θα γράψουμε κώδικα και θα τον εκτελέσουμε χρησιμοποιώντας το παράδειγμα μας
Αρχικά, ας δημιουργήσουμε έναν κατάλογο για το νέο μας έργο, ο οποίος θα περιέχει αρχεία που περιγράφουν την υποδομή.
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: Θυμηθείτε ότι στο παράδειγμά μας χρησιμοποιούμε
Τα περιεχόμενα του αρχείου 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"
}
}
Ας δημιουργήσουμε κανόνες για το τείχος προστασίας, το οποίο σας επιτρέπει να παρέχετε σε εικονικές μηχανές πρόσβαση στο Διαδίκτυο. Μέσα σε αυτό το μπλοκ, όλοι οι εικονικοί πόροι στο 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 στο οποίο θα βρίσκονται οι εικονικές μηχανές και η διαμόρφωσή τους.
Διαμόρφωση εικονικής μηχανής
Ας δημιουργήσουμε ένα κοντέινερ 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. Αρχικοποίηση υποδομής
Αρχικοποίηση μονάδων και προσθηκών
Για εργασία, χρησιμοποιούμε ένα απλό "σετ κυρίων": φορητό υπολογιστή με 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.
Το εργαλείο αποδείχθηκε πολύ βολικό και σας επιτρέπει να περιγράψετε την υποδομή σας ως κώδικα, από εικονικές μηχανές ενός παρόχου cloud έως την περιγραφή των πόρων των στοιχείων δικτύου.
Ταυτόχρονα, η ανεξαρτησία από το περιβάλλον καθιστά δυνατή την εργασία με τοπικούς πόρους, cloud και, τελειώνοντας με τη διαχείριση πλατφόρμας. Και αν δεν υπάρχει υποστηριζόμενη πλατφόρμα και θέλετε να προσθέσετε μια νέα, μπορείτε να γράψετε τον δικό σας πάροχο και να τον χρησιμοποιήσετε.
Πηγή: www.habr.com