我想设置一个 Vagrant 配置来创建和启动一个 Ubuntu 客户虚拟机,它将supervisord
在虚拟机内启动一项服务Vagrant up
。我希望它能在 Windows、Mac 和 Linux 主机上运行。
我有一个supervisord.conf
文件,在配置期间将其复制到虚拟机中(首先复制到用户空间,然后复制/etc/supervisor/
到这个答案)。此配置文件包含以下几行,以在端口 9001 上提供 GUI 界面(此端口转发到主机):
[inet_http_server]
port=9001
但是,如果我在 Vagrant 配置脚本中发出类似这样的命令,service supervisor start
则无法正确获取此配置。我可以通过 ssh 进入虚拟机并验证主管服务是否正在运行,但端口 9001 上没有 GUI。如果我使用 ssh 重新启动服务,则 GUI 在重新启动后可用。
重新启动服务会导致它获取我的配置,这让我认为服务首次启动时配置以某种方式不可用。
这个答案似乎解决了类似的问题。所以我也尝试将文件复制到/etc/init/supervisor.conf
:
# start supervisord on vagrant mounted
start on vagrant-mounted
exec service supervisor restart
这将导致 upstart 在收到事件时重新启动服务vagrant-mounted
。但是,即使这样,supervisor 似乎也没有正确启动。
我通过发出来测试了这个 upstart 脚本sudo initctl emit vagrant-mounted
,并观察到主管服务重新启动,并且 GUI 在 9001 上可用。
这使我认为该vagrant-mounted
事件可能发生在运行配置脚本之前。
有人知道我是否可以根据其他事件预测我的 upstart 脚本吗?当 vagrant 配置完成时会发出什么事件?
另外,有没有更好或更规范的方法在 vagrant VM 中启动服务?这一切感觉就像我掉进了兔子洞,错过了一些非常明显的东西。
答案1
好的,这个帖子让我知道我可以在 Vagrantfile 中发出我想要的任何 upstart 事件作为最后一步:
Vagrant.configure(2) do |config|
config.vm.provision :file do |file|
file.source = "./conf/vagrant-ready.conf"
file.destination = "vagrant-ready.conf"
end
config.vm.provision :shell, path: "provision.sh"
config.vm.provision :shell, :inline => "sudo initctl emit vagrant-ready"
end
我可以通过以下事件触发重新启动supervisord服务vagrant-ready
:
# start supervisord on vagrant mounted
start on vagrant-ready
exec service supervisor restart
我的配置脚本是:
#!/bin/bash
apt-get update
apt-get install -y supervisor
mv /home/vagrant/supervisord.conf /etc/supervisor/
mv /home/vagrant/vagrant-ready.conf /etc/init/
supervisord.conf
此设置可确保文件到位后,supervisord 服务重新启动。这样,我的配置就正确加载了。