a2 Tech blog

試したこと・調べたこと・感じたことを発信するITエンジニアの日記です。仕事とは直接関係ないけど興味あることを模索していきます。

WindowsとServerspecでいろいろ

f:id:ninna2:20170626235006j:plain:w240

Windwos環境のインフラテストをするために、Serverspecでいろいろ試してみました。基礎的な使い方しか書いてません。他をググれば出てくることばかりです。本人の備忘程度に書いたと思っておいてください。高度な使い方は、もう少しちゃんと勉強してから改めて書こうと思います。どうすれば効率的にServerspecを使いこなせるかとか、こんな構成で書いていけばいいよ、みたいなもう少し高度なことまで将来的に書ければいいかな。とりあえず今回は基礎の基礎です。がっかりしないでね。

過去記事でServerspecをWindows(on Azure)環境で動かす基礎的な部分は記載しました。その環境でいろいろ試しています。環境構築の参考にしてもらえれば幸いです。

ninna2.hatenablog.com

Serverspecについては、公式ページのRESOURCE TYPESをしっかり読めば、テストコードがどんどん書けるはずです。テストコードを記載するハードルは全然高くないと思います。インフラエンジニアでプログラミング言語に詳しくなくてもある程度書けるのがすごく良い点です。

serverspec.org

ホスト名、IPアドレスのテスト

一番基礎的なテストです。サーバのホスト名IPアドレスが正しく設定されているかの確認です。ホスト名に関しては、Windowsコマンドでhostnameと打てば、ホスト名を返してくれるコマンドがあるので、それを利用します。IPアドレスは、ipconfigです。当たり前ですね。コマンドの実行は、RESOURCE TYPE:commandを使います。Windowsで実行できるコマンドであれば、なんでも発行できます。結果については、標準出力の場合はstdoutエラー出力の場合はstderrを指定して、結果がmatchしているか確認します。実行結果ステータスで確認したい場合はexit_statusで比較すればよいです。

RESOURCE TYPE:command を知っていれば、ほぼどんなテストでも書けるかと思います。

# hostname
describe command('hostname') do
  its(:stdout) { should match /TestServer01/ }
end

# interface
describe command('ipconfig /all') do
  its(:stdout) { should match /IPv4 Address(\.| )*: 10\.0\.0\.5/ }
  its(:stdout) { should match /Subnet Mask(\.| )*: 255\.255\.240\.0/ }
  its(:stdout) { should match /Default Gateway(\.| )*: 10\.0\.0\.1/ }
  its(:stdout) { should match /DNS Servers(\.| )*: 168\.63\.129\.16/ }
end

グループとユーザのテスト

RESOURCE TYPEのgroupuserが使えます。Userが所属しているグループはbelong_to_groupで確認できるので、グループの存在確認とユーザの存在確認に加えて、ユーザが必要なグループに所属しているかどうかも確認できます。

# group
describe group('Guests') do
  it { should exist }
end

# user and group
describe user('Guest') do
  it { should exist }
  it { should belong_to_group('Guests')}
end

ディレクトリとファイルの確認

ディレクトリとファイルは、RESOURCE TYPE:fileで両方確認できます。ディレクトリかどうかを判定するためには、be_directory、ファイルかどうかを判定するためには、be_fileでテストします。必要なディレクトリやファイルが作成されているかどうかのテストで使えます。

ファイルについては、ファイルの中身についても確認できます。containでファイルの内容にその文字列が含まれているかどうかを確認することができます。つまり、設定ファイルなどに必要な設定値が記載されているかを確認できるわけです。

# directory
describe file('C:\Work\') do
  it { should exist }
  it { should be_directory }
end

# file
describe file('C:\Work\Test.txt') do
  it { should exist }
  it { should be_file }
  it { should contain 'Test' }
end

サービスとプロセスのテスト

WindwosのServicesに登録されているかを確認できます。RESOURCE TYPE:serviceを使います。インストールされているか、有効になっているか、起動中であるか、スタートモードの設定はどうなっているか、このあたりが確認できます。モードは、英語で。プロセスもついでに確認しておきます。プロセスの確認には、RESOURCE TYPE:processを使います。このprocessに指定するのは、実行しているプロセスのexe名です。タスクマネージャから確認できるプロセス名だとダメみたいです。

# Service
describe service('DNS Client') do
  it { should be_installed }
  it { should be_enabled }
  it { should be_running }
  it { should have_start_mode("Automatic") }
end

# Process
describe process("sshd.exe") do
  it { should be_running }
end

レジストリの値のテスト

Windowsで重要な要素として、レジストリの値があります。レジストリの値についても、Serverspecでは簡単に確認できます。RESOURCE TYPE:windows_registry_keyというのが用意されています。レジストリキーを指定して存在しているかどうかの確認やその値の確認までできるので、個別にレジストリキーを設定するパターンをこれでテストできます。

# registry
describe windows_registry_key('HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer') do
  it { should exist }
  it { should have_property('svcUpdateVersion') }
  it { should have_property_value('svcUpdateVersion',':type_string','11.0.43') }
end

Hot Fixのテスト

つまり、セキュリティパッチやWindwosUpdateの確認です。これもRESOURCE TYPEが用意されています。RESOURCE TYPE:windows_hot_fixです。

# hot_fix
describe windows_hot_fix('KB3134758') do
  it { should be_installed }
end

その他

iis_app_pool、iis_website、portの確認もできます。

# iis_app_pool
describe iis_app_pool('DefaultAppPool') do
  it { should exist }
  it { should have_dotnet_version '4.0' }
end

# iis_website
describe iis_website('Default Web Site') do
  it { should exist }
  it { should be_enabled }
  it { should be_running }
  it { should be_in_app_pool 'DefaultAppPool' }
end

# port
describe port(80) do
  it { should be_listening }
end

ここまでできれば…

簡単に基本的なRESOURCE TYPESを使って、Serverspecで確認できそうなものを書いてみました。ここまでできれば、あとは組み合わせで何とかなる部分だと思うので、9割ぐらいのテストは困らないのではないでしょうか。command、file、service、process、これだけでもほとんどの設定値を確認できるはずです。WindwosだとGUIでしか確認できないものもあるかもしれないですが、そういうものは手動確認しかできないので、Serverspecでの自動テストはあきらめましょう。どこまでテストスクリプトで確認すべきかを決めていくのも、Serverspecを使う上で大切な要素になります。

それでは、皆さんのお役に立てば幸いです。