terafform основы

Для подключения к любому облаку или системе управления виртуалками используется provider.

Пример для GC

provider "google" {
project = "steam-strategy-174408"
region = "europe-west1"
}

Для того чтобы инициализировать провайдер:

terraform init

Это только подключение, далее необходимо описать ресурсы

resource "google_compute_instance" "app" {
name = "reddit-app"
machine_type = "g1-small"
zone = "europe-west1-b"
# определение загрузочного диска
boot_disk {
initialize_params {
image = "reddit-base-1504639663"
}
}
# определение сетевого интерфейса
network_interface {
# сеть, к которой присоединить данный интерфейс
network = "default"
# использовать ephemeral IP для доступа из Интернет
access_config {}
}
}

Как создать несколько инстансов

resource "google_compute_instance" "app" {
name = "reddit-app-${count.undex + 1}"
machine_type = "g1-small"
zone = "europe-west1-b"
count = 1 # сколько будет создано

 

Для того чтобы проверить что все хорошо

terraform plan

И если все измения нас устраивают то

terraform apply

terraform.tfstat — это файл создастся после выполнения команды и содержит всю информацию о сделанных нами изменениях и состоянии

Чтобы просмотреть состояние и все параметры нашего инстанса

terraform show

Так можно добавить через metadata ключ для подключения к инстансу

resource "google_compute_instance" "app" {
...
metadata {
sshKeys = "appuser:${file("~/.ssh/id_rsa.pub")}"
}
...
}

Output — через него можно записать в файл нужную нам инфу, например внешние IP наших серверов

output "app_external_ip" {
value = "${google_compute_instance.app.network_interface.0.access_config.0.assigned_nat_ip}"
}

Выполняем команду чтобы получить файл с нашими переменными

terraform refresh

Так можно просмотреть значения, они будут храниться в файле output.tf

$ terraform output
app_external_ip = 104.155.68.69
$ terraform output app_external_ip
104.155.68.69

Чтобы открыть порт, добавляем в main.rf

resource "google_compute_firewall" "firewall_puma" {
name = "allow-puma-default"
# Название сети, в которой действует правило
network = "default"
# Какой доступ разрешить
allow {
protocol = "tcp"
ports = ["9292"]
}
# Каким адресам разрешаем доступ
source_ranges = ["0.0.0.0/0"]
# Правило применимо для инстансов с тегом ...
target_tags = ["reddit-app"]
}

Это правило будет применимо только к инстансам с тегом teddit-app, по этому надо добавить еще тег

resource "google_compute_instance" "app" {
name = "reddit-app"
machine_type = "g1-small" 
zone = "europe-west1-b"
tags = ["reddit-app"]

Provisioner — используется для выполнения команд на локальной или удаленной машине, для первоначальной настройки, выполняются по порядку как указаны в конфиге.

Первым делом надо указать как провизионер может подключиться к новой машине

connection {
type = "ssh"
user = "appuser"
agent = false
private_key = "${file("~/.ssh/appuser")}"
}

Например так мы можем скопировать файл на удаленную машину:

provisioner "file" {
source
= "files/puma.service"
destination = "/tmp/puma.service"
}

Так запустим скрипт на удаленной машине, но сам скрипт лежит на локальной

provisioner "remote-exec" {
script = "files/deploy.sh"
}
resource "google_compute_instance" "app" {
  name = "reddit-app"
  machine_type = "g1-small"
  zone = "europe-west1-b"

  boot_disk {
    initialize_params {
      image = "reddit-base-1504777717"
    }
  }
  metadata {
  sshKeys = "appuser:${file("~/.ssh/appuser.pub")}"
  }
  tags = ["reddit-app"]
  network_interface {
  network = "default"
  access_config {}
}
  connection {
    type = "ssh"
    user = "appuser"
    agent = false
    private_key = "${file("~/.ssh/appuser")}"
  }
  provisioner "file" {
    source = "files/puma.service"
    destination = "/tmp/puma.service"
  }

  provisioner "remote-exec" {
    script = "files/deploy.sh"
  }

}

Для того чтобы пометить инстанс на пересоздание надо выполнить команду

$ terraform taint google_compute_instance.app
The resource google_compute_instance.app in the module
root has been marked as tainted!

При запуску terraform apply инстанс будет пересоздан

Так же мы модем использовать входные переменные, для этого создаем файл variables.tf

variable project {
description = "Project ID"
}
variable region {
Значение по
description = "Region"
умолчанию
default = "europe-west1"
}
variable public_key_path {
  description = "Path to the public key used for ssh access"
}
variable disk_image {
description = "Disk image"
Описание переменной
}

Теперь можно использовать эти переменные “${var.var_name}”

provider "google" {
  project = "${var.project}"
  region = "${var.region}"
}
metadata {
sshKeys = "appuser:${file(var.public_key_path)}"
}

Определим переменные используя специальный файл terraform.tfvars из которого терраформ загружает переменные каждый раз

project = "infra-179015"
public_key_path = "~/.ssh/appuser.pub"
disk_image = "reddit-base-1504648286"

Удалить все что создали

terraform destroy

Форматирование конфигурационных файлов

terraform fmt

Можно посмотреть все зависимости, покажет от каких переменных и ресурсов зависит наше окружение

terraform graph | dot -Tpng > graph.png

Можно в описании ресурса указать зависимость

http://joxi.ru/v29RKnVT39Ql3A

 

Terraform

Related Articles

0 Comment

Leave a Comment

Ваш адрес email не будет опубликован.