我希望在AWS EMR的Terrafrom模块内执行一个外壳文件,并将该文件传递给bootstrap操作。但是文件未加载。
调用文件的代码块在此处的main.tf文件中-
id
main.tf与“文件”目录位于同一级别。
错误消息是-
bootstrap_action {
path = "${file("files/emr_bootstrap.sh")}"
name = "emr_bootstrap"
}
任何想法/指针将不胜感激。
谢谢HenryTK。我也尝试了此尝试,但没有成功,因此我认为问题在于该文件实际上在目标位置不存在。为了克服bootstrap_action块之前的问题,添加了一个文件复制块,如此处所示-
ValidationException: Invalid bootstrap action path, must be a location in Amazon S3 or a local path starting with 'file:'.
即使使用此文件配置程序,shell脚本也不会得到执行,这意味着bootstrap_action并未找到shell脚本。
答案 0 :(得分:0)
使用神奇的path.module
插值法[1]。
bootstrap_action {
path = "${file("${path.module}/files/emr_bootstrap.sh")}"
name = "emr_bootstrap"
}
[1] https://www.terraform.io/docs/configuration-0-11/interpolation.html
答案 1 :(得分:0)
因此对于s3,您可以这样做:
bootstrap_action {
path = "s3://${var.bucket_name}/bootstrap/configure-system.sh"
name = "configure_system"
}
我会在本地猜测您会想要的:
bootstrap_action {
path = "file://<path>"
name = "configure_system"
}
让我知道这是否有帮助
答案 2 :(得分:0)
bootstrap_action
中引用的脚本应该保存在 S3 上,或者是本地集群中的实例,而不是 Terraform 的本地文件系统。
这样你就可以使用类似下面的代码片段,但显然不能以这种方式上传本地脚本:
bootstrap_action {
name = "openjdk11"
path = "file:/usr/bin/sudo"
args = ["amazon-linux-extras", "install", "java-openjdk11", "-y"]
}
除了 Github 上的一个示例外,我找不到任何对此的引用,但您可以自己轻松验证行为。
至于您为 Terraform 提供脚本的最初意图,您可能需要以某种不同的方式将其上传到 S3,或者如果它是单行的,则将其包装为上述单个命令。
答案 3 :(得分:0)
我能够将文件复制到主节点并在创建集群后在那里执行。也可以是核心实例。不确定它是否可以称为引导操作...
resource "null_resource" "your_action_name" {
triggers = {
private_ip = data.aws_instance.master.private_ip
}
connection {
type = "ssh"
user = "ec2-user"
host = data.aws_instance.master.private_ip
}
provisioner "file" {
when = create
source = "${path.module}/emr_bootstrap.sh"
destination = "/tmp/emr_bootstrap.sh"
}
provisioner "remote-exec" {
when = create
inline = [
"chmod +x /tmp/emr_bootstrap.sh",
"/tmp/emr_bootstrap.sh"
]
}
}
如果需要,添加适当的 ssh 身份验证。
在data.tf中你需要添加:
data "aws_instance" "master" {
filter {
name = "dns-name"
values = aws_emr_cluster.your_clister_name.*.master_public_dns
}
}