Terraform#

Terraform представляет собой систему автоматизации развёртывания и обновления информационной инфраструктуры с использованием доступного для организации оборудования и программного обеспечения. Для описания требуемой инфраструктуры Terraform предлагает декларативный язык на базе HCL.

Создание пользователя в Yandex Cloud при помощи Terraform#

В данном примере в Yandex Cloud создаётся пользователь, обладающий следующими свойствами:

  • имя – administrator;

  • использование механизма sudo без ввода пароля;

  • аутентификация по SSH с помощью ключа;

  • высокий уровень целостности;

  • интерпретатор Bash в качестве оболочки командной строки.

  1. В каталоге с описанием инфраструктуры создайте файл cloud-init.cfg со следующим содержимым:

    #cloud-config
    users:
      - name: administrator
        groups: astra-admin
        shell: /bin/bash
        sudo: ['ALL=(ALL) NOPASSWD:ALL']
        parsec_user_max_ilev: high
        ssh-authorized-keys:
          - ssh-ed25519 AAAAC3....zvNm administrator@example.com
    
  2. В файле конфигурации Terraform добавьте к описанию ВМ следующие строки:

    metadata = {
      user-data = "${file("./cloud-init.cfg")}"
    }
    

Создание ВМ в libvirt при помощи Terraform#

В данном примере создается ВМ в системе виртуализации libvirt:

Примечание

При использовании Astra Linux Special Edition 1.7.5 версия провайдера Terraform dmacvicar/libvirt должна быть не выше 0.7.1.

Пример кода

cloud_config.cfg#
---
#cloud-config
users:
  - name: astra
    groups: astra-admin
    shell: /bin/bash
    sudo: ["ALL=(ALL) NOPASSWD:ALL"]
    ssh_authorized_keys: "AAAAC3....zvNm administrator@example.com"

growpart:
  mode: auto
  devices: ["/"]
network_config.cfg#
---
version: 1
config:
  - type: physical
    name: eth0
    subnets:
      - type: static
        address: 192.168.122.22
        netmask: 255.255.255.0
        gateway: 192.168.122.1
        dns_nameservers:
          - 192.168.122.1
main.tf#
terraform {
  required_version = ">= 1.0"
  required_providers {
    libvirt = {
      source  = "dmacvicar/libvirt"
      version = "0.7.1"
    }
  }
}

provider "libvirt" {
  uri = "qemu:///system"
}

variable "pool" {
  type    = string
  default = "mg_test_pool"
}

variable "volume_id" {
  type    = string
  default = "images/alse-1.7.5uu1-base-cloudinit-mg13.3.0-amd64.qcow2"
}

resource "libvirt_pool" "test" {
  name = var.pool
  type = "dir"
  path = "/media/mg_test_pool"
}

resource "libvirt_volume" "test" {
  name   = "testdisk"
  pool   = var.pool
  source = var.volume_id
}

data "template_file" "user_data" {
  template = file("${path.module}/cloud_init.cfg")
}

data "template_file" "network_config" {
  template = file("${path.module}/network_config.cfg")
}

resource "libvirt_cloudinit_disk" "commoninit" {
  name           = "commoninit.test.iso"
  user_data      = data.template_file.user_data.rendered
  network_config = data.template_file.network_config.rendered
  pool           = var.pool
}

resource "libvirt_domain" "test" {
  name       = "test"
  memory     = "2048"
  vcpu       = "2"
  autostart  = true
  qemu_agent = true

  cloudinit = libvirt_cloudinit_disk.commoninit.id

  cpu {
    mode = "host-passthrough"
  }

  disk {
    volume_id = libvirt_volume.test.id
  }

  boot_device {
    dev = ["hd"]
  }

  network_interface {
    hostname       = "test"
    bridge         = "virbr0"
    addresses      = ["192.168.122.22", "::1"]
    mac            = "52:54:00:8A:8B:8C"
    wait_for_lease = true
  }

  console {
    type        = "pty"
    target_type = "virtio"
    target_port = "1"
  }

  graphics {
    type        = "spice"
    listen_type = "address"
    autoport    = true
  }
}

output "name" {
  value = libvirt_domain.test.network_interface[0].addresses[0]
}