Terraform如何通过条件控制脚本仅在指定EC2节点执行?
Terraform null_resource按节点条件执行的count参数设置
需求说明
- 三种执行场景:
- 在所有节点执行:同时开启
run_on_THIS_node和run_on_THAT_node - 仅在THIS节点执行:仅开启
run_on_THIS_node - 仅在THAT节点执行:仅开启
run_on_THAT_node
- 在所有节点执行:同时开启
- 通过
null_resource的count参数控制是否创建资源(即是否执行脚本)
现有资源与变量定义
现有null_resource代码
resource "null_resource" "generic_script" { connection { type = "ssh" user = "ubuntu" private_key = file(var.ssh_key_file) host = var.ec2_pub_ip } provisioner "file" { source = "../modules/k8s_installer/${var.shell_script}" destination = "/tmp/${var.shell_script}" } provisioner "remote-exec" { inline = [ "sudo chmod u+x /tmp/${var.shell_script}", "sudo /tmp/${var.shell_script}" ] } }
变量定义
variable "run_on_THIS_node" { type = boolean description = "Run script on THIS node" default = false } variable "run_on_THAT_node" { type = boolean description = "Run script on THAT node" default = false }
解决方案:设置count参数
通过判断两个布尔变量的逻辑或结果,控制是否创建null_resource:
- 当任意一个变量为
true时,count=1(执行脚本) - 当两个变量都为
false时,count=0(不执行脚本)
修改后的资源代码
resource "null_resource" "generic_script" { # 两种等价写法任选其一 count = toint(var.run_on_THIS_node || var.run_on_THAT_node) # count = var.run_on_THIS_node || var.run_on_THAT_node ? 1 : 0 connection { type = "ssh" user = "ubuntu" private_key = file(var.ssh_key_file) host = var.ec2_pub_ip } provisioner "file" { source = "../modules/k8s_installer/${var.shell_script}" destination = "/tmp/${var.shell_script}" } provisioner "remote-exec" { inline = [ "sudo chmod u+x /tmp/${var.shell_script}", "sudo /tmp/${var.shell_script}" ] } }
场景对应变量设置
| 执行场景 | run_on_THIS_node | run_on_THAT_node | 效果 |
|---|---|---|---|
| 仅在THIS节点执行 | true | false | 仅THIS节点的脚本执行 |
| 仅在THAT节点执行 | false | true | 仅THAT节点的脚本执行 |
| 在所有节点执行 | true | true | 所有节点的脚本都执行 |
| 不执行脚本 | false | false | 无节点执行脚本 |
说明
该通用脚本需为每个节点单独实例化(比如通过模块调用),每个实例传入对应节点的ec2_pub_ip,通过控制每个实例的变量值实现不同执行场景。
内容的提问来源于stack exchange,提问作者Chris F
相关产品推荐
相关产品推荐

