当 terraform 正在构建资源时,如何在 ec2 实例中执行 sh 脚本?我创建了一个 ami,其中包含目录中的一些文件以供执行,如果我通过 ssh 进入,我可以按如下方式执行文件:
sh /home/resources/wso/bin/wso.sh
我有一个包含以下内容的 start.tpl 文件:
#!/bin/bash
# update ubuntu
sudo apt-get update
# install nginx
sudo apt-get install nginx -y
sudo service nginx start
#start wso2
sh /home/resources/wso/bin/wso.sh
在我的 main.tf 中我有这个:
data "template_file" "start" {
template = "${file("start.tpl")}"
}
resource "aws_instance" "wnginx" {
ami = "${var.instance_ami}"
instance_type = "${var.instance_type}"
user_data = "${data.template_file.start.rendered}"
}
Nginx启动良好,但是我的启动脚本wso.sh无法启动。
是否存在一些用于调试我的 start.tpl 的 terraform 配置?
答案1
您使用用户数据的方式不正确。请参阅cloud-init 文档。
你的模板应该包含如下内容(YAML 格式):
#cloud-config
write_files:
- path: /home/resources/wso/bin/wso.sh
content: |
#!/bin/bash
# update ubuntu
sudo apt-get update
# install nginx
sudo apt-get install nginx -y
sudo service nginx start
runcmd:
- ["sh", "/home/resources/wso/bin/wso.sh"]
由于这可以通过很少的努力来改进,我建议使用它作为模板:
#cloud-config
packages:
- nginx
package_update: true
runcmd:
- [systemctl, daemon-reload]
- [systemctl, enable, nginx]
- [systemctl, start, nginx]
它将实现与您的脚本相同的功能,但使用提供的系统来配置机器,并且还消除了维护您自己的 AMI 的需要,因为您只需通过用户数据应用 cloud-init 配置并依赖 Debian/Ubuntu 映像即可。
如果这不起作用,您可以验证/var/log/cloud-init.log
。由于文件格式是 YAML,请注意使用不正确的缩进可能会破坏它。
答案2
这似乎与 terraform 无关。用户数据机制是 EC2 函数。要调试用户数据,您可以检查/var/log/
并查找名为 的文件cloud-init
。在基于 CentOS/AWS 的图像上至少有一个名为 的文件,cloud-init-output
它确实包含用户数据脚本的 stdout/stderr。
另一种方法是使用 terraforms remote-exec provisioner,它允许在远程机器上执行来自 terraform 的命令。
答案3
要验证渲染脚本的内容,您有几种可能的方法:
- 运行 terraform plan 并验证输出
- 从 EC2 控制台检查用户数据
- 例如使用带有 local-exec 配置器的 null_ressource,它使用 echo 或 cat 等输出渲染的模板。