我有一个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意味着这比它更多的工作声)。
但有没有标准的方法可以简单地要求在配置期间以及随后的重新启动时运行简短的内联脚本?介于execute
和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
,那很容易。)
答案 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
运行时,如果它修改磁盘上的文件,则notifies
将execute
资源转移到:run
。