[LINUX] Der wahre Wert der Terraform-Automatisierung ab Oracle Cloud

Einführung

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!

terraform.png

(*) Die in diesem Artikel beschriebene tf-Datei ist auf [GitHub] verfügbar (https://github.com/Brutus03/Terraform/tree/master/common).

Deklaratives Konfigurationsmanagement

Bevor Sie Terraform lernen, informieren Sie sich über ** Deklaratives Konfigurationsmanagement ** und ** Zweck des Konfigurationsmanagement-Tools **. Sie können den Wert von Terraform maximieren!

Deklaratives Konfigurationsmanagement

** 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.

Zweck des Konfigurationsverwaltungstools

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.

terraform自動化.png

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-Übersicht

Terraform ist eines der Konfigurationsmanagement-Tools zum Verwalten der Ressourcen der Cloud-Infrastruktur.

スクリーンショット 2019-12-05 10.46.43.png

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.

tfファイル.png

Aber es ist keine Silberkugel.

銀の弾丸.png

** 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.

Terraform-Konstruktion

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.

Terraform-Installation

In diesem Artikel verwenden wir den Mac als Beispiel.

  1. Laden Sie zunächst die Binärdatei von Download Terraform herunter.
  2. Extrahieren Sie es nach dem Herunterladen in ein beliebiges Verzeichnis.
  3. Übergeben Sie den Pfad zur .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.

Installieren von Terraform Provider für Oracle Cloud Infrastructure

Es wird automatisch heruntergeladen, wenn "terraform init", das später beschrieben wird, ausgeführt wird, sodass kein separater Download erforderlich ist.

Erstellen einer TF-Datei

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. ** ** **

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

Terraform-Konstruktion

Führen Sie zunächst die folgenden Vorbereitungsarbeiten durch.

(*) 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!

  1. Initialisieren Sie mit "Terraform darin"
  2. Bestätigen Sie mit "Terraform Plan"
  3. Mit "Terraform Apply" auftragen

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.

Ressourcenbestätigung

Greifen Sie nach dem Ausführen von "Terraform Apply" auf den Konsolenbildschirm von Oracle Cloud zu und überprüfen Sie die erstellte Ressource.

  • Virtuelles Cloud-Netzwerk
スクリーンショット 2019-12-02 23.46.38.png
  • Instanz
スクリーンショット 2019-12-02 23.50.30.png

Wenn Sie nach Abschluss der Cloud-Init auf die IP-Adresse der von Outputs ausgegebenen Load Balancer zugreifen, wird der Webserver "index.html" angezeigt.

スクリーンショット 2019-12-04 21.15.54.png

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.

Wissen

Von Oracle Cloud unterstützte "Betriebssysteme"

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.

Erstellen Sie mehrere Instanzen

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.

Codierung der vorhandenen Umgebung

Sie können auch den Terraform-Import verwenden, um vorhandene Umgebungen für Ressourcen zu codieren, die vor der Bereitstellung von Terraform erstellt wurden.

abschließend

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.

Referenz

Cloud native Architektur

  • [Cloud Native Architecture, 5 Prinzipien](https://cloud.google.com/blog/ja/products/gcp/5-principles-for-cloud-native-architecture-what-it-is-and-how -zu-meistern-es)

Oracle Cloud/Terraform

Recommended Posts

Der wahre Wert der Terraform-Automatisierung ab Oracle Cloud
Nehmen Sie den Wert des SwitchBot-Thermo-Hygrometers mit Raspberry Pi
Umschalten der Bot-Thermo-Hygrometer-Werte mit Raspberry Pi
Vereinheitlichen Sie die Umgebung des Python-Entwicklungsteams, beginnend mit Poetry
Ihre URL hat nicht mit dem Wert des Challenge-Parameters geantwortet.
Finden Sie den optimalen Wert der Funktion mit einem genetischen Algorithmus (Teil 2)
Visualisieren Sie die Häufigkeit von Wortvorkommen in Sätzen mit Word Cloud. [Python]
Lösung des Anfangswertproblems gewöhnlicher Differentialgleichungen mit JModelica
Tipps: [Python] Berechnen Sie den Durchschnittswert des angegebenen Bereichs mit Bedgraph
Protokollieren Sie die Omron-Umgebungssensorwerte regelmäßig mit Raspberry Pi
Finden Sie die Definition des Wertes von errno
Über den Rückgabewert von pthread_mutex_init ()
Automatisierung von Remote-Operationen mit Fabric
Mit ReportingAPI + Cloud-Funktionen können Sie die Anzahl der Besuche auf jeder Seite ermitteln
Protokollierung der Omron-Umgebungssensorwerte mit Raspberry Pi (USB-Typ)
Ruft den Rückgabewert eines externen Shell-Skripts (ls) mit python3 ab
Führen Sie IDCF Cloud CLI auf Docker aus
Richten Sie die Größe der Farbleiste an der Matplotlib aus
Überprüfen Sie die Existenz der Datei mit Python
Finden Sie den SHA256-Wert mit R (mit Bonus)
Die dritte Nacht der Runde mit für
Ermitteln Sie den Wert der mittleren Schicht von NN
Testautomatisierung beginnend mit L-Chika (3) Einbau eines Oszilloskops
Zählen Sie die Anzahl der Zeichen mit Echo
Machen Sie den Standardwert des Arguments unveränderlich
Automatisierung der Erstellung von Arbeitszeittabellen am Monatsende mit Selen
Füllen Sie den fehlenden Wert (null) von DataFrame mit den Werten davor und danach mit pyspark
So geben Sie mit Jupyter Notebook einen Wert in der Mitte einer Zelle aus
Vergleichen Sie die Summe jedes Elements in zwei Listen mit dem in Python angegebenen Wert
[Überprüfung] Versuchen Sie, die Punktgruppe an der Optimierungsfunktion von Pytorch Part 1 auszurichten
Automatisierung von Remote-Operationen mit Fabric
Mit Monitoring gewinnen
Das von / etc / shadow
Proxyserver mit Docker
Lokaler Server mit Python
Setzen Sie numpy scipy usw. in virtualenv von Ubuntu 12.04 LTS Server
Ich habe versucht, Djangos Server mit VScode anstelle von Pycharm zu starten
Überprüfen Sie den Speicherstatus des Servers mit dem Befehl Linux free
Überprüfen Sie den Betriebsstatus des Servers mit dem Linux-Befehl top
Erstellen Sie mit Falcon einen Light-Speed-Web-API-Server
Der wahre Wert der Terraform-Automatisierung ab Oracle Cloud