Vagrant:定义自定义Chef服务或启动脚本的简便方法

时间:2013-08-16 15:31:46

标签: service chef vagrant init.d cookbook

我有一个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来重新启动虚拟机,但我希望它能够直接重启。换句话说,有一个持久的“服务”。

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

但是有一些特殊的命令,比如上面提到的下载(必须在守护程序启动之前完成)。据推测,我可以使用template资源在/etc/init.d/中定义脚本,然后使用service在配置时启动它(尽管Chef, how to run a template that creates a init.d script before the service is created意味着这比它更多的工作声)。

但有没有标准的方法可以简单地要求在配置期间以及随后的重新启动时运行简短的内联脚本?介于executeservice之间的内容,例如

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,那很容易。)

1 个答案:

答案 0 :(得分: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块仅声明resource但与:nothing一致。当file运行时,如果它修改磁盘上的文件,则notifiesexecute资源转移到:run