39

我知道配置脚本,但这是我要询问的不同脚本。我希望在每次重新启动来宾后执行一个脚本。

我正在使用外壳配置程序。

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 配置器。

4

3 回答 3

67

您可以使用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

于 2016-05-13T11:16:21.553 回答
5

在这里提供一个对我有用的替代方案,使用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 插件

于 2018-06-22T13:38:48.607 回答
1

我用的是 ubuntu 18.04。触发器对我不起作用,所以我选择将配置后脚本复制到 vm 框,然后从主脚本执行所需的配置后:

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
于 2019-07-17T05:12:51.463 回答