Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/google-chrome/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Terraform空资源执行顺序_Terraform - Fatal编程技术网

Terraform空资源执行顺序

Terraform空资源执行顺序,terraform,Terraform,问题是: 我正试图在Digital Ocean上构建一个Docker Swarm集群,由3个“管理器”节点和多个工作节点组成。工作节点的数量与此问题并不特别相关。我正试图将Docker Swarm资源调配功能模块化,这样它就不会专门耦合到digitalocean提供商,而是可以接收一个ip地址列表,以阻止对集群进行资源调配 为了提供主节点,需要将第一个节点置于swarm模式,该模式生成一个连接密钥,其他主节点将使用该密钥连接第一个主节点。“null_资源”用于对主节点执行远程供应器,但是,我不知

问题是:

我正试图在Digital Ocean上构建一个Docker Swarm集群,由3个“管理器”节点和多个工作节点组成。工作节点的数量与此问题并不特别相关。我正试图将Docker Swarm资源调配功能模块化,这样它就不会专门耦合到digitalocean提供商,而是可以接收一个ip地址列表,以阻止对集群进行资源调配

为了提供主节点,需要将第一个节点置于swarm模式,该模式生成一个连接密钥,其他主节点将使用该密钥连接第一个主节点。“null_资源”用于对主节点执行远程供应器,但是,我不知道dafuq如何确保第一个主节点完成其工作(“docker swarm init…”),然后对需要加入第一个主节点的其他主节点执行另一个“null_资源”供应器。它们都是并行运行的,可以预见,这是行不通的

此外,尝试找出如何收集第一个节点生成的连接令牌并使其可供其他节点使用。我考虑过使用concur来实现这一点,并将连接令牌存储为密钥,然后在其他节点上获取该密钥-但这并不理想,因为。。。在确保配置和准备好concur集群方面仍然存在一些问题(这是一个类似的问题)

main.tf

variable "master_count" { default = 3 }

# master nodes
resource "digitalocean_droplet" "master_nodes" {
  count               = "${var.master_count}"
  ... etc, etc
}

module "docker_master" {
  source          = "./docker/master"
  private_ip      = "${digitalocean_droplet.master_nodes.*.ipv4_address_private}"
  public_ip       = "${digitalocean_droplet.master_nodes.*.ipv4_address}"
  instances       = "${var.master_count}"
}
docker/master/main.tf

variable "instances" {}
variable "private_ip" { type = "list" }
variable "public_ip" { type = "list" }


# Act only on the first item in the list of masters...
resource "null_resource" "swarm_master" {
  count = 1

  # Just to ensure this gets run every time
  triggers {
    version = "${timestamp()}"
  }

  connection {
    ...
    host = "${element(var.public_ip, 0)}"
  }

  provisioner "remote-exec" {
    inline = [<<EOF
      ... install docker, then ...

      docker swarm init --advertise-addr ${element(var.private_ip, 0)}

      MANAGER_JOIN_TOKEN=$(docker swarm join-token manager -q)
      # need to do something with the join token, like make it available
      # as an attribute for interpolation in the next "null_resource" block
    EOF
    ]
  }
}


# Act on the other 2 swarm master nodes (*not* the first one)
resource "null_resource" "other_swarm_masters" {
  count = "${var.instances - 1}"

  triggers {
    version = "${timestamp()}"
  }

  # Host key slices the 3-element IP list and excludes the first one
  connection {
    ...
    host = "${element(slice(var.public_ip, 1, length(var.public_ip)), count.index)}"
  }

  provisioner "remote-exec" {
    inline = [<<EOF
      SWARM_MASTER_JOIN_TOKEN=$(consul kv get docker/swarm/manager/join_token)
      docker swarm join --token ??? ${element(var.private_ip, 0)}:2377
    EOF
    ]
  }

  ##### THIS IS THE MEAT OF THE QUESTION ###
  # How do I make this "null_resource" block not run until the other one has
  # completed and generated the swarm token output? depends_on doesn't
  # seem to do it :(
}
variable“实例”{}
变量“private_ip”{type=“list”}
变量“public_ip”{type=“list”}
#仅对大师列表中的第一项进行操作。。。
资源“空”资源“群集主机”{
计数=1
#只是为了确保每次都能运行它
触发{
version=“${timestamp()}”
}
联系{
...
host=“${element(var.public_ip,0)}”
}
供应器“远程执行”{

inline=[@victor-m的注释是正确的。如果您使用
null\u资源
并在任何前者的属性上具有以下触发器,则它们将按顺序执行

resource“null\u resource“first”{
供应人“本地执行官”{
command=“echo”first'>first”
}
}
资源“空”\u资源“秒”{
触发器={
order=“${null_resource.first.id}”
}
供应人“本地执行官”{
command=“echo‘second’>>first”
}
}
资源“空”\u资源“第三”{
触发器={
order=“${null_resource.second.id}”
}
供应人“本地执行官”{
command=“echo‘third’>>first”
}
}
$terraform应用
null_resource.first:正在创建。。。
null_resource.first:使用“本地执行器”进行设置。。。
null_resource.first(本地执行):执行:[“/bin/sh”“-c”“echo'first'>first”]
null_resource.first:0秒后创建完成[id=3107778766090269290]
null_resource.second:正在创建。。。
null_resource.second:使用“本地执行器”进行设置。。。
null_resource.second(本地执行):执行:[“/bin/sh”“-c”“echo'second'>>first”]
null_resource.second:0秒后创建完成[id=3159896803213063900]
null_resource.third:正在创建。。。
null_resource.third:使用“本地执行器”进行设置。。。
null_resource.third(本地执行):执行:[“/bin/sh”“-c”“echo'third'>>first”]
null_resource.third:0秒后创建完成[id=6959717123480445161]
应用完成!资源:添加3个,更改0个,销毁0个。
为了确保这一点,对新文件进行cat,这里是预期的输出

$cat优先
第一
第二
第三

因此,您可以将您的令牌添加到null\u资源1中的领事,然后在null\u资源2中检索它。并且您可以使null\u资源2依赖于null\u资源1。