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