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

问题描述 投票:1回答:3

你们中的任何人都可以在terraform中提供以下代码来帮助我吗?我正在尝试使用外部脚本文件来引导Amazon Linux EC2实例。外部脚本将tomcat安装在ec2实例上。以下代码无法在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-provider-aws terraform-template-file
3个回答
1
投票

似乎以下变量不正确:

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

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


0
投票

您必须验证登录系统,成为超级用户并运行该程序才能启动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

进行操作之前,请确保首先进行交互式验证。

您已在user_data中使用template,如下所示:

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"
  }
}

-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}"
© www.soinside.com 2019 - 2024. All rights reserved.