Terraform DigitalOcean Droplet标签用于swarm标签

时间:2018-04-29 05:29:42

标签: terraform

我们假设我们有一些DO标签:

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

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

我们已经使用提到的标签配置了swarm worker节点。

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"
    ]
  }
}

我想用相应的资源(droplet)标签标记创建的swarm节点。

要标记工作节点,我们需要在swarm master上运行:

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

我们如何使用terraform自动化?

1 个答案:

答案 0 :(得分:0)

知道了!可能不是解决问题的最佳方法,但是直到没有发布完整群体支持的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}"
    ]
  }
}

毕竟我们可以在工作准备好之后通过ssh连接到swarm_manager:

# 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}",
    ]
  }
}

如果您知道更好的方法来解决这个问题,请不要犹豫,通过新的答案或评论指出。