首先也是最重要的一点是,如果您有办法托管内部包存储库,我通常建议您为目标平台构建本机包,并使用package
资源来管理它们,而不是从源代码构建.我知道这并不总是可行的,所以...
生成"/configure&;make&;make-install"样式的安装脚本幂等式的方法取决于您使用的软件类型.通常,判断目标文件是否存在就足够了.有时,需要确定所需的版本,以及使用适当的命令行选项执行时程序将输出的版本.我将使用上面的资源作为这些示例的起点.请注意,您可以使用bash
作为script
个具有解释器bash
的资源的快捷方式.
假设:该程序安装到/usr/local/bin/program
,并使用参数--version
来显示版本号.我把cd、configure和make命令与&&
放在一起,因为如果其中一个失败了,我们不应该try 继续执行.
bash "install_program" do
not_if "/usr/local/bin/program --version | grep -q '#{node[:program][:version]}'"
user "root"
cwd "/tmp"
code <<-EOH
wget http://www.example.com/program-#{node[:program][:version]}.tar.gz -O /tmp/program-#{node[:program][:version]}.tar.gz
tar -zxf program-#{node[:program][:version]}.tar.gz
(cd program-#{node[:program][:version]}/ && ./configure && make && make install)
EOH
end
与其使用wget
,不如使用remote_file
资源,因为它本身就是幂等的.请注意,添加了checksum
参数,该值作为属性.此参数告诉Chef,如果本地目标文件与校验和匹配,则不要下载远程文件.这是一个SHA256校验和.此外,该资源将通知脚本立即运行,因此在下载脚本之后.脚本设置为动作:nothing
,因此只有在下载远程_文件时才会执行.
remote_file "/tmp/program-#{node[:program][:version]}.tar.gz" do
source "http://www.example.com/program-#{node[:program][:version]}.tar.gz"
checksum node[:program][:checksum]
notifies :run, "bash[install_program]", :immediately
end
bash "install_program" do
user "root"
cwd "/tmp"
code <<-EOH
tar -zxf program-#{node[:program][:version]}.tar.gz
(cd program-#{node[:program][:version]}/ && ./configure && make && make install)
EOH
action :nothing
end
此外,重新启动时,系统上的/tmp
可能会被删除.建议您下载到另一个未被删除的位置,例如Chef's file cache location,其值为Chef::Config[:file_cache_path]
.例如:
remote_file "#{Chef::Config[:file_cache_path]}/program.tar.gz" do
...
end
关于更多的例子,你可以在Opscode分享的几本食谱中看到"源"食谱:http://github.com/opscode/cookbooks.php
、python
、gnu_parallel
和nagios
本食谱都有"源"食谱.