terraform Adventskalender 2019 Tag 6: christamas_tree :.
Dieser Artikel befasst sich mit der Terraform-Automatisierung in einer Oracle Cloud-Umgebung.
Die verwendete Cloud-Infrastruktur ist Oracle Cloud, aber die grundlegende Art, tf-Dateien zu schreiben, ändert sich nicht, sodass die allgemeine Idee auch auf andere Clouds angewendet werden kann.
In diesem Artikel beginnen wir mit der deklarativen Konfigurationsverwaltung, erläutern die Umrisse von Terraform, die grundlegende Verwendung und stellen die folgende Umgebung bereit (*). Bitte genießen Sie die Kraft von Terraform!
(*) Die in diesem Artikel beschriebene tf-Datei ist auf [GitHub] verfügbar (https://github.com/Brutus03/Terraform/tree/master/common).
Bevor Sie Terraform lernen, informieren Sie sich über ** Deklaratives Konfigurationsmanagement ** und ** Zweck des Konfigurationsmanagement-Tools **. Sie können den Wert von Terraform maximieren!
** Cloud Native ** (*) ist ein Ansatz, der herkömmliche Infrastrukturressourcen abstrahiert und Anwendungen in einer Cloud-Umgebung entwickelt.
Da sich Cloud Native auf die Cloud-Infrastruktur konzentriert, besteht eine hohe Affinität zu Anwendungen, die in die kleinsten Komponenten wie Containertyp-Kostümtechnologie und Mikrodienste unterteilt sind. Da es möglich ist, flexibel auf die Entwicklungsmethode eines Systems mit einem kurzen Zyklus wie agil zu reagieren, ist eine Hochgeschwindigkeitsfreigabe zu erwarten.
Bei der Entwicklung eines Wasserfalls in einer traditionellen lokalen Umgebung gibt es beispielsweise die folgenden Phasen für Infrastrukturressourcen:
Wenn Sie dann nach der Freigabe in die Betriebsphase eintreten und das Service-Management gemäß ITIL durchführen, erfolgt jeder Prozess des Konfigurationsmanagements, des Änderungsmanagements und des Release-Managements.
Aufgrund der Demokratisierung der Cloud und der Verbreitung der Containervirtualisierungstechnologie wurden jedoch die Schlagworte von DevOps und Cloud Native geboren und als Technologien, die den Lebenszyklus des Konfigurationsmanagements von der Konstruktion an unterstützen, Konfigurationsmanagement-Tools wie Puppet und Chef sowie Orchestrierung wie Kubernetes Mit der Aufmerksamkeit der Rationswerkzeuge hat sich die Herangehensweise an das System zu einem deklarativen Verfahren entwickelt.
Das Konzept der Infrastruktur in Cloud Native kann nun als Cloud Native-Architektur bezeichnet werden, die auf ** deklarativem Konfigurationsmanagement ** basiert.
Durch die Annahme eines deklarativen Konfigurationsmanagements kann das operative Design beim Entwurf der Systemarchitektur berücksichtigt werden. In der Vergangenheit kann die Automatisierung zum Zeitpunkt des Entwurfs auch bei Problemen in Betracht gezogen werden, die nach dem Start des Betriebs aufgetreten sind. Es erleichtert auch die Skalierbarkeit.
(*) Das Wort Cloud Native ist nicht genau wie künstliche Intelligenz als die Bedeutung des Wortes definiert.
Berücksichtigen Sie den Zweck des Konfigurationsverwaltungstools.
** Aus Sicht von DevOps ist es nicht das Ziel, Konfigurationsmanagement-Tools einzuführen, sondern wie stark der Entwicklungsprozess mithilfe der Konfigurationsmanagement-Tools optimiert werden kann. ** ** **
Zuvor schrieb ich in Was ist Ansible? Zweck des Konfigurationsmanagement-Tools - Den schnellsten Weg zur Einführung von Ansible verstehen, aber den Zweck der Einführung des Konfigurationsmanagement-Tools Sie können sehen, was Sie tun möchten, indem Sie klarstellen.
Wenn Sie den Zweck des Konfigurationsmanagement-Tools nicht klarstellen und die Vorteile und den Ablauf nach der Operation verstehen und vorhersagen, können Sie die Vorteile daher nicht maximieren.
Daher können Sie mit Terraform die zuvor manuelle Erstellung von Cloud-Infrastrukturressourcen automatisieren. Wenn Sie es mit Ansible usw. kombinieren, können Sie gleichzeitig effizient mit OS- und MW-Setup arbeiten.
** Durch die Einführung eines Konfigurationsmanagement-Tools wie Terraform können Sie die zeitaufwändige Arbeit drastisch reduzieren und diese Zeit anderen wichtigen Themen widmen. ** ** **
Unter dem Gesichtspunkt der Gleichstellung wird es auch gleich sein, egal wer es tut. Wir werden also Betriebsfehler vermeiden und die Qualität erhalten. Es funktioniert nicht nur in der Entwicklungsphase, sondern auch in der Betriebsphase hervorragend.
In diesem Artikel werden wir Terraform und Cloud-Init verwenden, um Ressourcen für die Cloud-Infrastruktur zu erstellen und zunächst das Betriebssystem und das MW einzurichten.
Terraform ist eines der Konfigurationsmanagement-Tools zum Verwalten der Ressourcen der Cloud-Infrastruktur.
Es bietet einen Prozess zur Automatisierung der Bereitstellung, die für die moderne Anwendungsentwicklung erforderlich ist, z. B. ** DevOps ** und ** Infrastruktur als Code **.
Die Verwendung von Terraform ist sehr einfach. Sie können eine Cloud-Infrastruktur erstellen, indem Sie einfach Ressourceninformationen wie Instanzen und Netzwerke in einer Definitionsdatei beschreiben, die als tf-Datei bezeichnet wird, und den Befehl terraform ausführen.
Als Bild ist es den beliebten Küchengeräten "Slow Cooker" in den USA sehr ähnlich. Das Einstellen der Zutaten und das Drücken des Schalters, um das Gericht zu vervollständigen, ist genau der gleiche.
Aber es ist keine Silberkugel.
** Nachdem ich verschiedene Dinge mit Terraform ausprobiert habe, möchte ich das auch tun, aber es gibt einige Dinge, die aufgrund der Spezifikationen des Cloud-Anbieters nicht möglich sind. ** ** **
Bei der Bereitstellung von Terraform sollten Sie viele Überprüfungen durchführen, um zu klären, was Sie tun können und was nicht.
Um mit Terraform in der Oracle Cloud-Umgebung zu erstellen, erstellen Sie einen Benutzer und bereiten Sie die erforderlichen Anmeldeinformationen vor. Installieren Sie anschließend Terraform und bereiten Sie die für die Ausführung von Terraform erforderliche tf-Datei vor.
Die Voraussetzungen für eine Oracle Cloud-Umgebung sind unten aufgeführt.
In diesem Artikel verwenden wir den Mac als Beispiel.
.bashrc
-Datei usw. Das folgende Beispiel zeigt, wie der Pfad unter der Anwendung übergeben wird.export PATH=$PATH:/Applications/
Führen Sie nach dem Übergeben des Pfads den folgenden Befehl aus. Wenn die Versionsinformationen ausgegeben werden, wird der Pfad übergeben.
# terraform -v
Terraform v0.12.7
Your version of Terraform is out of date! The latest version
is 0.12.13. You can update by downloading from www.terraform.io/downloads.html
(*) Das Obige wird ausgegeben, da die von Ihnen verwendete Version von Terraform alt ist. Wird nicht angezeigt, wenn Sie eine neuere Version von Terraform verwenden.
Es wird automatisch heruntergeladen, wenn "terraform init", das später beschrieben wird, ausgeführt wird, sodass kein separater Download erforderlich ist.
Ich werde über die tf-Datei erklären.
Wechseln Sie zuerst in ein beliebiges Arbeitsverzeichnis. In diesem Artikel lautet die Verzeichnisstruktur wie folgt, und das aktuelle Verzeichnis ist das oci-Verzeichnis.
--Verzeichnisaufbau
.
|-- common
| |-- userdata
| |-- cloud-init1.tpl
| |-- cloud-init2.tpl
| |-- compute.tf
| |-- env-vars
| |-- lb.tf
| |-- network.tf
| |-- provider.tf
| |-- securitylist.tf
|-- oci_api_key.pem
|-- oci_api_key_public.pem
`-- ssh
|-- id_rsa
|-- id_rsa.pub
Dateiname | Rolle |
---|---|
cloud-init1.tpl | Erstes Erstellungsskript für den Webserver |
cloud-init2.tpl | Erstes Erstellungsskript für DB-Server |
compute.tf | Instanz tf Datei |
env-vars | Tf-Datei mit Variablen, die vom Anbieter verwendet werden |
lb.tf | Laden Sie die Balancer-TF-Datei |
network.tf | Netzwerk-TF-Datei |
provider.tf | Provider-tf-Datei |
securitylist.tf | Sicherheitsliste tf Datei |
oci_api_key.pem | Privater API-Schlüssel |
oci_api_key_public.pem | Öffentlicher API-Schlüssel |
id_rsa | Privater SSH-Schlüssel |
id_rsa.pub | Öffentlicher SSH-Schlüssel |
** Die Punkte beim Erstellen einer TF-Datei werden unten beschrieben. ** ** **
=
nicht ausfüllen. Wenn Sie sie also ausrichten möchten, entscheiden Sie sich für eine Regel wie das Ausrichten und beschreiben Sie sie auf leicht verständliche Weise.Beschreibt die in diesem Artikel verwendete tf-Datei. (*)
(*) Einige Werte sind Anmeldeinformationen, daher wird x als Beispiel verwendet.
### Authentication details
export TF_VAR_tenancy_ocid=ocid1.tenancy.oc1..aaaaaaaaxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
export TF_VAR_user_ocid=ocid1.user.oc1..aaaaaaaaxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
export TF_VAR_fingerprint=12:34:56:78:90:ab:cd:ef:12:34:56:78:90:ab:cd:ef
export TF_VAR_private_key_path=/oci/oci_api_key.pem
export TF_VAR_private_key_password=xxxxxxxx
### Region
export TF_VAR_region=ap-tokyo-1
### Compartment
export TF_VAR_compartment_ocid=ocid1.compartment.oc1..aaaaaaaaxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
### Public/private keys used on the instance
export TF_VAR_ssh_public_key=$(cat /oci/ssh/id_rsa.pub)
export TF_VAR_ssh_private_key=$(cat /oci/ssh/id_rsa)
(*) Private_key_password
ist nicht erforderlich, wenn Sie keine Passphrase für den privaten API-Schlüssel festlegen.
# Variable
variable "tenancy_ocid" {}
variable "user_ocid" {}
variable "fingerprint" {}
variable "private_key_path" {}
variable "private_key_password" {}
variable "region" {}
variable "compartment_ocid" {}
variable "ssh_private_key" {}
variable "ssh_public_key" {}
# Configure the Oracle Cloud Infrastructure provider with an API Key
provider "oci" {
tenancy_ocid = "${var.tenancy_ocid}"
user_ocid = "${var.user_ocid}"
fingerprint = "${var.fingerprint}"
private_key_path = "${var.private_key_path}"
private_key_password = "${var.private_key_password}"
region = "${var.region}"
}
# Virtual Cloud Network
## vcn1
resource "oci_core_virtual_network" "vcn1" {
display_name = "vcn1"
compartment_id = "${var.compartment_ocid}"
cidr_block = "10.0.0.0/16"
dns_label = "vcn1"
}
## vcn2
resource "oci_core_virtual_network" "vcn2" {
display_name = "vcn2"
compartment_id = "${var.compartment_ocid}"
cidr_block = "192.168.0.0/16"
dns_label = "vcn2"
}
# Subnet
## Subnet LB
resource "oci_core_subnet" "LB_Segment" {
display_name = "Entwicklungsumgebung_LB-Segment"
compartment_id = "${var.compartment_ocid}"
vcn_id = "${oci_core_virtual_network.vcn1.id}"
cidr_block = "10.0.0.0/24"
route_table_id = "${oci_core_default_route_table.default-route-table1.id}"
security_list_ids = ["${oci_core_security_list.LB_securitylist.id}"]
}
## Subnet Web
resource "oci_core_subnet" "Web_Segment" {
display_name = "Entwicklungsumgebung_WEB-Segment"
compartment_id = "${var.compartment_ocid}"
vcn_id = "${oci_core_virtual_network.vcn1.id}"
cidr_block = "10.0.1.0/24"
route_table_id = "${oci_core_default_route_table.default-route-table1.id}"
security_list_ids = ["${oci_core_security_list.Web_securitylist.id}"]
}
## Subnet DB
resource "oci_core_subnet" "DB_Segment" {
display_name = "Entwicklungsumgebung_DB-Segment"
compartment_id = "${var.compartment_ocid}"
vcn_id = "${oci_core_virtual_network.vcn1.id}"
cidr_block = "10.0.2.0/24"
route_table_id = "${oci_core_route_table.nat-route-table.id}"
prohibit_public_ip_on_vnic = "true"
security_list_ids = ["${oci_core_security_list.DB_securitylist.id}"]
}
## Subnet Operation
resource "oci_core_subnet" "Ope_Segment" {
display_name = "Entwicklungsumgebung_Investitionssegment"
compartment_id = "${var.compartment_ocid}"
vcn_id = "${oci_core_virtual_network.vcn2.id}"
cidr_block = "192.168.1.0/24"
route_table_id = "${oci_core_default_route_table.default-route-table2.id}"
security_list_ids = ["${oci_core_security_list.Ope_securitylist.id}"]
}
# Route Table
## default-route-table1
resource "oci_core_default_route_table" "default-route-table1" {
manage_default_resource_id = "${oci_core_virtual_network.vcn1.default_route_table_id}"
route_rules {
destination = "0.0.0.0/0"
destination_type = "CIDR_BLOCK"
network_entity_id = "${oci_core_internet_gateway.internet-gateway1.id}"
}
}
## nat-route-table
resource "oci_core_route_table" "nat-route-table" {
display_name = "nat-route-table"
compartment_id = "${var.compartment_ocid}"
vcn_id = "${oci_core_virtual_network.vcn1.id}"
route_rules {
destination = "0.0.0.0/0"
network_entity_id = "${oci_core_nat_gateway.nat-gateway.id}"
}
}
## default-route-table2
resource "oci_core_default_route_table" "default-route-table2" {
manage_default_resource_id = "${oci_core_virtual_network.vcn2.default_route_table_id}"
route_rules {
destination = "0.0.0.0/0"
destination_type = "CIDR_BLOCK"
network_entity_id = "${oci_core_internet_gateway.internet-gateway2.id}"
}
}
# Internet Gateway
## internet-gateway1
resource "oci_core_internet_gateway" "internet-gateway1" {
display_name = "internet-gateway1"
compartment_id = "${var.compartment_ocid}"
vcn_id = "${oci_core_virtual_network.vcn1.id}"
}
## internet-gateway2
resource "oci_core_internet_gateway" "internet-gateway2" {
display_name = "internet-gateway2"
compartment_id = "${var.compartment_ocid}"
vcn_id = "${oci_core_virtual_network.vcn2.id}"
}
# Nat-Gateway
resource "oci_core_nat_gateway" "nat-gateway" {
display_name = "nat-gateway"
compartment_id = "${var.compartment_ocid}"
vcn_id = "${oci_core_virtual_network.vcn1.id}"
}
(*) Wenn Sie keine öffentlichen IP-Adressen für das Subnetz zulassen möchten, beschreiben Sie hibit_public_ip_on_vnic = "true"
.
/* Load Balancer */
resource "oci_load_balancer" "load-balancer" {
shape = "100Mbps"
compartment_id = "${var.compartment_ocid}"
subnet_ids = [
"${oci_core_subnet.LB_Segment.id}",
]
display_name = "load-balancer"
}
resource "oci_load_balancer_backend_set" "lb-bes1" {
name = "lb-bes1"
load_balancer_id = "${oci_load_balancer.load-balancer.id}"
policy = "ROUND_ROBIN"
health_checker {
port = "80"
protocol = "HTTP"
response_body_regex = ".*"
url_path = "/"
}
}
resource "oci_load_balancer_certificate" "lb-cert1" {
load_balancer_id = "${oci_load_balancer.load-balancer.id}"
ca_certificate = "-----BEGIN CERTIFICATE-----\nMIIC9jCCAd4CCQD2rPUVJETHGzANBgkqhkiG9w0BAQsFADA9MQswCQYDVQQGEwJV\nUzELMAkGA1UECAwCV0ExEDAOBgNVBAcMB1NlYXR0bGUxDzANBgNVBAoMBk9yYWNs\nZTAeFw0xOTAxMTcyMjU4MDVaFw0yMTAxMTYyMjU4MDVaMD0xCzAJBgNVBAYTAlVT\nMQswCQYDVQQIDAJXQTEQMA4GA1UEBwwHU2VhdHRsZTEPMA0GA1UECgwGT3JhY2xl\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA30+wt7OlUB/YpmWbTRkx\nnLG0lKWiV+oupNKj8luXmC5jvOFTUejt1pQhpA47nCqywlOAfk2N8hJWTyJZUmKU\n+DWVV2So2B/obYxpiiyWF2tcF/cYi1kBYeAIu5JkVFwDe4ITK/oQUFEhIn3Qg/oC\nMQ2985/MTdCXONgnbmePU64GrJwfvOeJcQB3VIL1BBfISj4pPw5708qTRv5MJBOO\njLKRM68KXC5us4879IrSA77NQr1KwjGnQlykyCgGvvgwgrUTd5c/dH8EKrZVcFi6\nytM66P/1CTpk1YpbI4gqiG0HBbuXG4JRIjyzW4GT4JXeSjgvrkIYL8k/M4Az1WEc\n2wIDAQABMA0GCSqGSIb3DQEBCwUAA4IBAQAuI53m8Va6EafDi6GQdQrzNNQFCAVQ\nxIABAB0uaSYCs3H+pqTktHzOrOluSUEogXRl0UU5/OuvxAz4idA4cfBdId4i7AcY\nqZsBjA/xqH/rxR3pcgfaGyxQzrUsJFf0ZwnzqYJs7fUvuatHJYi/cRBxrKR2+4Oj\nlUbb9TSmezlzHK5CaD5XzN+lZqbsSvN3OQbOryJCbtjZVQFGZ1SmL6OLrwpbBKuP\nn2ob+gaP57YSzO3zk1NDXMlQPHRsdSOqocyKx8y+7J0g6MqPvBzIe+wI3QW85MQY\nj1/IHmj84LNGp7pHCyiYx/oI+00gRch04H2pJv0TP3sAQ37gplBwDrUo\n-----END CERTIFICATE-----"
certificate_name = "certificate1"
private_key = "-----BEGIN RSA PRIVATE KEY-----\nMIIEowIBAAKCAQEA30+wt7OlUB/YpmWbTRkxnLG0lKWiV+oupNKj8luXmC5jvOFT\nUejt1pQhpA47nCqywlOAfk2N8hJWTyJZUmKU+DWVV2So2B/obYxpiiyWF2tcF/cY\n\ni1kBYeAIu5JkVFwDe4ITK/oQUFEhIn3Qg/oCMQ2985/MTdCXONgnbmePU64GrJwf\nvOeJcQB3VIL1BBfISj4pPw5708qTRv5MJBOOjLKRM68KXC5us4879IrSA77NQr1K\nwjGnQlykyCgGvvgwgrUTd5c/dH8EKrZVcFi6ytM66P/1CTpk1YpbI4gqiG0HBbuX\nG4JRIjyzW4GT4JXeSjgvrkIYL8k/M4Az1WEc2wIDAQABAoIBAGQznukfG/uS/qTT\njNcQifl0p8HXfLwUIa/lsJkMTj6D+k8DkF59tVMGjv3NQSQ26JVX4J1L8XiAj+fc\nUtYr1Ap4CLX5PeYUkzesvKK6lPKXQvCh+Ip2eq9PVrvL2WcdDpb5695cy7suXD7c\n05aUtS0LrINH3eXAxkpEe5UHtQFni5YLrCLEXd+SSA3OKdCB+23HRELc1iCTvqjK\n5AtR916uHTBhtREHRMvWIdu4InRUsedlJhaJOLJ8G8r64JUtfm3wLUK1U8HFOsd0\nLAx9ZURU6cXl4osTWiy1vigGaM8Xuish2HkOLNYZADDUiDBB3SshmW5IDAJ5XTn5\nqVrszRECgYEA79j1y+WLTyV7yz7XkWk3OqoQXG4b2JfKItJI1M95UwllzQ8U/krM\n+QZjP3NTtB9i1YoHyaEfic103hV9Fkgz8jvKS5ocLGJulpN4CgqbHN6v9EJ3dqTk\no6X8mpx2eP2E0ngRekFyC/OCp0Zhe2KR9PXhijMa5eB2LTeCMIS/tzkCgYEA7lmk\nIdVjcpfqY7UFJ2R8zqPJHOne2+llrl9vzo6N5kx4DzAg7MP6XO9MekOvfmD1X1Lm\nFckXWFEF+0TlN5YvCTR/+OmVufYM3xp4GBT8RZdLFbyI4+xpAAeSC4SeM0ZkC9Jt\nrKqCS24+Kqy/+qSqtkxiPLQrXSdCSfCUlmn0ALMCgYBB7SLy3q+CG82BOk7Km18g\n8un4XhOtX1uiYqa+SCETH/wpd0HP/AOHV6gkIrEZS59BDuXBGFaw7BZ5jPKLE2Gj\n7adXTI797Dh1jydpqyyjrNo0i6iGpiBqkw9x+Bvged7ucy5qql6MxmxdSk01Owzf\nhk5uTEnScfZJy34vk+2WkQKBgBXx5uy+iuN4HTqE5i6UT/FunwusdLpmqNf/LXol\nIed8TumHEuD5wklgNvhi1vuZzb2zEkAbPa0B+L0DwN73UulUDhxK1WBDyTeZZklB\nVWDK5zzfGPNzRs+b4tRwp2gtKPT1sOde45QyWELxmNNo6dbS/ZB9Pijbfnz0S5n1\ns2OFAoGBAJUohI1+d2hKlkSUzpCorQarDe8lFVEbGMu0kX0JNDI7QU+H8vDp9NOl\nGqLm3sCVBYypT8sWfchgZpcVaLRLQCQtWy4+CbMN6DT3j/uBWeDpayU5Gvqt0/no\nvwqbG6b0NEYLRPLEdsS/c8TV9mMlvb0EW+GXfmkpTrTNt3hyXniu\n-----END RSA PRIVATE KEY-----"
public_certificate = "-----BEGIN CERTIFICATE-----\nMIIC9jCCAd4CCQD2rPUVJETHGzANBgkqhkiG9w0BAQsFADA9MQswCQYDVQQGEwJV\nUzELMAkGA1UECAwCV0ExEDAOBgNVBAcMB1NlYXR0bGUxDzANBgNVBAoMBk9yYWNs\nZTAeFw0xOTAxMTcyMjU4MDVaFw0yMTAxMTYyMjU4MDVaMD0xCzAJBgNVBAYTAlVT\nMQswCQYDVQQIDAJXQTEQMA4GA1UEBwwHU2VhdHRsZTEPMA0GA1UECgwGT3JhY2xl\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA30+wt7OlUB/YpmWbTRkx\nnLG0lKWiV+oupNKj8luXmC5jvOFTUejt1pQhpA47nCqywlOAfk2N8hJWTyJZUmKU\n+DWVV2So2B/obYxpiiyWF2tcF/cYi1kBYeAIu5JkVFwDe4ITK/oQUFEhIn3Qg/oC\nMQ2985/MTdCXONgnbmePU64GrJwfvOeJcQB3VIL1BBfISj4pPw5708qTRv5MJBOO\njLKRM68KXC5us4879IrSA77NQr1KwjGnQlykyCgGvvgwgrUTd5c/dH8EKrZVcFi6\nytM66P/1CTpk1YpbI4gqiG0HBbuXG4JRIjyzW4GT4JXeSjgvrkIYL8k/M4Az1WEc\n2wIDAQABMA0GCSqGSIb3DQEBCwUAA4IBAQAuI53m8Va6EafDi6GQdQrzNNQFCAVQ\nxIABAB0uaSYCs3H+pqTktHzOrOluSUEogXRl0UU5/OuvxAz4idA4cfBdId4i7AcY\nqZsBjA/xqH/rxR3pcgfaGyxQzrUsJFf0ZwnzqYJs7fUvuatHJYi/cRBxrKR2+4Oj\nlUbb9TSmezlzHK5CaD5XzN+lZqbsSvN3OQbOryJCbtjZVQFGZ1SmL6OLrwpbBKuP\nn2ob+gaP57YSzO3zk1NDXMlQPHRsdSOqocyKx8y+7J0g6MqPvBzIe+wI3QW85MQY\nj1/IHmj84LNGp7pHCyiYx/oI+00gRch04H2pJv0TP3sAQ37gplBwDrUo\n-----END CERTIFICATE-----"
lifecycle {
create_before_destroy = true
}
}
resource "oci_load_balancer_path_route_set" "test_path_route_set" {
#Required
load_balancer_id = "${oci_load_balancer.load-balancer.id}"
name = "pr-set1"
path_routes {
#Required
backend_set_name = "${oci_load_balancer_backend_set.lb-bes1.name}"
path = "/test"
path_match_type {
#Required
match_type = "EXACT_MATCH"
}
}
}
resource "oci_load_balancer_hostname" "test_hostname1" {
#Required
hostname = "app.example.com"
load_balancer_id = "${oci_load_balancer.load-balancer.id}"
name = "hostname1"
}
resource "oci_load_balancer_listener" "lb-listener1" {
load_balancer_id = "${oci_load_balancer.load-balancer.id}"
name = "http"
default_backend_set_name = "${oci_load_balancer_backend_set.lb-bes1.name}"
hostname_names = ["${oci_load_balancer_hostname.test_hostname1.name}"]
port = 80
protocol = "HTTP"
connection_configuration {
idle_timeout_in_seconds = "2"
}
}
resource "oci_load_balancer_listener" "lb-listener2" {
load_balancer_id = "${oci_load_balancer.load-balancer.id}"
name = "https"
default_backend_set_name = "${oci_load_balancer_backend_set.lb-bes1.name}"
port = 443
protocol = "HTTP"
ssl_configuration {
certificate_name = "${oci_load_balancer_certificate.lb-cert1.certificate_name}"
verify_peer_certificate = false
}
}
resource "oci_load_balancer_backend" "lb-be1" {
load_balancer_id = "${oci_load_balancer.load-balancer.id}"
backendset_name = "${oci_load_balancer_backend_set.lb-bes1.name}"
ip_address = "${var.ip_address3}"
port = 80
backup = false
drain = false
offline = false
weight = 1
}
resource "oci_load_balancer_backend" "lb-be2" {
load_balancer_id = "${oci_load_balancer.load-balancer.id}"
backendset_name = "${oci_load_balancer_backend_set.lb-bes1.name}"
ip_address = "${var.ip_address4}"
port = 80
backup = false
drain = false
offline = false
weight = 1
}
output "lb_public_ip" {
value = ["${oci_load_balancer.load-balancer.ip_address_details}"]
}
(*) Wenn Sie die Ausgabe beschreiben, können Sie den durch die Ausgabe angegebenen Wert nach dem Erstellen der Ressource ausgeben.
# Security list
## LB
resource "oci_core_security_list" "LB_securitylist" {
display_name = "Entwicklungsumgebung_LB-Segment"
compartment_id = "${var.compartment_ocid}"
vcn_id = "${oci_core_virtual_network.vcn1.id}"
ingress_security_rules {
source = "0.0.0.0/0"
protocol = "6"
tcp_options {
min = 443
max = 443
}
}
egress_security_rules {
destination = "0.0.0.0/0"
protocol = "ALL"
}
}
## Web
resource "oci_core_security_list" "Web_securitylist" {
display_name = "Entwicklungsumgebung_Websegment"
compartment_id = "${var.compartment_ocid}"
vcn_id = "${oci_core_virtual_network.vcn1.id}"
ingress_security_rules {
source = "10.0.0.0/24"
protocol = "6"
tcp_options {
min = 80
max = 80
}
}
egress_security_rules {
destination = "0.0.0.0/0"
protocol = "ALL"
}
}
## DB
resource "oci_core_security_list" "DB_securitylist" {
display_name = "Entwicklungsumgebung_DB-Segment"
compartment_id = "${var.compartment_ocid}"
vcn_id = "${oci_core_virtual_network.vcn1.id}"
ingress_security_rules {
source = "10.0.1.0/24"
protocol = "6"
tcp_options {
min = 5432
max = 5432
}
}
egress_security_rules {
destination = "0.0.0.0/0"
protocol = "ALL"
}
}
## Security list Ope
resource "oci_core_security_list" "Ope_securitylist" {
display_name = "Entwicklungsumgebung_Investitionssegment"
compartment_id = "${var.compartment_ocid}"
vcn_id = "${oci_core_virtual_network.vcn2.id}"
ingress_security_rules {
source = "192.168.1.0/24"
protocol = "1"
}
ingress_security_rules {
source = "x.x.x.x/32"
protocol = "6"
tcp_options {
min = 22
max = 22
}
}
ingress_security_rules {
source = "192.168.1.0/24"
protocol = "6"
tcp_options {
min = 22
max = 22
}
}
egress_security_rules {
destination = "0.0.0.0/0"
protocol = "ALL"
}
}
(*) Source =" x.x.x.x / 32 "
wird als SSH-Einschränkung für öffentliche IP-Adressen beschrieben.
# Variable
variable "ImageOS" {
default = "Oracle Linux"
}
variable "ImageOSVersion" {
default = "7.7"
}
variable "instance_shape" {
default = "VM.Standard.E2.1"
}
variable "fault_domain" {
default = "FAULT-DOMAIN-1"
}
variable "ip_address1" {
default = "192.168.1.2"
}
variable "ip_address2" {
default = "192.168.1.3"
}
variable "ip_address3" {
default = "10.0.1.2"
}
variable "ip_address4" {
default = "10.0.1.3"
}
variable "ip_address5" {
default = "192.168.1.4"
}
variable "ip_address6" {
default = "10.0.2.2"
}
variable "ip_address7" {
default = "192.168.1.5"
}
# Gets a list of Availability Domains
data "oci_identity_availability_domains" "ADs" {
compartment_id = "${var.tenancy_ocid}"
}
# Gets a list of all Oracle Linux 7.7 images that support a given Instance shape
data "oci_core_images" "instance" {
compartment_id = "${var.tenancy_ocid}"
operating_system = "${var.ImageOS}"
operating_system_version = "${var.ImageOSVersion}"
shape = "${var.instance_shape}"
}
# Instance
## Compute Web-Server#1
resource "oci_core_instance" "instance1" {
source_details {
source_type = "image"
source_id = "${lookup(data.oci_core_images.instance.images[0], "id")}"
}
display_name = "Web-Server#1"
availability_domain = "${lookup(data.oci_identity_availability_domains.ADs.availability_domains[0], "name")}"
shape = "${var.instance_shape}"
compartment_id = "${var.compartment_ocid}"
create_vnic_details {
subnet_id = "${oci_core_subnet.Ope_Segment.id}"
assign_public_ip = "true"
private_ip = "${var.ip_address1}"
}
metadata = {
ssh_authorized_keys = "${var.ssh_public_key}"
user_data = "${base64encode(file("./userdata/cloud-init1.tpl"))}"
}
fault_domain = "${var.fault_domain}"
provisioner "remote-exec" {
connection {
host = "${oci_core_instance.instance1.public_ip}"
type = "ssh"
user = "opc"
agent = "true"
timeout = "3m"
}
inline = [
"crontab -l | { cat; echo \"@reboot sudo /usr/local/bin/secondary_vnic_all_configure.sh -c\"; } | crontab -"
]
}
}
### SecondaryVNIC Web-Server#1
resource "oci_core_vnic_attachment" "Web1_secondary_vnic_attachment" {
create_vnic_details {
display_name = "SecondaryVNIC"
subnet_id = "${oci_core_subnet.Web_Segment.id}"
assign_public_ip = "true"
private_ip = "${var.ip_address3}"
skip_source_dest_check = "false"
}
instance_id = "${oci_core_instance.instance1.id}"
}
## Compute Web-Server#2
resource "oci_core_instance" "instance2" {
source_details {
source_type = "image"
source_id = "${lookup(data.oci_core_images.instance.images[0], "id")}"
}
display_name = "Web-Server#2"
availability_domain = "${lookup(data.oci_identity_availability_domains.ADs.availability_domains[0], "name")}"
shape = "${var.instance_shape}"
compartment_id = "${var.compartment_ocid}"
create_vnic_details {
subnet_id = "${oci_core_subnet.Ope_Segment.id}"
assign_public_ip = "true"
private_ip = "${var.ip_address2}"
}
metadata = {
ssh_authorized_keys = "${var.ssh_public_key}"
user_data = "${base64encode(file("./userdata/cloud-init1.tpl"))}"
}
fault_domain = "${var.fault_domain}"
provisioner "remote-exec" {
connection {
host = "${oci_core_instance.instance2.public_ip}"
type = "ssh"
user = "opc"
agent = "true"
timeout = "3m"
}
inline = [
"crontab -l | { cat; echo \"@reboot sudo /usr/local/bin/secondary_vnic_all_configure.sh -c\"; } | crontab -"
]
}
}
### SecondaryVNIC Web-Server#2
resource "oci_core_vnic_attachment" "Web2_secondary_vnic_attachment" {
create_vnic_details {
display_name = "SecondaryVNIC"
subnet_id = "${oci_core_subnet.Web_Segment.id}"
assign_public_ip = "true"
private_ip = "${var.ip_address4}"
skip_source_dest_check = "false"
}
instance_id = "${oci_core_instance.instance2.id}"
}
## Compute DB-Server
resource "oci_core_instance" "instance3" {
source_details {
source_type = "image"
source_id = "${lookup(data.oci_core_images.instance.images[0], "id")}"
}
display_name = "DB-Server"
availability_domain = "${lookup(data.oci_identity_availability_domains.ADs.availability_domains[0], "name")}"
shape = "${var.instance_shape}"
compartment_id = "${var.compartment_ocid}"
create_vnic_details {
subnet_id = "${oci_core_subnet.Ope_Segment.id}"
private_ip = "${var.ip_address5}"
}
metadata = {
ssh_authorized_keys = "${var.ssh_public_key}"
user_data = "${base64encode(file("./userdata/cloud-init2.tpl"))}"
}
fault_domain = "${var.fault_domain}"
provisioner "remote-exec" {
connection {
host = "${oci_core_instance.instance3.public_ip}"
type = "ssh"
user = "opc"
agent = "true"
timeout = "3m"
}
inline = [
"crontab -l | { cat; echo \"@reboot sudo /usr/local/bin/secondary_vnic_all_configure.sh -c\"; } | crontab -"
]
}
}
### SecondaryVNIC DB-Server
resource "oci_core_vnic_attachment" "DB_secondary_vnic_attachment" {
create_vnic_details {
display_name = "SecondaryVNIC"
subnet_id = "${oci_core_subnet.DB_Segment.id}"
assign_public_ip = false
private_ip = "${var.ip_address6}"
skip_source_dest_check = "false"
}
instance_id = "${oci_core_instance.instance3.id}"
}
## Compute Operation-Server
resource "oci_core_instance" "instance4" {
source_details {
source_type = "image"
source_id = "${lookup(data.oci_core_images.instance.images[0], "id")}"
}
display_name = " Operation-Server"
availability_domain = "${lookup(data.oci_identity_availability_domains.ADs.availability_domains[0], "name")}"
shape = "${var.instance_shape}"
compartment_id = "${var.compartment_ocid}"
create_vnic_details {
subnet_id = "${oci_core_subnet.Ope_Segment.id}"
private_ip = "${var.ip_address7}"
}
metadata = {
ssh_authorized_keys = "${var.ssh_public_key}"
user_data = "${base64encode(file("./userdata/cloud-init1.tpl"))}"
}
fault_domain = "${var.fault_domain}"
provisioner "remote-exec" {
connection {
host = "${oci_core_instance.instance3.public_ip}"
type = "ssh"
user = "opc"
agent = "true"
timeout = "3m"
}
inline = [
"crontab -l | { cat; echo \"@reboot sudo /usr/local/bin/secondary_vnic_all_configure.sh -c\"; } | crontab -"
]
}
}
#cloud-config
runcmd:
# download the secondary vnic script
- wget -O /usr/local/bin/secondary_vnic_all_configure.sh https://docs.cloud.oracle.com/iaas/Content/Resources/Assets/secondary_vnic_all_configure.sh
- chmod +x /usr/local/bin/secondary_vnic_all_configure.sh
- sleep 60
- /usr/local/bin/secondary_vnic_all_configure.sh -c
- yum update -y
- echo "Hello World. The time is now $(date -R)!" | tee /root/output.txt
- echo '################### webserver userdata begins #####################'
- touch ~opc/userdata.`date +%s`.start
# echo '########## yum update all ###############'
# yum update -y
- echo '########## basic webserver ##############'
- yum install -y httpd
- systemctl enable httpd.service
- systemctl start httpd.service
- echo '<html><head></head><body><pre><code>' > /var/www/html/index.html
- hostname >> /var/www/html/index.html
- echo '' >> /var/www/html/index.html
- cat /etc/os-release >> /var/www/html/index.html
- echo '</code></pre></body></html>' >> /var/www/html/index.html
- firewall-offline-cmd --add-service=http
- systemctl enable firewalld
- systemctl restart firewalld
- touch ~opc/userdata.`date +%s`.finish
- echo '################### webserver userdata ends #######################'
#cloud-config
runcmd:
# download the secondary vnic script
- wget -O /usr/local/bin/secondary_vnic_all_configure.sh https://docs.cloud.oracle.com/iaas/Content/Resources/Assets/secondary_vnic_all_configure.sh
- chmod +x /usr/local/bin/secondary_vnic_all_configure.sh
- sleep 60
- /usr/local/bin/secondary_vnic_all_configure.sh -c
- echo 'PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin' > /var/spool/cron/root
- echo '@reboot /usr/local/bin/secondary_vnic_all_configure.sh -c' >> /var/spool/cron/root
#Von Postgresql verwendete Porteinstellungen
- setenforce 0
- firewall-cmd --permanent --add-port=5432/tcp
- firewall-cmd --permanent --add-port=5432/udp
- firewall-cmd --reload
#Installation der erforderlichen Pakete
- yum install -y gcc
- yum install -y readline-devel
- yum install -y zlib-devel
#Installieren Sie PostgreSQL
- cd /usr/local/src/
- wget https://ftp.postgresql.org/pub/source/v11.3/postgresql-11.3.tar.gz
- tar xvfz postgresql-11.3.tar.gz
- cd postgresql-11.3/
#kompilieren
- ./configure
- make
- make install
#Startskript erstellen
- cp /usr/local/src/postgresql-11.3/contrib/start-scripts/linux /etc/init.d/postgres
- chmod 755 /etc/init.d/postgres
- chkconfig --add postgres
- chkconfig --list | grep postgres
#Postgres-Benutzer erstellt
- adduser postgres
Führen Sie zunächst die folgenden Vorbereitungsarbeiten durch.
$ source env-vars
$ env
$ ssh-add /oci/ssh/id_rsa
(*) Terraform unterstützt keine passphrasengeschützten SSH-Schlüssel. Dies wird vermieden, indem der SSH-Schlüssel im SSH-Agenten registriert wird. Nicht erforderlich, wenn Sie keine Passphrase für Ihren privaten SSH-Schlüssel festgelegt haben.
Nach Abschluss der Vorbereitungsarbeiten ist es endlich Zeit, Terraform zu bauen. Terraform Bauarbeiten sind die nächsten 3 Schritte!
Schauen wir sie uns der Reihe nach an.
terraform init
terraform init
initialisiert das Arbeitsverzeichnis, das die Terraform-Konfigurationsdatei enthält. Wenn kein Argument angegeben wird, wird die aktuelle Arbeitsverzeichniskonfiguration initialisiert. Während der Initialisierung sucht Terraform in der Konfiguration nach direkten und indirekten Verweisen auf den Anbieter und lädt die erforderlichen Plugins.
# terraform init
Initializing the backend...
Initializing provider plugins...
The following providers do not have any version constraints in configuration,
so the latest version was installed.
To prevent automatic upgrades to new major versions that may contain breaking
changes, it is recommended to add version = "..." constraints to the
corresponding provider blocks in configuration, with the constraint strings
suggested below.
* provider.oci: version = "~> 3.40"
Terraform has been successfully initialized!
You may now begin working with Terraform. Try running "terraform plan" to see
any changes that are required for your infrastructure. All Terraform commands
should now work.
If you ever set or change modules or backend configuration for Terraform,
rerun this command to reinitialize your working directory. If you forget, other
commands will detect it and remind you to do so if necessary.
terraform plan
terraform plan
wird verwendet, um einen Ausführungsplan zu erstellen. Es wird nicht nur durch Ausführen dieses Befehls wiedergegeben. Es wird verwendet, um zu testen, ob es wie erwartet funktioniert, ohne die tatsächlichen Ressourcen oder den Status zu ändern. Sie können auch das optionale Argument "-out" verwenden, um den generierten Plan zur späteren Ausführung in einer Datei zu speichern. Beachten Sie, dass ein Fehler in der tf-Datei erkannt wird, aber selbst wenn "Terraform-Plan" erfolgreich ist, kann er mit "Terraform-Anwendung" fehlschlagen. Seien Sie also vorsichtig.
# terraform plan
The refreshed state will be used to calculate this plan, but will not be
persisted to local or remote state storage.
data.oci_identity_availability_domains.ADs: Refreshing state...
data.oci_core_images.instance: Refreshing state...
------------------------------------------------------------------------
An execution plan has been generated and is shown below.
Resource actions are indicated with the following symbols:
+ create
Terraform will perform the following actions:
# oci_core_default_route_table.default-route-table1 will be created
+ resource "oci_core_default_route_table" "default-route-table1" {
+ defined_tags = (known after apply)
+ display_name = (known after apply)
+ freeform_tags = (known after apply)
+ id = (known after apply)
+ manage_default_resource_id = (known after apply)
+ state = (known after apply)
+ time_created = (known after apply)
+ route_rules {
+ cidr_block = (known after apply)
+ destination = "0.0.0.0/0"
+ destination_type = "CIDR_BLOCK"
+ network_entity_id = (known after apply)
}
}
/*Unterlassung*/
Plan: 32 to add, 0 to change, 0 to destroy.
------------------------------------------------------------------------
Note: You didn't specify an "-out" parameter to save this plan, so Terraform
can't guarantee that exactly these actions will be performed if
"terraform apply" is subsequently run.
terraform apply
Terraform apply
wendet Änderungen der Ressourcenkonfiguration abhängig vom Ausführungsplan an.
Wenn dieser Befehl ausgeführt wird, wird eine Datei terraform.tfstate generiert.
# terraform apply
data.oci_identity_availability_domains.ADs: Refreshing state...
data.oci_core_images.instance: Refreshing state...
An execution plan has been generated and is shown below.
Resource actions are indicated with the following symbols:
+ create
Terraform will perform the following actions:
# oci_core_default_route_table.default-route-table1 will be created
+ resource "oci_core_default_route_table" "default-route-table1" {
+ defined_tags = (known after apply)
+ display_name = (known after apply)
+ freeform_tags = (known after apply)
+ id = (known after apply)
+ manage_default_resource_id = (known after apply)
+ state = (known after apply)
+ time_created = (known after apply)
+ route_rules {
+ cidr_block = (known after apply)
+ destination = "0.0.0.0/0"
+ destination_type = "CIDR_BLOCK"
+ network_entity_id = (known after apply)
}
}
/*Unterlassung*/
Plan: 32 to add, 0 to change, 0 to destroy.
Do you want to perform these actions?
Terraform will perform the actions described above.
Only 'yes' will be accepted to approve.
Enter a value: yes
oci_core_virtual_network.vcn2: Creating...
oci_core_virtual_network.vcn1: Creating...
/*Unterlassung*/
Apply complete! Resources: 32 added, 0 changed, 0 destroyed.
Outputs:
lb_public_ip = [
[
{
"ip_address" = "X.X.X.X"
"is_public" = true
},
],
]
** Hinweise </ font> **
** Wenn Sie für jedes Verzeichnis separate tf-Dateien haben und mit verschiedenen Fächern arbeiten, vergessen Sie nicht, beim Wechseln der Verzeichnisse source env-vars
auszuführen. ** ** **
Als Hiyari-Hut habe ich in Umgebung A gearbeitet. Nehmen wir als nächstes an, Sie gehen zum Diktat der B-Umgebung und führen "terraform apply" aus. Wenn die in der A-Umgebung verwendeten Variablen erhalten bleiben, besteht die Gefahr, dass Ressourcen in unbeabsichtigten Fächern erstellt oder gelöscht werden.
Greifen Sie nach dem Ausführen von "Terraform Apply" auf den Konsolenbildschirm von Oracle Cloud zu und überprüfen Sie die erstellte Ressource.
Wenn Sie nach Abschluss der Cloud-Init auf die IP-Adresse der von Outputs ausgegebenen Load Balancer zugreifen, wird der Webserver "index.html" angezeigt.
terraform destroy
terraform destroy
löscht die gesamte gebaute Umgebung.
# terraform destroy
data.oci_identity_availability_domains.ADs: Refreshing state...
/*Unterlassung*/
Plan: 0 to add, 0 to change, 32 to destroy.
Do you really want to destroy all resources?
Terraform will destroy all your managed infrastructure, as shown above.
There is no undo. Only 'yes' will be accepted to confirm.
Enter a value: yes
/*Unterlassung*/
oci_core_virtual_network.vcn1: Destruction complete after 0s
Destroy complete! Resources: 32 destroyed.
Die Bilder von Oracle Cloud, die mit Terraform verwendet werden können, lauten wie folgt.
$ oci compute image list -c <Fach OCID>--all | jq -r '.data[] | ."operating-system"' | sort | uniq
Canonical Ubuntu
CentOS
Custom
Oracle Linux
Windows
Daher können Sie kein benutzerdefiniertes Image wie ** "Oracle Database" verwenden. ** ** ** Wenn Sie einen Datenbankdienst in Terraform starten möchten, können Sie dies mithilfe von Managed Database Service-DBaaS tun.
Wenn Sie mehrere Instanzen erstellen, erhöht sich die Codemenge, wenn Sie für jede Einheit schreiben. Die iterative Ausführung kann mithilfe eines Arrays von Variablen in der tf-Datei durchgeführt werden. In diesem Artikel ist die Anzahl der Instanzen nicht groß, daher definieren wir die Anzahl der Instanzen.
cloud-init Sie können ein benutzerdefiniertes Skript für den Wert von user_data in der tf-Datei angeben. Informationen zur Verwendung von Benutzerdaten finden Sie unter Benutzerdatenformate.
Bei der Verwendung von Cloud-Init geht es nicht darum, den Inhalt des benutzerdefinierten Skripts zu überprüfen. Selbst wenn "Terraform Apply" erfolgreich ist, schlägt das Skript möglicherweise fehl.
Wenn beispielsweise ein Zeilenumbruch wie unten gezeigt auftritt, schlägt dieser fehl.
$ sudo apt-get install \
apt-transport-https \
ca-certificates \
curl \
gnupg-agent \
software-properties-common
Auch wenn "Terraform Apply" erfolgreich ist, ist der Cloud-Init-Prozess noch nicht abgeschlossen. Nachdem Sie sich bei der Instanz angemeldet haben, können Sie in der folgenden Protokolldatei überprüfen, ob sie wie vorgesehen funktioniert.
# cat /var/log/cloud-init-output.log
Secondary VNIC Bei der Konfiguration einer sekundären VNIC in Oracle Cloud sollte berücksichtigt werden. In diesem Artikel führen wir sekundäre_vnic_all_configure.sh aus, um die IP zu konfigurieren.
Wenn beispielsweise "terraform apply" ausgeführt wird und der Zeitpunkt für den Aufruf von "sekundary_vnic_all_configure.sh" früh ist, schlägt die IP-Konfiguration möglicherweise fehl. Daher wird in diesem Artikel die Schlafverarbeitung in cloud-init.tpl eingefügt, die in den Benutzerdaten von cloud-Init angegeben ist, und sie wird zuverlässig ausgeführt.
Um die sekundäre VNIC beim Neustart des Betriebssystems zu aktivieren, wird cron in der tf-Datei auf "inline" von "remote-exec" gesetzt. Wenn Sie keine öffentliche IP-Adresse für die Instanz festlegen, können Sie "remote-exec" nicht verwenden. In diesem Fall ist Cloud-Init eine gute Wahl.
Wenn Sie danach das Geschäfts-LAN und das Produktions-LAN wie in diesem Artikel getrennt haben, empfiehlt es sich, das Operations-LAN als primäre VNIC anzugeben.
Sie können auch den Terraform-Import verwenden, um vorhandene Umgebungen für Ressourcen zu codieren, die vor der Bereitstellung von Terraform erstellt wurden.
Terraform zeigt seinen wahren Wert in jeder Szene, von der Ausgabe der Verifizierungsumgebung über die Erstellung der Produktionsumgebung bis hin zur Verwaltung der Konfiguration der Betriebsphase.
Für diejenigen, die als Infrastrukturingenieure in einer Legacy-Umgebung wie mir gearbeitet haben und auf Pres aufgewachsen sind, war ich sehr beeindruckt, als ich zum ersten Mal "Terraform Apply" ausführte und die Ressourcen erstellte.
Heutzutage entwickeln Anwendungsingenieure auch mit Docker usw., aber ich denke, Terraform ist die Rolle von SRE, das sich auf den Infrastrukturbereich spezialisiert hat. Ich hatte ehrlich gesagt das Gefühl, dass es einige Dinge gibt, die nur von Leuten berücksichtigt werden können, die zur Infrastruktur kommen.
Ich möchte Terraform weiterhin nutzen, um eine Umgebung zu schaffen, in der sich Entwickler nur auf die Entwicklung konzentrieren können.
Oracle Cloud/Terraform
Recommended Posts