我希望我的Terraform配置通过调用命令来配置服务器并在最后启动服务并继续运行它。我尝试使用no-up和屏幕使用remote-exec:
nohup的:
provisioner "remote-exec" {
inline = "nohup sudo command &"
}
屏幕:
provisioner "remote-exec" {
inline = "screen -d -m sudo command"
}
我通过手动登录来检查命令是否正在运行。但他们没有保持流程运行。如果我手动尝试这些命令并使用ssh调用它们也可以正常工作。
如何在返回控制流时使用Terraform配置来启动命令并使其保持运行?
答案 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>