36

我有一个从源代码构建的程序。为此,我正在使用该script资源。实现安装和更新逻辑的好方法是什么?现在我刚刚使用内置not_if条件实现了安装。

script "install_program" do
  not_if {File.exists?('/program')}
  interpreter "bash"
  user "root"
  cwd "/tmp"
  code <<-EOH
    wget http://www.example.com/program.tar.gz
    tar -zxf program.tar.gz
    cd tarball
    ./configure
    make
    make install
  EOH
end
4

1 回答 1

69

首先,如果您有办法托管内部包存储库,我通常建议您为目标平台构建本地包,并使用package资源来管理它们,而不是从源代码构建。我知道这并不总是可用或可行的,所以......

您制作“./configure && make && make install”风格的安装脚本幂等的方法取决于您正在使用的软件类型。大多数情况下,检查目标文件是否存在就足够了。有时,需要确定所需的版本,以及在使用适当的命令行选项执行时程序将输出的版本。我将使用您上面的资源作为这些示例的起点。请注意,您可以将其用作具有解释器bash的资源的快捷方式。scriptbash

假设:程序安装到/usr/local/bin/program并接受一个参数--version大概是为了显示版本号。我将 cd、configure 和 make 命令放在一起,&&因为如果一个失败,我们不应该尝试继续执行。

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 时才会执行。

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 的文件缓存位置,即Chef::Config[:file_cache_path]. 例如:

remote_file "#{Chef::Config[:file_cache_path]}/program.tar.gz" do
  ...
end

有关更多示例,您可以在此处查看 Opscode 共享的几本食谱中的“源”食谱:http: //github.com/opscode/cookbooksphppythongnu_parallelnagios食谱都有“源”食谱。

于 2011-12-27T07:33:29.797 回答