【问题标题】:terraform depends_on for provisioner fileterraform depends_on 用于配置文件
【发布时间】:2018-01-11 15:06:17
【问题描述】:

我希望在将配置器“文件”(基本上是 ansible playbook)复制到 ec2 实例后执行以下 terraform 代码中的数据“模板文件”。在这种情况下,我无法成功使用“depends_on”。有人可以帮助我如何实现这一目标吗?下面是示例代码sn-p。

resource "aws_eip" "opendj-source-ami-eip" {
  instance = "${aws_instance.opendj-source-ami-server.id}"
  vpc = true
  connection {
    host = "${aws_eip.opendj-source-ami-eip.public_ip}"
    user                = "ubuntu"
    timeout = "3m"
    agent = false
    private_key         = "${file(var.private_key)}"
  }
  provisioner "file" {
    source      = "./${var.copy_password_file}"
    destination = "/home/ubuntu/${var.copy_password_file}"
  }
  provisioner "file" {
    source      = "./${var.ansible_playbook}"
    destination = "/home/ubuntu/${var.ansible_playbook}"
  }
}

data "template_file" "run-ansible-playbooks" {
  template =  <<-EOF
              #!/bin/bash
              ansible-playbook /home/ubuntu/${var.copy_password_file} && ansible-playbook /home/ubuntu/${var.ansible_playbook}
              EOF
  #depends_on = ["<< not sure what to put here>>"]
}

【问题讨论】:

  • 您的 template_file 块似乎实际上并不依赖于配置器的结果,所以我不确定您为什么要推迟渲染它直到配置器完成。您的目标是通过 SSH 到远程主机执行该模板生成的脚本吗?
  • 好吧,我将脚本作为 cloud-init 添加到 ec2 实例用户数据中,以便在 ec2 实例出现时执行它们。 resource "aws_instance" "opendj-source-ami-server" { ..... user_data = "${data.template_file.run-ansible-playbooks.rendered}" .... } 只是有时它会抱怨找不到脚本失败,我猜肯定是它失败了 catch22 的情况..
  • template_file 数据源没有任何副作用,因此其自己的 渲染不会因缺少脚本而失败。您的示例中没有任何内容真正运行该脚本,但我假设您的配置中有其他东西正在运行它。
  • 使错误可搜索:Invalid depends_on referenceReferences in depends_on must be to a whole object (resource, etc), not to an attribute of an object。当您使用 depends_on=resource.aws_lambda_function.func_name 之类的内容时会出现错误。请改用depends_on=aws_lambda_function.func_name

标签: amazon-web-services terraform


【解决方案1】:

depends_on 的正确格式与整个资源挂钩;所以在你的情况下的格式看起来像:

data "template_file" "run-ansible-playbooks" {
  template =  <<-EOF
              #!/bin/bash
              ansible-playbook /home/ubuntu/${var.copy_password_file} && ansible-playbook /home/ubuntu/${var.ansible_playbook}
              EOF
  depends_on = ["aws_eip.opendj-source-ami-eip"]
}

【讨论】:

  • 感谢@TJ Biddle 的回复。我确实尝试过,但 tf 开始失败并出现以下错误:Error ask for user input: 1 error(s) occurred: * Cycle: module.vpc.data.template_file.run-ansible- playbooks、module.vpc.aws_instance.opendj-source-ami-server、module.vpc.aws_eip.opendj-source-ami-eip还有其他建议吗?
猜你喜欢
  • 2020-05-30
  • 2021-08-18
  • 2023-01-24
  • 2020-12-31
  • 1970-01-01
  • 2020-06-02
  • 1970-01-01
  • 2022-10-07
  • 2021-09-25
相关资源
最近更新 更多