我有一个 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
先,这很容易。)