Бирки Terraform DigitalOcean для этикеток роя - PullRequest
0 голосов
/ 29 апреля 2018

Предположим, у нас есть несколько тегов 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

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

1 Ответ

0 голосов
/ 02 мая 2018

Понял! Возможно, это не лучший способ решить проблему, но пока 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}",
    ]
  }
}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...