chefで任意のネットワークインタフェイスのアドレスを取得する

設定ファイル中で、eth0じゃなくて、eth2のアドレスを指定しているところがあります。
eht0なら

node[:ipaddress]

でchef中のレシピでもテンプレートでも値が入ってきますが、eht1とかeth2だとどうするんだろ。
nodes/hostname.jsonに書いちゃえばいいんでしょうが、ohaiに情報があるはずなのでそれはやりたくない。
ohaiを叩いてみると、欲しい情報はこんなふうになっています。

"network": {
    "interfaces": {
      "lo": {
        "mtu": "65536",
        "flags": [
          "LOOPBACK",
          "UP",
          "LOWER_UP"
        ],
(中略)
      "eth2": {
        "type": "eth",
        "number": "2",
        "mtu": "1500",
        "flags": [
          "BROADCAST",
          "MULTICAST",
          "UP",
          "LOWER_UP"
        ],
        "encapsulation": "Ethernet",
        "addresses": {
          "00:50:56:85:60:8A": {
            "family": "lladdr"
          },
          "172.16.1.2": {
            "family": "inet",
            "prefixlen": "24",
            "netmask": "255.255.255.0",
            "broadcast": "172.16.1.255",
            "scope": "Global"
          },
          "fe80::250:56ff:fe85:608a": {
            "family": "inet6",
            "prefixlen": "64",
            "scope": "Link"
          }

(以下略)

ということは

node['network']['interface']['eth2']['addresses']

の中のデータとして入っています。
ハッシュ値の値としては2つで、familyがinetとinet6。ということはselectでfamilyの値を指定すればいい。

node['network']['interfaces']['eth2']['addresses'].select { |address,data| data['family'] == 'inet'}

これで以下のハッシュ値が入手できます。

          "172.16.31.58": {
            "family": "inet",
            "prefixlen": "24",
            "netmask": "255.255.255.0",
            "broadcast": "172.16.31.255",
            "scope": "Global"
          }

あとはこのハッシュ値のキーを出力すればOK。

node['network']['interfaces']['eth2']['addresses'].select { |address,data| data['family'] == 'inet'}.keys[0]

テンプレートに書く場合はこんな感じ。

ListenIP=<%=node['network']['interfaces']['eth2']['addresses'].select { |address,data| data['family'] == 'inet'}.keys[0]%>

仮想アドレスかなんかで複数アドレスが割り振られているときは、[0]の数字を変えればいいと思う。