Terraform - Ein Einblick der Möglichkeiten von ... · Terraform-Kurzbeschreibung I...

Post on 15-Jun-2020

6 views 0 download

transcript

TerraformEin Einblick der Möglichkeiten von

Infrastructure-as-Code

Dr. Sebastian Oehlke

27.04.2019

Terraforming - Begriffserklärung

https://en.wikipedia.org/wiki/Image:MarsTransitionV.jpg

#atix #graz19 #IaC

Motivation

Wir brauchen jetzt n-Ressourcen, die folgendeAnforderungen erfüllen …

#atix #graz19 #IaC

Terraform - Kurzbeschreibung

I Infrastructure-as-code

I Hashicorp (Vagrant, Vault, Packer)

#atix #graz19 #IaC

Terraform - Kurzbeschreibung

I Kodifiziert API-Befehle in deklaritive Konfigurationsdateien

I Open-Source

#atix #graz19 #IaC

Terraform - Kurzbeschreibung

I Sicher und vorhersagbar

I Erstellen, Ändern, Verbessernder Infrastruktur

I Kombination vonverschiedenen Providern

I Code teilen, Versionskontrolle,Review-Möglichkeit

I Modular

I Gut zu automatisieren

#atix #graz19 #IaC

Terraform - Kurzbeschreibung

I Sicher und vorhersagbar

I Erstellen, Ändern, Verbessernder Infrastruktur

I Kombination vonverschiedenen Providern

I Code teilen, Versionskontrolle,Review-Möglichkeit

I Modular

I Gut zu automatisieren

#atix #graz19 #IaC

Auszug an Möglichkeiten mit Terraform

Provider-Gruppen:

I Verwaltung vonCloud-Diensten

I Verwaltung vonContainer-Plattformen

I Network Providern

I Version Control

I Monitoring & SystemManagement

I Databases

⇒ Wenn es eine API hat, geht vermutlich das Management via Terraform

#atix #graz19 #IaC

Auszug an Möglichkeiten mit Terraform

Provider-Gruppen:

I Verwaltung vonCloud-Diensten

I Verwaltung vonContainer-Plattformen

I Network Providern

I Version Control

I Monitoring & SystemManagement

I Databases

⇒ Wenn es eine API hat, geht vermutlich das Management via Terraform

#atix #graz19 #IaC

Schema

Infrastructure

ProviderCode Ressource 2

Ressource 1

Ressource 3

Ressource …

#atix #graz19 #IaC

Ablaufplan

Code

Check

done

terraform plan

terraform apply

terraform init

(terraform destroy)

I Check der Syntax und ladender benötigten Plugins

I Erstellen von Übersicht

I Was bereits vorhandenI Was wird geändertI Was für Operationen

werden durchgeführt

I Provider Kommunikation (API)

I (Entfernen der Ressource(n))

#atix #graz19 #IaC

Ablaufplan

Code

Check

done

terraform plan

terraform apply

terraform init

(terraform destroy)

I Check der Syntax und ladender benötigten Plugins

I Erstellen von Übersicht

I Was bereits vorhandenI Was wird geändertI Was für Operationen

werden durchgeführt

I Provider Kommunikation (API)

I (Entfernen der Ressource(n))

#atix #graz19 #IaC

Variables

In Datei: variables.tf

variable "region" {description = "Region to be used"}

In Datei: terraform.tfvars

region = "eu-central-1"

Im Code:

region = "${var.region}"

⇒ Kombinierbar mit Modulen

#atix #graz19 #IaC

Variables

In Datei: variables.tf

variable "region" {description = "Region to be used"}

In Datei: terraform.tfvars

region = "eu-central-1"

Im Code ab Version 0.12:

region = var.region

⇒ Kombinierbar mit Modulen

#atix #graz19 #IaC

Modules

module "name" {source = "/path/to/folder"variable1 = "foo"variable2 = "bar"

}

module "frontend" {source = "git::git@github.com:user/i-modules.git//m-name?ref=v0.1"

variable1 = 8variable2 = 20

}

#atix #graz19 #IaC

Modules

module "name" {source = "/path/to/folder"variable1 = "foo"variable2 = "bar"

}

module "frontend" {source = "git::git@github.com:user/i-modules.git//m-name?ref=v0.1"

variable1 = 8variable2 = 20

}

#atix #graz19 #IaC

Zusammenarbeit mit Backends

User 2

User 3

User N

Backend

#atix #graz19 #IaC

Rolle von Provisioning

Ressource nativ

Provisioner

Ressourcekonfiguriert

I Notwendigkeit abhängig vonProvider/Ressourcentyp (VM vs.Container)

