【问题标题】:How to reduce boilerplate provisioning in modules?如何减少模块中的样板配置?
【发布时间】:2018-09-16 14:59:03
【问题描述】:

所以我有两个完全相同的 terraform 模块...例外是有一个额外的远程执行步骤

模块 A

  provisioner "remote-exec" {
    inline = [
      "sudo chmod 777 -R ${var.setup_files_destination}",
      "sudo ${var.setup_files_destination}/scripts/setup.sh ${var.setup_files_destination}",
    ]

    connection {
      user        = "ec2-user"
      private_key = "${file(var.private_key_location)}"
    }
  }

模块 B - 不同之处是要执行一个额外的脚本

  provisioner "remote-exec" {
    inline = [
      "sudo chmod 777 -R ${var.setup_files_destination}",
      "sudo ${var.setup_files_destination}/scripts/setup.sh ${var.setup_files_destination}",
    ]

    connection {
      user        = "ec2-user"
      private_key = "${file(var.private_key_location)}"
    }
  }

  provisioner "remote-exec" {
    inline = [
      "sudo chmod 777 -R ${var.setup_files_destination}",
      "${var.setup_files_destination}/scripts/setup_special.sh ${var.setup_files_destination}",
    ]

    connection {
      user        = "ec2-user"
      private_key = "${file(var.private_key_location)}"
    }
  }

除了这个脚本差异之外,模块具有完全相同的步骤。重复的 terraform 代码量约为 50 行。

我想在 Terraform 中做什么

所以在 Terraform 方面,我想指定要作为列表执行的脚本,比如

变量

variable "commands_to_execute" {
  type = "list"
}

常用步骤

provisioner "remote-exec" {
  inline = "[${var.commands_to_execute}]"

  connection {
    user        = "ec2-user"
    private_key = "${file(var.private_key_location)}"
  }
}

常用步骤的感知使用

module "instances" {
  ... rest of declaration...
  commands_to_execute = [
    "sudo chmod 777 -R ${var.setup_files_destination}",
    "sudo ${var.setup_files_destination}/scripts/setup.sh ${var.setup_files_destination}",
  ]
}

当我运行它时,我得到了

错误:模块“实例”:引用的未知变量:“setup_files_destination”;用“变量”块定义它

所以setup_files_destination 是在模块内部定义的变量,而不是在使用模块的.tf 文件中。它有一个默认值,实际上是远程实例上 shell 脚本目录的位置。

我想在模块中保留setup_files_destination。所以我寻找的是一种将变量的插值推迟到实际使用模块的方法这在 terraform 中可行吗?

【问题讨论】:

    标签: amazon-web-services terraform terraform-provider-aws


    【解决方案1】:

    不可能按照您尝试的方式推迟插值,您可能可以使用null_resource 和计数来实现您想要做的事情。这只会在您在模块初始化中定义变量run_additional_setup = true 时运行脚本

    示例:

    resource "null_resource" "additional_setup" {
      count      = "${var.run_additional_setup == true ? 1 : 0}"
      depends_on = ["aws_instance.my_instance"]
    
      connection {
        user        = "ec2-user"
        private_key = "${file(var.private_key_location)}"
      }
    
      provisioner "remote-exec" {
        inline = [
          "sudo chmod 777 -R ${var.setup_files_destination}",
          "${var.setup_files_destination}/scripts/setup_special.sh ${var.setup_files_destination}",
        ]
      }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-23
      • 1970-01-01
      • 2016-09-22
      • 2019-09-30
      相关资源
      最近更新 更多