每次来宾重启后 Vagrant 执行脚本或命令(vagrant up)
Vagrant execute script or command after every guest restart (vagrant up)
我知道配置脚本,但我问的是另一个脚本。我希望每次重新启动来宾后都执行一个脚本。
我正在使用 shell 配置器。
config.vm.provision :shell, path: "vagrant/bootstrap.sh"
我无法在每次重新启动后 运行 将我的命令放入此脚本中。
基本上,我希望我的应用程序之一在用户执行 vagrant up
时启动。
我的客人是 ubuntu 14.04 值得信赖的,我发现的一个解决方案是对我的客人进行以下操作 -
sudo crontab -e
#add the following line
@reboot sh /path/to/my_script_on_guest.sh
我可以尝试在我的配置脚本中执行此操作,但 sudo crontab -e
需要一个编辑器,我必须以交互方式添加该行。由于 crontab 文件未修复,我不知道是否可以像
那样进行一个线性文件编辑
echo '@reboot sh /path/to/my_script_on_guest.sh' >> crontab_file
我猜这一定是客人 OS 特有的东西。
这可以使用 Vagrant 实现吗?
编辑:从 ssh provisioner 更正为 shell provisioner。
你可以使用run: 'always'
config.vm.provision :shell, path: "vagrant/bootstrap.sh", run: 'always'
这将确保每次启动 VM(vagrant up 或 vagrant reload)时执行您的命令
如果你只需要某些命令总是运行,你可以拆分你的脚本
config.vm.provision :shell, path: "vagrant/bootstrap1.sh"
config.vm.provision :shell, path: "vagrant/bootstrap2.sh", run: 'always'
config.vm.provision :shell, path: "vagrant/bootstrap3.sh"
脚本将按顺序 运行,bootstrap1 然后 2 然后 3 当机器首次配置时
任何时候你 运行 vagrant up
(或重新加载)只有 bootstrap2 将是 运行
这里只是提供一个对我有用的替代方案,使用 vagrant triggers。直接从他们的文档中考虑这个例子:
运行 销毁来宾之前在主机上保存数据库的远程脚本:
Vagrant.configure("2") do |config|
config.vm.define "ubuntu" do |ubuntu|
ubuntu.vm.box = "ubuntu"
ubuntu.trigger.before :destroy do |trigger|
trigger.warn = "Dumping database to /vagrant/outfile"
trigger.run_remote = {inline: "pg_dump dbname > /vagrant/outfile"}
# or trigger.run = {...} to run the command on the host instead
# of guest
end
end
end
还有相关的vagrant-triggers plugin你可以看看
我用的是 ubuntu 18.04。触发器对我不起作用,所以我选择将 post-provision 脚本复制到虚拟机框,然后从主脚本执行所需的 post-provision:
config.trigger.before :provisioner_run, type: :hook do |t|
t.info = "Before the provision!"
end
config.vm.provision "shell" do |s|
s.inline = "echo "
s.args = [" '--->' Provisioning the environment!"]
end
config.vm.provision "file", source: "scripts/post-provision/.", destination: "/home/vagrant"
config.vm.provision "shell", path: "scripts/install.sh"
# config.vm.provision "shell", path: "scripts/bootstrap.sh", run: 'always'
# config.trigger.after :up do |trigger|
# trigger.info = "Installing Monitoring Stack..."
# trigger.run_remote = {path: "./install-monitor-stack.sh"}
# end
end
主脚本内容使用 exec 刷新新的 shell。您也可以使用
reset
sudo chmod +x *.sh
exec /home/vagrant/install-monitor-stack.sh
exec /home/vagrant/bootstrap.sh
我知道配置脚本,但我问的是另一个脚本。我希望每次重新启动来宾后都执行一个脚本。
我正在使用 shell 配置器。
config.vm.provision :shell, path: "vagrant/bootstrap.sh"
我无法在每次重新启动后 运行 将我的命令放入此脚本中。
基本上,我希望我的应用程序之一在用户执行 vagrant up
时启动。
我的客人是 ubuntu 14.04 值得信赖的,我发现的一个解决方案是对我的客人进行以下操作 -
sudo crontab -e
#add the following line
@reboot sh /path/to/my_script_on_guest.sh
我可以尝试在我的配置脚本中执行此操作,但 sudo crontab -e
需要一个编辑器,我必须以交互方式添加该行。由于 crontab 文件未修复,我不知道是否可以像
echo '@reboot sh /path/to/my_script_on_guest.sh' >> crontab_file
我猜这一定是客人 OS 特有的东西。
这可以使用 Vagrant 实现吗?
编辑:从 ssh provisioner 更正为 shell provisioner。
你可以使用run: 'always'
config.vm.provision :shell, path: "vagrant/bootstrap.sh", run: 'always'
这将确保每次启动 VM(vagrant up 或 vagrant reload)时执行您的命令
如果你只需要某些命令总是运行,你可以拆分你的脚本
config.vm.provision :shell, path: "vagrant/bootstrap1.sh"
config.vm.provision :shell, path: "vagrant/bootstrap2.sh", run: 'always'
config.vm.provision :shell, path: "vagrant/bootstrap3.sh"
脚本将按顺序 运行,bootstrap1 然后 2 然后 3 当机器首次配置时
任何时候你 运行 vagrant up
(或重新加载)只有 bootstrap2 将是 运行
这里只是提供一个对我有用的替代方案,使用 vagrant triggers。直接从他们的文档中考虑这个例子:
运行 销毁来宾之前在主机上保存数据库的远程脚本:
Vagrant.configure("2") do |config|
config.vm.define "ubuntu" do |ubuntu|
ubuntu.vm.box = "ubuntu"
ubuntu.trigger.before :destroy do |trigger|
trigger.warn = "Dumping database to /vagrant/outfile"
trigger.run_remote = {inline: "pg_dump dbname > /vagrant/outfile"}
# or trigger.run = {...} to run the command on the host instead
# of guest
end
end
end
还有相关的vagrant-triggers plugin你可以看看
我用的是 ubuntu 18.04。触发器对我不起作用,所以我选择将 post-provision 脚本复制到虚拟机框,然后从主脚本执行所需的 post-provision:
config.trigger.before :provisioner_run, type: :hook do |t|
t.info = "Before the provision!"
end
config.vm.provision "shell" do |s|
s.inline = "echo "
s.args = [" '--->' Provisioning the environment!"]
end
config.vm.provision "file", source: "scripts/post-provision/.", destination: "/home/vagrant"
config.vm.provision "shell", path: "scripts/install.sh"
# config.vm.provision "shell", path: "scripts/bootstrap.sh", run: 'always'
# config.trigger.after :up do |trigger|
# trigger.info = "Installing Monitoring Stack..."
# trigger.run_remote = {path: "./install-monitor-stack.sh"}
# end
end
主脚本内容使用 exec 刷新新的 shell。您也可以使用
reset
sudo chmod +x *.sh
exec /home/vagrant/install-monitor-stack.sh
exec /home/vagrant/bootstrap.sh