2017-04-26 1 views
0

ich mit einer Logik, um einen Koch Ressource schreibe wie mit jeder genannten SchritteChef - Laden Sie mehrere Zip-Dateien von der Website (HTTP) und haben einige grundlegende Operationen

  1. Suche nach einem ‚zip‘ Inhalt von der Website http und laden sie es
  2. nach dem Entpacken der Dateien herunterzuladen und setzt es unter einem Verzeichnis - für zB/u01/var/
  3. Jetzt kommt der schwierige Teil - für jede heruntergeladene ZIP-Datei muss ich durch jede Datei zu durchqueren und zu tun die gleiche Operation, die für verschiedene Zip-Dateien
  4. gilt

My-Code -

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 

Also mit dem Code oben i bin in der Lage erwähnten Punkt 1 und Punkt 2

Nach diesem Codeblock i einen Rubin Block haben zu erreichen, die eine Datei aktualisiert und i habe einen bash block, der eine Operation ausführt.

unten wie -

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 blockieren -

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

Mein HTTP-Content mehr Zip-Dateien für jede Zip-Datei So kann ich muß erwähnt auf ruby_block die Operationen entpacken und zu tun und bash block

Bitte geben Sie eine Lösung oder einen Vorschlag

EDIT # 1: Der Code geschrieben, die bereits eine benutzerdefinierte Ressource ist, weiß ich, ich versauen mit der Schleife einige wo. Mein Code bewegt sich nicht innerhalb der Schleife und durchläuft die anderen Aktionen.

+0

Es ist verwirrend zu wissen, warum du hier feststeckst. Also, warum können Sie nicht eine benutzerdefinierte Ressource dort aufrufen und in der Sie alle Dateien an der Stelle mit 'Dir 'erhalten und normalerweise iterieren und Ihre Ruby und Bash-Methoden anwenden. Ich habe wirklich keine Ahnung von Ihrer Sorge. –

+0

Kennen Sie vorher die Adresse, von der Sie den 'zip' und den Namen der Datei (en) herunterladen möchten? Ich meine, wissen Sie vorher die komplette URL von wo die Datei heruntergeladen wird? – Navarro

+0

@Navarro: Ja, ich kenne die URLs, wo genau die ZIP-Dateien ausgewählt werden, auch wenn ich die Liste der Zips wie unten bekomme ["1.zip, 2.zip, 3.zip"] Aber ich muss iterieren zuerst mit 1.zip dann entpacken und andere Aktionen ausführen, die ich nicht erreichen kann –

Antwort

0

Angenommen, Sie haben eine Liste von URLs, von wo aus Sie herunterladen möchten, können Sie einige Attribute wie haben:

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' 
} 

Dann können Sie dies tun:

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 

Ich denke, das das haben die gleiche Funktionalität, die Sie brauchen, und vermeiden Sie die Verwendung von benutzerdefinierten Ressourcen zugunsten der Standard, die ziemlich vollständig sind.

+0

Danke für den Code, aber das funktioniert nur für die bekannten Dateien auf der Website. In meinem Szenario habe ich Dateien in der http kann erhöht oder verringert werden. Abhängig von den Dateien auf der Website sollte die Ressource den Lauf auslösen. –

+0

Sie sollten dies auf Ihrer ursprünglichen Frage/Kommentare angeben, da das, was von ihnen verstanden wird, ein anderes Szenario ist. Für Ihren speziellen Fall, glaube ich, ist das nicht, was Chef tun soll. Sie können keinen idempotenten Zustand erreichen, in dem die Anzahl der Dateien abhängig von einer externen Quelle variiert. Wenn Sie eine CI-Pipeline haben, können Sie vielleicht versuchen, dort das Attribut zu aktualisieren, aber es 'alles in Chef' zu tun scheint mir keine gute Idee. Außerdem sind die Koch-Runs dazu gedacht, periodisch zu sein und nicht auf Ereignisse von Dritten ausgelöst zu werden (Anzahl der Dateien im Server ändert sich). – Navarro

+0

Danke für Ihre Ansichten. Ich kann es erreichen, indem ich auf den http zugreife, indem ich den Quellinhalt dieser Datei überprüfe, wann immer sie geändert wird. Aber meine Frage beschäftigt sich nicht mit dem Erlangen der idem-Potenz, aber ich konnte die Iteration mit dem Code nicht erreichen. –

Verwandte Themen