テストフレームワークInSpecを触ってみた
概要
先日、IBMが主催するイベント「Enterprise Server Meetup」の第2回が開催されました。
第2回のテーマがインフラ運用・構築の自動化で、個人的に興味のある内容でしたので参加してみました。
そのなかではじめて目にしたツールがありましたので、早速触ってみました。
InSpecとは
構成管理ツールChefの開発で知られているChef社がOSSとしてRubyで開発されているテストフレームワークです。
はじめて使いますので、まずは公式リポジトリのREADMEに記載されているインストール方法とサンプルコマンドを実行して試してみます。
インストール手順
上記のリポジトリ内に紹介された手順で進めていきます。環境はAlamaLinuxを使いました。
(CentOSでももちろん大丈夫です。たぶん)
InSpecはRubyで記述されているため、まずはRubyをインストールします。(バージョン2.6以上とのこと)
yumパッケージですとRubyのバージョンが古いので、rbenvでインストールします。
Rubyインストール手順
# rbenvとruby-buildのインストール
$ git clone https://github.com/sstephenson/rbenv.git ~/.rbenv
$ git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build
# .bash_profile設定
$ echo '# rbenv' >> ~/.bash_profile
$ echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile
$ echo 'eval "$(rbenv init -)"' >> ~/.bash_profile
$ exec $SHELL --login
# rubyのインストールに必要なパッケージをインストール
$ sudo dnf -y install bzip2 gcc openssl-devel readline-devel zlib-devel
# rbenvでインストールできるrubyバージョン確認
$ rbenv install --list
2.6.7
2.7.3
3.0.1
jruby-9.2.17.0
mruby-3.0.0
rbx-5.0
truffleruby-21.1.0
truffleruby+graalvm-21.1.0
Only latest stable releases for each Ruby implementation are shown.
Use 'rbenv install --list-all / -L' to show all local versions.
# ruby 2.7系インストール
$ rbenv install 2.7.3
$ rbenv global 2.7.3
$ ruby -v
ruby 2.7.3p183 (2021-04-05 revision 6847ee089d) [x86_64-linux]
InSpecインストール
$ curl https://omnitruck.chef.io/install.sh | sudo bash -s -- -P inspec
$ inspec -v
4.37.0
インストールができましたので、続いて簡単なテストコードを記載します。
テスト実行
describe package('httpd') do
it { should be_installed }
end
Apacheがインストールされているか確認するためのテストコードです。
ローカルマシンで実行する場合、inspec exec installed-apache.rb
で実行できます。
$ inspec exec installed-apache.rb
# インストールしている場合
Profile: tests from httpd.rb (tests from httpd.rb)
Version: (not specified)
Target: local://
System Package httpd
✔ is expected to be installed
Test Summary: 1 successful, 0 failures, 0 skipped
# インストールしていない場合
Profile: tests from installed-apache.rb (tests from installed-apache.rb)
Version: (not specified)
Target: local://
System Package httpd
× is expected to be installed
expected that `System Package httpd` is installed
Test Summary: 0 successful, 1 failure, 0 skipped
describe.one
を使うことで複数の条件の中から1つ満たせば全体のテストが成功になるテストケースを書くこともできます。
control 'or-test' do
impact 1.0
title 'This is a OR test Apache or Nginx'
describe.one do
describe package('httpd') do
it { should be_installed }
end
describe package('nginx') do
it { should be_installed }
end
end
end
$ inspec exec a-or-b-test.rb
Profile: tests from a-or-b-test.rb (tests from a-or-b-test.rb)
Version: (not specified)
Target: local://
✔ or-test: This is a OR test Apache or Nginx
✔ System Package httpd is expected to be installed
Profile Summary: 1 successful control, 0 control failures, 0 controls skipped
Test Summary: 1 successful, 0 failures, 0 skipped
ローカル上で実行しましたので、今度はリモート先で同じようにテストができるか確認します。
リモート先でテストを実行する場合は-tオプションでリモート先マシンの情報を指定します。
inspec exec httpd.rb -t ssh://user@IPaddress -i pubkey
$ inspec exec installed-apache.rb -t ssh://ec2-user@13.230.244.157 -i ~/.ssh/TokyoKeyPair.pem
Profile: tests from installed-apache.rb (tests from installed-apache.rb)
Version: (not specified)
Target: ssh://ec2-user@13.230.244.157:22
System Package httpd
✔ is expected to be installed
Test Summary: 1 successful, 0 failures, 0 skipped
所感
InSpecを使って簡単なテストを実行してみました。
今回実施したサンプルコードではServerspecとの差別点はあまりないように感じられますが、Chef社のドキュメントによるとInSpecはよりセキュリティ部門に最適化されたツールであると明記されています。
One of the key differences is that Chef InSpec targets more user groups. It is optimized for DevOps, Security, and Compliance professionals.
今後も使い方を学んで実践で使えるようにしていこうと思います。
参考文献
Discussion