I Einrichten von 1-N Ressourcen

I Nutzen von Facts undIdempotenz

#atix #graz19 #IaC

Rolle von Provisioning

Ressource nativ

Provisioner

Ressourcekonfiguriert

I Notwendigkeit abhängig vonProvider/Ressourcentyp (VM vs.Container)

I Einrichten von 1-N Ressourcen

I Nutzen von Facts undIdempotenz

#atix #graz19 #IaC

Ansible vs. Terraform

AnsibleI Configuration management

I Verwenden der Facts fürweitere Operationen

I Geeignet um Ressourceeinzurichten

I Dry-run nicht so informativ wasgeändert werden soll

TerraformI Ressource orchestration

I Übersichtliche Auflistung, wasgeändert wird

I Sehr rudimentäres provisioning

⇒ Kombination um Vorteile beider zu nutzen

#atix #graz19 #IaC

Ansible vs. Terraform

AnsibleI Configuration management

I Verwenden der Facts fürweitere Operationen

I Geeignet um Ressourceeinzurichten

I Dry-run nicht so informativ wasgeändert werden soll

TerraformI Ressource orchestration

I Übersichtliche Auflistung, wasgeändert wird

I Sehr rudimentäres provisioning

⇒ Kombination um Vorteile beider zu nutzen

#atix #graz19 #IaC

Ansible vs. Terraform

AnsibleI Configuration management

I Verwenden der Facts fürweitere Operationen

I Geeignet um Ressourceeinzurichten

I Dry-run nicht so informativ wasgeändert werden soll

TerraformI Ressource orchestration

I Übersichtliche Auflistung, wasgeändert wird

I Sehr rudimentäres provisioning

⇒ Kombination um Vorteile beider zu nutzen

#atix #graz19 #IaC

Kombination von Ansible und Terraform

Vorteil Ansible

I Wiederverwendungexistierender Rollen

I Nutzung vonDistro-unabhängigen Modulen

Vorteil Terraform

I Ressourcenmanagement

I Detailliertere Übersicht derÄnderungen

I Drift detection

I Komplette Lifecycle Kontrolle(Erstellen, Ändern, Entfernen)

I Gleiche Sprache umInfrastruktur und Ressourceneinzurichten

#atix #graz19 #IaC

Kombination von Ansible und Terraform

Ansible

Terraform Ressource(n)

AusführenInventory

Setup

Provisioning

#atix #graz19 #IaC

Demo - Ansible - Terraform - AWS

ansible-playbook --inventory=terraform-inventory ../main.yaml

#atix #graz19 #IaC

Demo - Ansible - terraform - AWS

---- hosts: localhost

connection: localgather_facts: Falsetasks:- name: Run terraform

terraform:project_path: '{{ project_dir }}'state: presentvariables:

counts : "{{ counts | default(1)}}"- name: Reload inventory

meta: refresh_inventory

- hosts: "aws"remote_user: userbecome: trueroles:- role: nginx

...

#atix #graz19 #IaC

Terraform Code

provider "aws" {region = "${var.region}"shared_credentials_file = "${var.loc}"profile = "${var.profile}"

}

#atix #graz19 #IaC

Terraform Code

resource "aws_instance" "web" {count = "${var.counts}"ami = "${var.ami}"instance_type = "${var.ami_type}"key_name = "${var.aws_keyname}"vpc_security_group_ids = ["${var.sg_id}"]provisioner "remote-exec" {

inline = ["sudo apt-get update && sudo apt -y install python",

]connection {

type = "ssh"user = "ubuntu"private_key = "${file(var.pkey)}"agent = false

}}tags {

Name = "${var.aws_tag}-${count.index}"}

}

#atix #graz19 #IaC

Demo - Ansible - Terraform - AWS

#atix #graz19 #IaC

Kritik und Ausblick

Aktuelle KritikpunkteI Sehr gute Übersicht der potentiellen Änderungen bevor diese

durchgeführt werden

I Code ist recht Provider-Spezifisch

I Durch unterschiedlicher Technologie nicht alle Settings lassensich 1:1 übertragen

I Provisinors sind recht limitiert

I aktuell nur Chef, Salt und rudimentäre ProvisinorsI aktuell kein Support für Ansible oder Puppet

Terraform ist immer noch in 0.x Status dewegen werden viele Sachen nochaddressiert und können innerhalb nächster Zeit schon umgesetzt werden

#atix #graz19 #IaC

Terraform - Ein Versuch ist es Wert

https://en.wikipedia.org/wiki/Image:MarsTransitionV.jpg

#atix #graz19 #IaC