如何使用Terraform配置启动远程服务?

时间:2016-03-24 18:43:28

标签: terraform gnu-screen nohup

我希望我的Terraform配置通过调用命令来配置服务器并在最后启动服务并继续运行它。我尝试使用no-up和屏幕使用remote-exec:

nohup的:

provisioner "remote-exec" {
 inline = "nohup sudo command &"
}

屏幕:

provisioner "remote-exec" {
 inline = "screen -d -m sudo command"
}

我通过手动登录来检查命令是否正在运行。但他们没有保持流程运行。如果我手动尝试这些命令并使用ssh调用它们也可以正常工作。

如何在返回控制流时使用Terraform配置来启动命令并使其保持运行?

2 个答案:

答案 0 :(得分:21)

尝试在nohup后添加睡眠。为我工作。我怀疑在你的最后一个远程执行官的背景下让Terraform在子进程有机会启动之前关闭了连接,尽管没有nohup。

provisioner "remote-exec" {
    inline = [
        "nohup sudo command &",
        "sleep 1"
    ]
}

答案 1 :(得分:0)

对此更有效的解决方案是启动运行您的流程的服务。

这意味着初始化系统可以控制该过程,并在必要时重新启动它。它还获得了现代init系统的其他好处,例如处理依赖关系排序(确保其他服务在该服务启动之前就已运行)和诸如日志之类的东西。

如果您将服务设置为在引导时启动,则可以避免也必须通过SSH连接到服务器,这可能意味着服务器将可以承受重新引导而无需重新配置。

对于Systemd来说,这意味着创建一个unit file,该过程可能如下所示:

[Unit]
Description=foo

[Service]
ExecStart=command
Restart=always

[Install]
WantedBy=multi-user.target

然后运行以下命令将确保command在引导时自动运行,并且该过程的任何失败都将导致该过程自动重新启动:

systemctl enable foo.service
systemctl start foo.service

在使用诸如AWS' autoscaling groups之类的机制来供应实例时,这一点变得尤为重要。通过aws_autoscaling_group resource创建自动伸缩组时,您无法轻松地连接到当时创建的实例,并且无法控制连接到实例的权限,因为该组向外扩展或替换实例。此时,很重要的一点是,实例能够完全从基础映像本身(可以使用Packer之类的工具创建)或通过在首次引导时自动运行的用户数据脚本进行自我配置。 / p>