0

我有一个 Vagrant 项目,它定义了几个虚拟机。在其中一个上,我需要运行一些命令来调整内核参数、从远程位置下载文件并启动守护程序。目前我在一个定义cookbooks/*/recipes/default.rb

execute "sudo tune-kernel-parameter"
execute "curl http://something/ > /tmp/some-file"
execute "sudo some-daemon --config /tmp/some-file"

当我第一次时,这一切都很好vagrant up。但是当然,如​​果机器重新启动,这些命令都不会再次运行,因为它们不是任何 init 脚本的一部分。

我想我总是可以运行vagrant reload以重新启动 VM,但我希望它能够直接重新启动。换句话说,有一个持久的“服务”。

现在,如果我想花时间查找这些文件的正确语法(在我已经完成验证即时命令的工作之后),上面给出的一些命令(内核​​调整)可以被修改/etc做我想做的)。对于其他人(启动守护程序),我可能能够使用预定义的服务,即定义我可以配置/etc并开始使用service资源的服务的 Ubuntu 包。

但是还有一些特殊的命令,例如上面提到的下载(必须在守护程序启动之前完成)。大概我可以使用该template资源在其中定义一个脚本,/etc/init.d/然后service在配置时使用它来启动它(尽管Chef,如何在创建服务之前运行创建 init.d 脚本的模板意味着这比听起来还要工作)。

但是,是否没有标准的方法来简单地要求在配置期间以及随后的重新启动时运行一个简短的内联脚本?execute介于and之间的东西service,例如

init_script <<-END
    sudo tune-kernel-parameter
    curl http://something/ > /tmp/some-file
    sudo some-daemon --config /tmp/some-file
END

(我假设脚本是幂等的,即vagrant provision在同一个 VM 会话中再次运行修改后的版本是可以的;如果我需要killall some-daemon先,这很容易。)

4

1 回答 1

1

你可能会使用/etc/rc.local

file "/etc/rc.local" do
  content <<-EOC
    sudo tune-kernel-parameter
    curl http://something/ > /tmp/some-file
    sudo some-daemon --config /tmp/some-file
  EOC
  mode 0755
  notifies :run, "execute[rc.local]"
end

execute "rc.local"
  command "/etc/rc.local"
  action :nothing
end

execute块仅声明 aresource:nothing对它进行了声明。file运行时,如果它修改磁盘上的文件,则将notifies资源execute更改为:run.

于 2013-08-17T19:11:08.580 回答