1

你们中的任何人都可以帮助我使用 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 实例?

4

3 回答 3

1

看起来以下变量不正确:

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

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

于 2020-04-20T02:47:25.260 回答
0

您必须验证登录到系统、成为 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资源的模板中使用的文件的路径正确。我已经修改了您问题的片段以使用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 中使用渲染:

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"
  }
}
于 2020-04-20T11:33:16.597 回答
-1

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

user_data = "${data.template_file.ec2_user_data.rendered}"
于 2020-04-20T01:56:42.043 回答