🐁

テストフレームワークInSpecを触ってみた

2020/11/30に公開

概要

先日、IBMが主催するイベント「Enterprise Server Meetup」の第2回が開催されました。
第2回のテーマがインフラ運用・構築の自動化で、個人的に興味のある内容でしたので参加してみました。
そのなかではじめて目にしたツールがありましたので、早速触ってみました。

InSpecとは

構成管理ツールChefの開発で知られているChef社がOSSとしてRubyで開発されているテストフレームワークです。
https://docs.chef.io/inspec/
テストフレームワークとして有名なServerspecからインスパイアされており、互換性はもちろん後発の利点としてAWSリソースに対するサポートが豊富であるなどの点があげられます。
はじめて使いますので、まずは公式リポジトリのREADMEに記載されているインストール方法とサンプルコマンドを実行して試してみます。
https://github.com/inspec/inspec#chef-inspec-inspect-your-infrastructure

インストール手順

上記のリポジトリ内に紹介された手順で進めていきます。環境は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

インストールができましたので、続いて簡単なテストコードを記載します。

テスト実行

installed-apache.rb
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つ満たせば全体のテストが成功になるテストケースを書くこともできます。

a-or-b-test.rb
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.

https://docs.chef.io/inspec/inspec_and_friends/#how-is-chef-inspec-different-from-serverspec

今後も使い方を学んで実践で使えるようにしていこうと思います。

参考文献

https://qiita.com/NaokiIshimura/items/ff04b6eaa40b33c4bea8

https://github.com/inspec/inspec#chef-inspec-inspect-your-infrastructure

https://docs.chef.io/inspec/inspec_and_friends/

GitHubで編集を提案

Discussion