2017-04-26 4 views
0

Ich bin auf der Suche nach einer Möglichkeit, die Schnittstelle zu einer bestimmten IP zu bestimmen. Im Moment habe ich das Gegenteil, wo ich die IP für eine Schnittstelle zurückgeben kann.Ruby/Chef zurück die Schnittstelle zu einer IP

def ipv4_for_interface(i) 
    return unless node['network']['interfaces'].has_key?(i) 
    addr, data = node['network']['interfaces'][i]['addresses'].find { |x| x[1]['family'] == 'inet' } 
    addr 
end 

Für meinen besonderen Zweck konnte ich einige wirklich dumme Iterieren durch ein Array tun und Pattern-Matching tun, aber ich würde gerne wissen, wie es im Allgemeinen zu tun.

Das Internet ist voll von Beispielen, wie man das Gegenteil von dem tut, wonach ich suche.

Mein aktueller Hack ist das und ich mag es wirklich nicht.

def first_matching_ipv4(match_method) 
    all = all_matching_ipv4(match_method) 
    return all[0] unless all.empty? 
end 

def first_private_ipv4 
    first_matching_ipv4(:private_ipv4?) 
end 


ruby_block 'get private' do 
    block do 
    node.default['return_val']=$(ifconfig | grep -B1 "inet addr:#{first_private_ipv4}" | awk '$1!="inet" && $1!="--" {print $1}') 
    end 
end 

ruby_block 'get public' do 
    block do 
    node.default['return_val']=$(ifconfig | grep -B1 "inet addr:#{first_public_ipv4}" | awk '$1!="inet" && $1!="--" {print $1}') 
end 
end 
+0

Die Lösung hatte unten einen wirklich bizarren Effekt, kann ich nicht erklären. Es würde immer in der Chef-Shell arbeiten, aber sehr selten (einmal aus mehr als 20 Maschinen) in einem Rezept arbeiten. Die alternative Lösung, die ich verwendet habe, kann hier gefunden werden http://stackoverflow.com/questions/43773141/ruby-return-top-level-hash-key-if-value-recursivy-contains-string –

Antwort

2

Etwas wie folgt aus:

def interface_for_ipv4(addr) 
    node['network']['interfaces'].find do |interface, data| 
    data['addresses'][addr] 
    end.first 
end 
+0

Dies funktioniert perfekt . Vielen Dank. Viel besser als der Müll, den ich zusammen geworfen habe. –

+0

Ich habe versucht, das Stück für Stück in der Chef-Shell durchzugehen und zu googeln, aber wie funktioniert das eigentlich? Ich befolge die Variablenzuordnung nicht. Ich verstehe vage, dass es durch die Ohai-Hashes iteriert, bis schließlich etwas zurückkommt, das wahr ist, nach der aufzählbaren Methode # find, aber was und wie Schnittstelle und Daten zugewiesen sind, folge ich nicht. Ich bin nicht vertraut mit dem, was die [] -Methode auch tut –

Verwandte Themen