2017-04-26 6 views
0

特定の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 
+0

以下のソリューション私が説明することはできません、本当に奇妙な効果を持っていました。それは常にシェフの殻では機能しますが、(20台以上のマシンでは)レシピで動作することはめったにありません。私が使用し終わった代替ソリューションはここにあります http://stackoverflow.com/questions/43773141/ruby-return-top-level-hash-key-if-value-recursively-contains-string –

答えて

2

このような何か:

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

これは完全に動作します。ありがとうございました。私が一緒に投げたごみよりもずっと良かったです。 –

+0

私はこのビットをシェフのシェルとグーグルで少しずつ試してみましたが、実際にはどうなっていますか? 私は変数の割り当てに従いません。私は漠然としたことに、オアイハッシュを通して、enumerable#findメソッドごとに最終的に何かが返されるまで、ハッシュを繰り返すことを知っていますが、インターフェイスとデータが何で、どのように割り当てられているのかはわかりません。私は[]メソッドの表記法が何をしているかに慣れていない –

関連する問題