Terraform 4 базис
Terraform 4 базис
Продолжаем цикл статей:
http://snakeproject.ru/rubric/article.php?art=е1_21082024
http://snakeproject.ru/rubric/article.php?art=terraform_05092024
http://snakeproject.ru/rubric/article.php?art=terraform_13092024
Сегодня кратко поговорим о provisioners
Существуют разные provisioners , которые помогают настраивать виртуальные машины
Одни provisioners используются во время создания виртуальной машины
Другие provisioners используются после создания виртуальной машины
Документацию смотри:
https://developer.hashicorp.com/terraform/language/resources/provisioners/syntax
Ниже показан пример provisioner - remote-exec:
- применяется во время создания vps
- выполнитьяет указанный список команд
Больше документации:
https://developer.hashicorp.com/terraform/language/resources/provisioners/remote-exec
remote-exec provisioner вызывает скрипт на удаленном ресурсе после его создания
Для remote-exec поставщика требуется подключение, и он поддерживает как ssh , так и winrm
Документация по подключениям ssh или winrm:
https://developer.hashicorp.com/terraform/language/resources/provisioners/connection
Задача - задать пароль учетке root на созданной vps
Код из предыдущих статей дублироваться не будет
connection - блок подключения
provisioner - блок provisioner
Ниже:
Синтаксис [*] представляет собой символьное выражение
Перебирает все элементы списка, указанного слева от него
Возвращает список заданных атрибутов для каждого из них.
variables.tf
variable "do_token" {}
variable "aws_access_key" {}
variable "aws_secret_key" {}
variable "local_ssh_public_key" {
default = "~/.ssh/id_rsa.pub"
}
variable "local_ssh_private_key" {
default = "~/.ssh/id_rsa"
}
variable "instance_count" {
default = "2"
}
resources.tf
resource "digitalocean_volume" "vol5" {
count = var.instance_count
region = "nyc1"
name = "vol-${count.index + 1}"
size = 5
initial_filesystem_type = "ext4"
description = "5gb_volume"
}
resource "digitalocean_ssh_key" "local_ssh_pkey" {
name = "local_ssh_public_key"
public_key = file(var.local_ssh_public_key)
}
resource "digitalocean_droplet" "foobar" {
count = var.instance_count
name = "serv-${count.index + 1}"
size = "s-1vcpu-1gb"
image = "ubuntu-20-04-x64"
region = "nyc1"
ssh_keys = [digitalocean_ssh_key.local_ssh_pkey.id]
volume_ids = ["${element(digitalocean_volume.vol5.*.id, count.index)}"]
connection {
user = "root"
type = "ssh"
private_key = file(var.local_ssh_private_key)
timeout = "2m"
host = self.ipv4_address
}
provisioner "remote-exec" {
inline = [
"usermod --password 'My_Super_Pass' root"
]
}
}
locals {
vps_ip = digitalocean_droplet.foobar[*].ipv4_address
}
data "aws_route53_zone" "zone" {
name = "devops.domain.ru"
}
resource "aws_route53_record" "record" {
for_each = toset(local.vps_ip)
zone_id = data.aws_route53_zone.zone.id
name = "serv-${index(local.vps_ip, each.value) + 1}"
type = "A"
ttl = "300"
records = [each.value]
}
Комментарии пользователей
Анонимам нельзя оставоять комментарии, зарегистрируйтесь!