2017-04-26 75 views
0

我寫一個邏輯廚師資源與每個提到從HTTP網站「拉鍊」的內容步驟廚師 - 下載從網站多個zip文件(HTTP)和做

  1. 搜索的一些基本操作並下載
  2. 下載後解壓縮後的文件,並把它放在一個目錄下 - 爲如/ U01在/ var/
  3. 現在,這裏是棘手的部分 - 每個下載的zip文件,我需要 通過每個文件遍歷和做相同的操作即 適用於不同的zip文件

我的代碼 -

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

這個代碼塊,我有一個紅寶石塊,更新了文件,我之後提到的代碼

所以有一個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 "test bash" do 
action:run 
code <<-EOH 
some operation 
EOH 
end 

我的HTTP內容可能有多個zip文件 因此,對於每一個zip文件,我需要解壓縮並做ruby_block所提及的作業bash塊

請提供解決方案或建議

編輯#1: 編寫的代碼已經是一個自定義資源,我知道我搞砸了一些循環的地方。我的代碼不會在循環中移動,並且不會遍歷其他操作。

+0

它令人困惑地知道你爲什麼卡在這裏。那麼,爲什麼不能在那裏調用一個自定義資源,並且你可以使用'Dir'獲取所有文件,並且通常迭代並應用你的ruby和bash方法。我真的不知道你的擔憂。 –

+0

您是否事先知道您要下載'zip'的地址和文件名?我的意思是,你事先知道文件將從哪裏下載的完整網址? – Navarro

+0

@Navarro:是的,我知道這個網址正是它挑選壓縮文件的地方,即使我能夠得到像下面的拉鍊列表[「1.zip,2.zip,3.zip」]但我需要迭代先用1.zip然後解壓縮,然後執行其他我無法完成的操作 –

回答

0

假設你有從那裏你要下載的URL列表,你可以有這樣一些屬性:

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 

我覺得這有您需要相同的功能,並避免使用自定義資源而採用默認設置,這些設置非常完整。

+0

感謝您的代碼,但這隻適用於網站中已知的文件。在我的場景中,我確實有http中的文件可能會增加或減少。取決於網站上的文件資源應該觸發運行。 –

+0

您應該在原始問題/評論中指定這一點,因爲從他們所瞭解的情況是不同的情況。 對於您的具體情況,我相信這不是廚師應該做的。您無法達到文件數量依賴於外部來源而變化的冪等狀態。 如果你有一個CI管道,也許你可以嘗試更新那裏的屬性,但這樣做「全部在廚師」對我來說似乎不是一個好主意。此外,廚師運行的目的是週期性的,而不是觸發第三方事件(服務器中的文件數量發生變化)。 – Navarro

+0

感謝您的意見。我可以通過訪問http通過檢查該文件的源內容,每當它變得更改時實現它。但我的問題不涉及訪問/實現同等效力,但我無法實現與代碼的迭代。 –