Terraform DigitalOcean капли для ярлыков

62
6

Предположим, что у нас есть теги DO:

resource "digitalocean_tag" "foo" {
name = "foo"
}

resource "digitalocean_tag" "bar" {
name = "bar"
}

И мы сконфигурировали узлы рабочих рой с указанными тегами.

resource "digitalocean_droplet" "swarm_data_worker" {
name = "swarm-worker-${count.index}"
tags = [
"${digitalocean_tag.foo.id}",
"${digitalocean_tag.bar.id}"
]

// swarm node config stuff

provisioner "remote-exec" {
inline = [
"docker swarm join --token ${data.external.swarm_join_token.result.worker} ${digitalocean_droplet.swarm_manager.ipv4_address_private}:2377"
]
}
}

Я хочу пометить созданный узел роя соответствующими тегами ресурса (капли).

Чтобы пометить рабочие узлы, нам нужно запустить master роя:

docker node update --label-add foo --label-add bar worker-node

Как мы можем автоматизировать это с помощью терраформы?

спросил(а) 2021-01-19T14:08:40+03:00 2 месяца, 3 недели назад
1
Решение
87

Понял! Вероятно, это не лучший способ решить проблему, но до тех пор, пока Terraform с полной поддержкой рой не будет выпущен, не сможет найти что-то лучшее.

Основная идея заключается в использовании предварительно установленного ключа DO ssh:

variable "public_key_path" {
description = "DigitalOcean public key"
default = "~/.ssh/hcmc_swarm/key.pub"
}

variable "do_key_name" {
description = "Name of the key on Digital Ocean"
default = "terraform"
}

resource "digitalocean_ssh_key" "default" {
name = "${var.do_key_name}"
public_key = "${file(var.public_key_path)}"

}

Затем мы можем предоставить менеджера:

resource "digitalocean_droplet" "swarm_manager" {
...
ssh_keys = ["${digitalocean_ssh_key.default.id}"]

provisioner "remote-exec" {
inline = [
"docker swarm init --advertise-addr ${digitalocean_droplet.swarm_manager.ipv4_address_private}"
]
}
}

И ведь мы можем подключиться к swarm_manager через ssh после того, как рабочий будет готов:

# Docker swarm labels list

variable "swarm_data_worker__lables" {
type = "list"
default = ["type=data-worker"]
}

resource "digitalocean_droplet" "swarm_data_worker" {
...
provisioner "remote-exec" {
inline = [
"ssh -o StrictHostKeyChecking=no root@${digitalocean_droplet.swarm_manager.ipv4_address_private} docker node update --label-add ${join(" --label-add ", var.swarm_data_worker__lables)} ${self.name}",
]
}
}

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

ответил(а) 2021-01-19T14:08:40+03:00 2 месяца, 3 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема