【发布时间】: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 reference、References 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