Chef - 从网站(HTTP)下载多个zip文件并执行一些基本操作

时间:2017-04-26 10:06:37

标签: ruby bash chef chef-recipe

我正在编写一个厨师资源,其中包含每个步骤中提到的逻辑

  1. 从http网站搜索“zip”内容并下载
  2. 下载后解压缩文件并将其放在目录下 - 例如/ u01 / var /
  3. 现在这里有一个棘手的部分 - 我需要的每个下载的zip文件 遍历每个文件并执行相同的操作 适用于不同的zip文件
  4. 我的代码 -

    require 'open-uri'
        links =  open(patch_depot ,&:read).to_s
        out1=links.scan(/\s*\s*"([^"]*zip)"/imu).flatten
        patch_files = out1.select{ |i| i[/\.zip$/]}
        print patch_files
         unless patch_files.length>=1
            Chef::Log.info('No latest file found..!!')
        else
        c = Dir.pwd
        Dir.chdir(cache_direc)
        patch_files.each do |patch|
          if ::File.exist?(::File.join(cache_direc,patch))
            Chef::Log.info("#{patch} file is already downloaded")
          else
            open(patch, 'wb') do |fo|
              fo.print open("#{patch_depot}/#{patch}").read
            end
            `unzip -qo #{patch}`
            Chef::Log.info("#{patch} is downloaded and extracted")
            FileUtils.chown_R osuser, usergroup, cache_direc
            FileUtils.chmod_R 0777, cache_direc
    
          end
    

    因此,使用上面提到的代码,我能够实现第1点和第2点

    在这个代码块之后,我有一个更新文件的ruby块,我有一个bash块,可以进行一些操作。

    如下所示 -

    ruby_block 'edit bsu.sh file' do
             block do
                    bsu_sh_file = Chef::Util::FileEdit.new("#{bsu_loc}/utils/asu/mmy.sh")
                    bsu_sh_file.search_file_replace_line(/^MEM_ARGS="-Xms256m -Xmx512m"*$/, "MEM_ARGS='-Xms1024m -Xmx1024m'")
                    if bsu_sh_file.unwritten_changes? == false
                            Chef::Log.info('No Changes need be made to mmy_sh_file')
                    else
                            bsu_sh_file.write_file
                            Chef::Log.info('Changes made in mmy_sh_file file')
                    end
            end
          end
    

    bash block -

    bash "test bash" do
    action:run
    code <<-EOH
    some operation
    EOH
    end
    

    我的HTTP内容可能包含多个zip文件 因此,对于每个zip文件,我需要解压缩并执行ruby_block和bash block

    中提到的操作

    请提供解决方案或建议

    编辑#1: 编写的代码已经是一个自定义资源,我知道我搞砸了一些循环。我的代码不会在循环中移动并迭代其他操作。

1 个答案:

答案 0 :(得分:0)

假设您有一个您想要下载的网址列表,您可以拥有以下属性:

default['your_cookbook']['files']['file_1'] = {
  address: 'http://whatever.com/file1.zip',
  name: 'file1.zip',
  path: '/where/you/want/it/',
  checksum: '12341234123412341234'
}
default['your_cookbook']['files']['file_2'] = {
  address: 'http://whatever.com/file2.zip',
  name: 'file2.zip',
  path: '/where/you/want/it/',
  checksum: '12341234123412341234'
}

然后你可以这样做:

node['your_cookbook']['files'].each do |file|
  remote_file file.name do
    path "/tmp/#{file.name}"
    source file.address
    checksum file.checksum
  end

  execute "extract_#{file.name}" do
    command "unzip /tmp/#{file.name} -d #{file.path}#{file.name}"
    action :nothing
    subscribe :run, "remote_file[#{file.name}]", :immediate
  end
end

我认为这具有您需要的相同功能,并且避免使用自定义资源而支持默认资源,这些资源非常完整。