当使用 Vagrant(以及随后的 Chef)时,我使用 Zend Server CE 配置我的 VM,它会自动安装通常的 *AMP 堆栈。
我想通过 PEAR 安装一些软件包,而“php”cookbook 已经为这些软件包提供了“pear”和“pear_channel”提供程序。但是,通过调用require_recipe("php")
,default.rb
会自动运行并尝试重新安装 PHP。
我只是想利用它的几个提供商而不执行default.rb
。
有没有办法做到这一点?
答案1
您需要确保所有 Chef 配方都是幂等的,并且对您的环境无损。当您要求或包含配方时,Chef 将始终运行 default.rb。
有两种方法可以解决此问题:
- 让你的 PHP 配方检查已安装的 PHP 二进制文件,如果发现则不执行任何操作
- 将安装步骤移至 default.rb 之外的新配方文件
第一种是最好的解决方案,但是如果您确实想要使用 PEAR 但又不想让 chef 管理 php,那么您可以选择第二种。
答案2
您可以通过在 cookbook 的 metadata.rb 中添加内容来指定您的 cookbook 依赖于 opscode php cookbook depends 'php'
。通过使用depends,您不必实际运行 php cookbook。请参阅http://wiki.opscode.com/display/chef/Metadata#Metadata-depends
然后,假设 php cookbook 可从您的 chef 服务器获取,chef-client 运行将拉取 php cookbook,以便 php_pear 和 php_pear_channel 资源可用。在您自己的配方中,只需根据 php cookbook 添加说明即可:
php_pear "DB" do
action :install
end