terraform 在实例中执行 bash 脚本

terraform 在实例中执行 bash 脚本

当 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 的命令。

https://www.terraform.io/docs/provisioners/remote-exec.html

答案3

要验证渲染脚本的内容,您有几种可能的方法:

  • 运行 terraform plan 并验证输出
  • 从 EC2 控制台检查用户数据
  • 例如使用带有 local-exec 配置器的 null_ressource,它使用 echo 或 cat 等输出渲染的模板。

相关内容