🐁

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

commits4 min read

概要

先日、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を使うことで複数の条件の中から一つ満たせば全体のテストが成功になるテストケースを書くこともできます。

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

ログインするとコメントできます