geek.conf.2

あるエンジニアの備忘録

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の構文を見てくれます。

f:id:tsubauaaa:20160613160849p:plain ※この例ではダブルクォーテよりもシングルクォーテの方が好き、と言われています。

Foodcritic(料理評論家)はChefの構文に特化して評論してくれます。

f:id:tsubauaaa:20160613161229p:plain ※評論の内容はこちらにあります↓

http://www.foodcritic.io/

このように静的解析を行いながら開発することで質と開発スピードを両立することができます。

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とし、テストします。

これを実行するとこんな感じです。
$ chef exec rspec default_spec.rb f:id:tsubauaaa:20160613164810p:plain

レシピを作る前に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レベルを定義しています。

  • windows.json
    run_listを定義しています。

f:id:tsubauaaa:20160613192949p:plain

例では、C:/tempフォルダにSQL Server インストールファイルをあらかじめダウンロードしていますので、30分ほどで完了しました。 f:id:tsubauaaa:20160613200150p:plain

InSpecでインテグレーションテスト

InSpecでインテグレーションテストを行います。InSpecはInfrastructure Specificationの略のようです。 InSpecはSSHだったりWinRMだったりDockerだったりに対してリモートに実行することも可能ですが、今回はWindows Server 2012R2ローカルで実行します。

WindowsでInSpecを実行する準備

  • rubyのインストール
  • ruby Development Kitのインストール
    • c:/devkitにruby Development Kitを解凍
    • c:/devkit/config.ymlに- C:\Ruby22-x64を追記(これはRubyのインストール先)
    • cd c:/devkit
    • ruby dk.rb init
    • ruby dk.rb install
  • InSpecのインストール
    • gem install inspec

InSpecファイルの説明

以下にInSpecファイルを貼ります。

inspec file of sqlserver chef cookbook

主にインストールされたであろうサービスを確認しています。簡単に説明しますね。

  • impact
    InSpecはチームでテスト結果を共有することを強調しています。まぁ優先度ですね。

  • title and desc(ription
    こちらもチーム共有のための付帯情報です。

まとめ

FoodcriticやChefSpecは以前から気になっていました。InSpecはde:code 2016で知りました。
一連のChefレシピ開発を推進するツールは十分揃っていてWindowsでも"使える"ことが確認できました。

Windowsと自動化ってまだまだ色眼鏡で見られがちですが、MicrosoftOSS活動と同様に自動化ツール界隈も加速しています。
Windows as a Codeに乗り遅れるな!!

コードと参考文献

紹介したコードはこちらにございます。

github.com

そしてSQL Server 2014のレシピを作成するにあたり、こちらの記事を参考にさせていただきました。

www.systemcentercentral.com