Terraform 可以通过 remote_exec 命令设置变量吗?
Can Terraform set a variable from a remote_exec command?
我正在尝试使用 Terraform 在 AWS 中构建 Docker Swarm 集群。我已经成功启动了 Swarm 管理器,但我正在尝试找出如何最好地将连接密钥传递给工作人员(将在管理器之后创建)。
我想要 运行 可以设置为 Terraform 变量的 docker swarm join-token worker -q
命令的某种方式。这样,工作人员可以有一个 remote_exec 命令,比如 docker swarm join ${var.swarm_token} ${aws_instance.swarm-manager.private_ip}
我该怎么做?
我的配置如下:
resource "aws_instance" "swarm-manager" {
ami = "${var.manager_ami}"
instance_type = "${var.manager_instance}"
tags = {
Name = "swarm-manager${count.index + 1}"
}
provisioner "remote-exec" {
inline = [
"sleep 30",
"docker swarm init --advertise-addr ${aws_instance.swarm-manager.private_ip}"
"docker swarm join-token worker -q" // This is the value I want to store as a variable/output/etc
]
}
}
谢谢
您可以使用 external data source 作为远程配置脚本的补充。
这可以 shell 进入您的群管理器并在配置后获取令牌。
如果您有 N 个 swarm 管理器,您可能必须在创建管理器后一次完成所有操作。外部数据源 return 纯字符串映射,因此需要使用使您能够 select 每个节点的正确结果的键,或者 return 整个集合作为分隔字符串,并且使用 element()
和 split()
得到正确的项目。
resource "aws_instance" "swarm_manager" {
ami = "${var.manager_ami}"
instance_type = "${var.manager_instance}"
tags = {
Name = "swarm-manager${count.index + 1}"
}
provisioner "remote-exec" {
inline = [
"sleep 30",
"docker swarm init --advertise-addr ${aws_instance.swarm-manager.private_ip}"
]
}
}
data "external" "swarm_token" {
program = ["bash", "${path.module}/get_swarm_tokens.sh"]
query = {
swarms = ["${aws_instance.swarm_manager.*.private_ip}"]
}
}
resource "aws_instance" "swarm_node" {
count = "${var.swarm_size}"
ami = "${var.node_ami}"
tags = {
Name = "swarm-node-${count.index}"
}
provisioner "remote-exec" {
inline = [
"# Enrol me in the right swarm, distributed over swarms available",
"./enrol.sh ${element(split("|", data.swarm_token.result.tokens), count.index)}"
]
}
}
我正在尝试使用 Terraform 在 AWS 中构建 Docker Swarm 集群。我已经成功启动了 Swarm 管理器,但我正在尝试找出如何最好地将连接密钥传递给工作人员(将在管理器之后创建)。
我想要 运行 可以设置为 Terraform 变量的 docker swarm join-token worker -q
命令的某种方式。这样,工作人员可以有一个 remote_exec 命令,比如 docker swarm join ${var.swarm_token} ${aws_instance.swarm-manager.private_ip}
我该怎么做?
我的配置如下:
resource "aws_instance" "swarm-manager" {
ami = "${var.manager_ami}"
instance_type = "${var.manager_instance}"
tags = {
Name = "swarm-manager${count.index + 1}"
}
provisioner "remote-exec" {
inline = [
"sleep 30",
"docker swarm init --advertise-addr ${aws_instance.swarm-manager.private_ip}"
"docker swarm join-token worker -q" // This is the value I want to store as a variable/output/etc
]
}
}
谢谢
您可以使用 external data source 作为远程配置脚本的补充。
这可以 shell 进入您的群管理器并在配置后获取令牌。
如果您有 N 个 swarm 管理器,您可能必须在创建管理器后一次完成所有操作。外部数据源 return 纯字符串映射,因此需要使用使您能够 select 每个节点的正确结果的键,或者 return 整个集合作为分隔字符串,并且使用 element()
和 split()
得到正确的项目。
resource "aws_instance" "swarm_manager" {
ami = "${var.manager_ami}"
instance_type = "${var.manager_instance}"
tags = {
Name = "swarm-manager${count.index + 1}"
}
provisioner "remote-exec" {
inline = [
"sleep 30",
"docker swarm init --advertise-addr ${aws_instance.swarm-manager.private_ip}"
]
}
}
data "external" "swarm_token" {
program = ["bash", "${path.module}/get_swarm_tokens.sh"]
query = {
swarms = ["${aws_instance.swarm_manager.*.private_ip}"]
}
}
resource "aws_instance" "swarm_node" {
count = "${var.swarm_size}"
ami = "${var.node_ami}"
tags = {
Name = "swarm-node-${count.index}"
}
provisioner "remote-exec" {
inline = [
"# Enrol me in the right swarm, distributed over swarms available",
"./enrol.sh ${element(split("|", data.swarm_token.result.tokens), count.index)}"
]
}
}