厨师从源头安装和更新程序

m33*_*lky 35 ruby deployment chef-infra

我有一个我从源码构建的程序.为此,我正在使用该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
Run Code Online (Sandbox Code Playgroud)

jti*_*man 68

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

您制作"./configure && make && make install"样式安装脚本idempotent的方法取决于您正在使用的软件类型.通常,检查目标文件是否存在就足够了.有时,需要确定需要什么版本,以及使用适当的命令行选项执行时程序将输出的版本.我将使用上面的资源作为这些示例的起点.请注意,您可以将其bash用作script具有解释器的资源的快捷方式bash.

假设:程序安装到/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
Run Code Online (Sandbox Code Playgroud)

而不是使用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
Run Code Online (Sandbox Code Playgroud)

此外,/tmp重启后可能会在系统上删除.建议您下载到另一个未删除的位置,例如Chef的文件缓存位置,即值Chef::Config[:file_cache_path].例如:

remote_file "#{Chef::Config[:file_cache_path]}/program.tar.gz" do
  ...
end
Run Code Online (Sandbox Code Playgroud)

有关更多示例,您可以在Opscode共享的几本cookbook中查看"源"配方:http://github.com/opscode/cookbooks .php,python,gnu_parallel,和nagios食谱都有"源"的食谱.

  • 如何确保脚本运行?假设你第一次运行chef时`remote_file`资源成功但是`install_program`资源失败了.然后,当您修复问题并再次运行chef时,远程文件已经存在,因此它不会在其上执行任何操作,并且它不会通知`install_program`资源,因此程序不会安装.我想找一个更好的模式,从厨师来源安装软件. (3认同)