Terraform#
Terraform представляет собой систему автоматизации развёртывания и обновления информационной инфраструктуры с использованием доступного для организации оборудования и программного обеспечения. Для описания требуемой инфраструктуры Terraform предлагает декларативный язык на базе HCL.
Создание пользователя в Yandex Cloud при помощи Terraform#
В данном примере в Yandex Cloud создаётся пользователь, обладающий следующими свойствами:
имя –
administrator
;использование механизма sudo без ввода пароля;
аутентификация по SSH с помощью ключа;
высокий уровень целостности;
интерпретатор Bash в качестве оболочки командной строки.
В каталоге с описанием инфраструктуры создайте файл
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
В файле конфигурации 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
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: ["/"]
---
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
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]
}