Chefとテストフレームワーク
こんにちは、誕生した僕です。 5月に催されましたMicrosoftのイベントde:code 2016に参加してきまして、そこでなんとChef社のVP ジェームズ・ケーシーさんにChefSpecやInSpecといったChefを開発、運用するために必要なテストフレームワークについて教授いただきました。(2日目のセッションでね
ちょっとこの経験を僕なりに出力すべく、本ブログを書きたいと思います。 SQL Server 2014のChef レシピを作成し、InSpecで試験する、なんて方法を書きます。
レシピの説明
作成したSQL Server 2014のChefレシピを以下に貼ります。動作環境はWindows Server 2012 R2でございます。前提条件がありまして、.NET Framework 3.5が入っていて、WindowsファイアウォールがSQL Serverアクセス許可されていることとなります。
recipe of sqlserver chef cookbook
以下、各リソースごと説明いたします。
powershell_script 'delete-install-directory'
SQL Serverをインストールする前にインストール先のディレクトリが存在するとインストールに失敗するため、存在する場合は、Remove-Itemコマンドで削除します。directory 'C:/temp/'
workフォルダとでも言いましょうか。こちらを作成します。template 'C:/temp/ConfigurationFile.ini'
SQL ServerはConfigurationFileを指定してインストールできます。ConfigurationFileをtempフォルダに置きます。powershell_script 'download-sqlserver-iso'
SQL Server インストールファイルをtempフォルダにダウンロードします。powershell_script 'mount-iso-file'
ダウンロードしたSQL Server インストールファイルを指定してISOマウントします。powershell_script 'install-sqlserver'
マウントした場合のボリューム名をattributesに登録しておき、そのボリューム名をマウントするドライブレターを取得します。 そのドライブレターに移動し、インストールします。インストールにはattributesに登録された、SQL ServerサービスアカウントのパスワードとSQL Server システムAdminアカウントのパスワードとConfigurationFileを指定し、ライセンスアグリーメントのため/IACCEPTSQLSERVERLICENSETERMSを有効にしてインストールを実行します。powershell_script 'dismount-iso-file'
インストール完了後、ISOマウントしたディスクをアンマウントします。powershell_script 'delete-iso-file'
最後にSQL Server インストールファイルをインスタンスから削除します。
RubocopとFoodcriticで静的解析
このレシピやテストコードを作成するにあたり、RubocopやFoodcriticを利用しています。 具体的には、Atom editorのプラグインで利用しています。 RubocopはChefというよりかはrubyの構文を見てくれます。
※この例ではダブルクォーテよりもシングルクォーテの方が好き、と言われています。
Foodcritic(料理評論家)はChefの構文に特化して評論してくれます。
※評論の内容はこちらにあります↓
このように静的解析を行いながら開発することで質と開発スピードを両立することができます。
ChefSpecでユニットテスト
ChefSpecでChefレシピをユニットテストします。以下に作成したレシピをテストするspecファイルを貼りますね。
spec file of sqlserver chef cookbook
以下、簡単に説明します。
describe 'sqlserver::default'
レシピsqlserver::defaultの各リソースすべてについてテストします。before
テスト実施前の前提条件をここで設定しています。ここでは、レシピ内で使用するnot_ifのコマンド結果をfalseと設定しています。it ' **** '
各リソースごとit内にテストを記述します。- allow(File).to receive(:exist?).and_return(true)
リソース内にonly_ifがある場合、その条件をtrueとし、テストします。
- allow(File).to receive(:exist?).and_return(true)
これを実行するとこんな感じです。
$ chef exec rspec default_spec.rb
レシピを作る前にspecファイルを作ってテストがパスするようにレシピを作るとテスト駆動でCookbookを開発できますね。
レシピ実行
レシピを実行します。@WIndows Server 2012 R2
PS > chef-client -z -c client.rb -j windows.json
localモード(-z)
Cookbook、client.rb、windows.jsonを用意して、localモードで実行します。client.rb
Cache、Cookbook、logレベルを定義しています。
例では、C:/tempフォルダにSQL Server インストールファイルをあらかじめダウンロードしていますので、30分ほどで完了しました。
InSpecでインテグレーションテスト
InSpecでインテグレーションテストを行います。InSpecはInfrastructure Specificationの略のようです。 InSpecはSSHだったりWinRMだったりDockerだったりに対してリモートに実行することも可能ですが、今回はWindows Server 2012R2ローカルで実行します。
WindowsでInSpecを実行する準備
InSpecファイルの説明
以下にInSpecファイルを貼ります。
inspec file of sqlserver chef cookbook
主にインストールされたであろうサービスを確認しています。簡単に説明しますね。
impact
InSpecはチームでテスト結果を共有することを強調しています。まぁ優先度ですね。title and desc(ription
こちらもチーム共有のための付帯情報です。
まとめ
FoodcriticやChefSpecは以前から気になっていました。InSpecはde:code 2016で知りました。
一連のChefレシピ開発を推進するツールは十分揃っていてWindowsでも"使える"ことが確認できました。
Windowsと自動化ってまだまだ色眼鏡で見られがちですが、MicrosoftのOSS活動と同様に自動化ツール界隈も加速しています。
Windows as a Codeに乗り遅れるな!!
コードと参考文献
紹介したコードはこちらにございます。
そしてSQL Server 2014のレシピを作成するにあたり、こちらの記事を参考にさせていただきました。
終