我知道配置脚本,但这是我要问的不同脚本。我想在每次重新启动guest虚拟机后执行脚本。
我正在使用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
我猜这必须是客户操作系统特定的事情。
使用Vagrant可以实现吗?
编辑:从ssh配置文件更改为shell配置程序。
答案 0 :(得分:44)
您可以使用run: 'always'
config.vm.provision :shell, path: "vagrant/bootstrap.sh", run: 'always'
这将确保您的VM每次启动时执行命令(流浪者或流浪汉重新加载)
如果您只需要始终运行某些命令,则可以拆分脚本
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
答案 1 :(得分:3)
使用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您可以签出
答案 2 :(得分:0)
我使用ubuntu 18.04。触发器对我不起作用,所以我选择将预配置脚本复制到vm box,然后从主脚本执行所需的预配置:
config.trigger.before :provisioner_run, type: :hook do |t|
t.info = "Before the provision!"
end
config.vm.provision "shell" do |s|
s.inline = "echo $1 "
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。您还可以使用
重置
sudo chmod +x *.sh
exec /home/vagrant/install-monitor-stack.sh
exec /home/vagrant/bootstrap.sh