【问题标题】:How do i bootstrap ec2 instance with an external script file in terraform?如何使用 terraform 中的外部脚本文件引导 ec2 实例?
【发布时间】:2020-08-02 06:22:20
【问题描述】:

你们中的任何人都可以帮助我使用 terraform 中的以下代码吗?我正在尝试使用外部脚本文件引导亚马逊 linux ec2 实例。外部脚本在 ec2 实例上安装 tomcat。 以下代码无法在 ec2 上部署 tomcat。

终端代码:

data "template_file" "ec2_user_data" {
  template = "${file("${path.cwd}/user_data_tomcat.txt")}"
}

resource "aws_instance" "lab_ec1" {
  ami = "ami-009d6802948d06e52"
  instance_type = "t2.micro"
  key_name = "lab_keypair_1"
  #key_name = "${aws_key_pair.lab_key_pair.name}"
  subnet_id = "${aws_subnet.lab_subnet1.id}"
  vpc_security_group_ids = [
      "${aws_security_group.lab_bastion_sg.id}",
  ]
  associate_public_ip_address = true
  user_data = "${data.template_file.ec2_user_data.template}"

  tags = {
    Name = "lab_ec1"
  }
}

外部脚本文件:user_data_tomcat.txt

#!/bin/bash
sudo yum -y install tomcat.noarch
sudo yum -y install tomcat-admin-webapps.noarch
sudo yum -y install tomcat-webapps.noarch
sudo yum -y install tomcat-lib.noarch
sudo service tomcat start

如何在 terraform 中使用外部脚本文件引导 ec2 实例?

【问题讨论】:

  • "下面的代码不起作用。还有什么遗漏吗?"数据“模板文件”“ec2_user_data”{模板=“${file(“user_data_tomcat.txt”)}“}资源“aws_instance”“lab_ec1”{ami =“ami-009d6802948d06e52”instance_type =“t2.micro”key_name =“lab_keypair_1 " #key_name = "${aws_key_pair.lab_key_pair.name}" subnet_id = "${aws_subnet.lab_subnet1.id}" vpc_security_group_ids = [ "${aws_security_group.lab_bastion_sg.id}", ] associate_public_ip_address = true user_data = "${data .template_file.ec2_user_data.rendered}" 标签 = { 名称 = "lab_ec1" } }

标签: terraform-provider-aws terraform-template-file


【解决方案1】:

看起来以下变量不正确:

user_data = "${data.template_file.ec2_user_data.template}"

您应该使用rendered 属性而不是template,如以下链接所述:https://www.terraform.io/docs/providers/template/d/file.html#rendered

【讨论】:

  • tpl 命名不是标准。我会删除该声明。
  • 感谢您指出这一点,很抱歉这实际上是我的困惑。事实上,我认为这是一个 Terraform 标准,但经过一些研究我发现它不是,所以我删除了我的声明。但是我仍然相信.tpl as template.txt 更明确/相关 ^^
  • user_data = "${data.template_file.ec2_user_data.rendered}" 也不起作用
【解决方案2】:

您必须验证登录系统、成为 root 并运行它才能启动 Tomcat:

#!/bin/bash
sudo yum -y install tomcat.noarch
sudo yum -y install tomcat-admin-webapps.noarch
sudo yum -y install tomcat-webapps.noarch
sudo yum -y install tomcat-lib.noarch
sudo service tomcat start

如果不是,它也不能作为 user_data 工作。请务必先以交互方式验证它,然后再将其作为 user_data 进行尝试。

确保 template_file.ec2_user_data 资源的 template 中使用的 file 路径正确。我已将您问题中的 sn-p 修改为使用 path.module (相对于 TF 文件)而不是 path.cwd (相对于 terraform 命令所在的目录运行)

data "template_file" "ec2_user_data" {
  template = "${file("${path.module}/user_data_tomcat.txt")}"
}

确保文件 user_data_tomcat.txt 与声明 template_file.ec2_user_data 的 TF 文件位于同一目录中。

您在 user_data 中使用了 模板,如下所示:

user_data = "${data.template_file.ec2_user_data.template}"

template 将获得原始模板文件的内部编码版本,而无需替换变量。模板中没有变量,因此很可能是文本编码导致它失败。根据我的经验,将其作为 user_data 发送永远不会起作用,因为使用的文本编码与 cloud-init 或 bash 交互不良。您可以检查 /var/log/cloud-init-output.log 以获取失败的证据。

相反,您应该像这样在 user_data 中使用 rendered

user_data = "${data.template_file.ec2_user_data.template}"

这是完整的、更正的资源块:

resource "aws_instance" "lab_ec1" {
  ami = "ami-009d6802948d06e52"
  instance_type = "t2.micro"
  key_name = "lab_keypair_1"
  #key_name = "${aws_key_pair.lab_key_pair.name}"
  subnet_id = "${aws_subnet.lab_subnet1.id}"
  vpc_security_group_ids = [
      "${aws_security_group.lab_bastion_sg.id}",
  ]
  associate_public_ip_address = true
  user_data = "${data.template_file.ec2_user_data.rendered}"

  tags = {
    Name = "lab_ec1"
  }
}

【讨论】:

  • "下面的代码不起作用。还有什么遗漏吗?"数据“模板文件”“ec2_user_data”{模板=“${file(“user_data_tomcat.txt”)}“}资源“aws_instance”“lab_ec1”{ami =“ami-009d6802948d06e52”instance_type =“t2.micro”key_name =“lab_keypair_1 " subnet_id = "${aws_subnet.lab_subnet1.id}" vpc_security_group_ids = [ "${aws_security_group.lab_bastion_sg.id}", ] associate_public_ip_address = true user_data = "${data.template_file.ec2_user_data.rendered}" 标签 = { 名称 = “实验室_ec1”}}
  • 我没有建议该代码,并且 template_filetemplate 中使用的 file 具有不同的路径> 资源。您收到什么错误消息?
  • @devopseng 我已经修改了我的答案,以便为 template_file 路径提供额外的故障排除指导。希望这就是我们所缺少的。
【解决方案3】:

您可以使用 remote-exec 配置器,但在这种情况下,我建议您使用 userdata https://www.terraform.io/docs/providers/aws/r/instance.html#user_data

user_data = "${data.template_file.ec2_user_data.rendered}"

【讨论】:

  • user_data = "${data.template_file.ec2_user_data.rendered}" 不起作用。
猜你喜欢
  • 1970-01-01
  • 2018-03-30
  • 2021-06-03
  • 2021-05-31
  • 1970-01-01
  • 2021-12-08
  • 2021-07-11
  • 1970-01-01
  • 2020-11-10
相关资源
最近更新 更多