特定のIPに関連付けられたインターフェイスを特定する方法を探しています。今私はインターフェイスのためのIPを返すことができる反対を持っています。ルビー/シェフが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
は私の特定の目的のために私は、配列をいくつかの本当にばかな反復処理を行い、パターンマッチングを行いますが、私は一般的にそれを行う方法を知りたいのですができます。
インターネットには、私が探しているものの反対を行う方法の例がたくさんあります。
私の現在のハックはこれで、本当に好きではありません。
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
以下のソリューション私が説明することはできません、本当に奇妙な効果を持っていました。それは常にシェフの殻では機能しますが、(20台以上のマシンでは)レシピで動作することはめったにありません。私が使用し終わった代替ソリューションはここにあります http://stackoverflow.com/questions/43773141/ruby-return-top-level-hash-key-if-value-recursively-contains-string –