我寫一個邏輯廚師資源與每個提到從HTTP網站「拉鍊」的內容步驟廚師 - 下載從網站多個zip文件(HTTP)和做
- 搜索的一些基本操作並下載
- 下載後解壓縮後的文件,並把它放在一個目錄下 - 爲如/ U01在/ var/
- 現在,這裏是棘手的部分 - 每個下載的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: 編寫的代碼已經是一個自定義資源,我知道我搞砸了一些循環的地方。我的代碼不會在循環中移動,並且不會遍歷其他操作。
它令人困惑地知道你爲什麼卡在這裏。那麼,爲什麼不能在那裏調用一個自定義資源,並且你可以使用'Dir'獲取所有文件,並且通常迭代並應用你的ruby和bash方法。我真的不知道你的擔憂。 –
您是否事先知道您要下載'zip'的地址和文件名?我的意思是,你事先知道文件將從哪裏下載的完整網址? – Navarro
@Navarro:是的,我知道這個網址正是它挑選壓縮文件的地方,即使我能夠得到像下面的拉鍊列表[「1.zip,2.zip,3.zip」]但我需要迭代先用1.zip然後解壓縮,然後執行其他我無法完成的操作 –