【问题标题】:chef install and update programs from sourceChef 从源代码安装和更新程序
【发布时间】:2012-01-21 18:27:12
【问题描述】:

我有一个从源代码构建的程序。为此,我使用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

【问题讨论】:

    标签: ruby deployment chef-infra


    【解决方案1】:

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

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

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

    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
    

    使用remote_file 资源而不是使用wget 会更好一些,因为它本身就是幂等的。请注意,添加了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 食谱都有“源”食谱。

    【讨论】:

    • 注意:带有remote_file 的错误有时可以ungzip 带有.gz 扩展名的文件,例如tar.gz。所以tar -zxf 会失败,因为它不是真正的 gzip。
    • @jtimberman 你能解释一下吗,programversion 变量是从哪里设置的
    • 它们是我用作示例的任意属性。它们被设置为节点属性。 docs.opscode.com/essentials_node_object.html#attributes
    • 我知道这篇文章已经过时了,但你如何确保脚本不会再次运行。如果它是从 /tmp 文件夹安装的,那么您停止安装的技巧将不起作用。
    • 如何确保脚本完全运行?假设当您第一次运行 chef 时 remote_file 资源成功但 install_program 资源失败。然后,当您解决问题并再次运行 chef 时,远程文件已经存在,因此它不会打扰对其执行任何操作,并且它不会通知 install_program 资源,因此不会安装程序。我想找到一种更好的模式来从 Chef 的源代码安装软件。
    猜你喜欢
    • 2015-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-22
    相关资源
    最近更新 更多