読者です 読者をやめる 読者になる 読者になる

Win 7でserverspec動かしてみたら、host.ipaddressが取れなかった

Win 7でserverspec動かしてみたら、host.ipaddressがとれない

require 'spec_helper'

describe host("www.example.com") do
  it { should be_resolvable }
  its(:ipaddress) { should eq "192.0.2.1" }
end

Failures:

  1) Host "www.example.com"
     Failure/Error: it { expect(subject.ipaddress).to eq "192.0.2.1" }
     NotImplementedError:
       get_ipaddress is not implemented in Specinfra::Command::Windows::Base::Host

specinfra/host.rb at master · serverspec/specinfra · GitHub
コード見たら確かにget_ipaddress実装されてない。



linuxとかだと下記のようにgetent hostsの結果らしいのだけど

    def get_ipaddress(name)
      "getent hosts #{escape(name)} | awk '{print $1}'"
    end



check_is_resolvable内を参考に下記をPowerShellで試してたら、複数IPアドレスが返ってきたので、取れないわけではなさそうだけど、配列になっちゃうから、リソースタイプのドキュメントのeqではなくてbe_include("192.0.2.1")とかで書くことになりそう。

PS> [System.Net.Dns]::GetHostAddresses("www.google.com")|fl IPAddressToString
IPAddressToString : 74.125.235.113
IPAddressToString : 74.125.235.114
IPAddressToString : 74.125.235.115
IPAddressToString : 74.125.235.116
IPAddressToString : 74.125.235.112


パッチとか書くか悩む。

他の実装をみているとPowerShell側で最後TrueかFalseを返すものが多い。それに倣うとPowerShell側では下記のようなコマンド発行になりそう。

PS> @([System.Net.Dns]::GetHostAddresses("www.google.com")| select {$_.IPAddressToString -eq "74.125.235.112"}).count -gt 0

でserverspec側はこういう感じで書くことになりそう。

  it { should have_ipaddress( "74.125.235.112") }