你们中的任何人都可以在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
似乎以下变量不正确:
user_data = "${data.template_file.ec2_user_data.template}"
您应该使用rendered
属性而不是template
,如以下链接中所述:https://www.terraform.io/docs/providers/template/d/file.html#rendered
您必须验证登录系统,成为超级用户并运行该程序才能启动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"
}
}
您可以使用remote-exec提供者,但是在这种情况下,我建议您使用userdata https://www.terraform.io/docs/providers/aws/r/instance.html#user_data
user_data = "${data.template_file.ec2_user_data.rendered}"