【Serverspec】【serverspec-runner】インストールと基本設定

インフラの構成管理で「Serverspec」を利用している企業は多いと思いますが、更に@hiracy様の「serverspec-runner」をインストールして「Serverspec」のテスト結果をレポートとして出力することができるようになります。

今回は「Serverspec」「serverspec-runner」のインストールと基本設定について解説します。

 

 

serverspec-runnerとは?

私はこの「serverspec-runner」は構成管理に最適だと思っていますが、なかなか情報がありません。

serverspec-runnerは@hiracy様が開発したツールです。

 

serverspec-runnerを使って複数のホストのテストレポートを作る

https://qiita.com/hiracy/items/1ebc7b82f1a6ffa69ed0

 

serverspec-runnerの特徴

serverspec-runnerの特徴です。

 

 

Serverspecのインストール手順

今回インストールする環境です。

OSは「CentOS 7.4」です。

[test@cent07 example]$ cat /etc/redhat-release
CentOS Linux release 7.4.1708 (Core)
[test@cent07 example]$

 

Ruby環境があるか確認します。

[test@cent07 ~]$ ruby -v
ruby 2.0.0p648 (2015-12-16) [x86_64-linux]
[test@cent07 ~]$

 

 

「Serverspec」と「serverspec-runner」は「gem」からインストールします。

 

gem(ジェム)とは

gem(ジェム)とは Ruby のパッケージ管理ツールです。

gemはジェムと呼びます。(少なくとも私の周りでは・・)

例えば、Ruby でツールやライブラリが開発され公開されている場合、gem コマンドでインストールしたりアップデートすることができます。

 

RubyGems

https://rubygems.org/

 

 

現在の gem のバージョンチェック

「gem -v」コマンドでバージョンをチェックできます。

[test@cent07 ~]$ gem -v
2.0.14.1
[test@cent07 ~]$

 

 

gemで serverspec をインストール

rakeをインストールします。

[test@cent07 ~]$ sudo gem install rake
Fetching: rake-12.3.0.gem (100%)
Successfully installed rake-12.3.0
Parsing documentation for rake-12.3.0
Installing ri documentation for rake-12.3.0
1 gem installed
[test@cent07 ~]$

 

 

serverspec をインストールします。

[test@cent07 ~]$ sudo gem install serverspec
Fetching: rspec-support-3.7.1.gem (100%)
Successfully installed rspec-support-3.7.1
Fetching: rspec-core-3.7.1.gem (100%)
Successfully installed rspec-core-3.7.1
Fetching: diff-lcs-1.3.gem (100%)
Successfully installed diff-lcs-1.3
Fetching: rspec-expectations-3.7.0.gem (100%)
Successfully installed rspec-expectations-3.7.0
Fetching: rspec-mocks-3.7.0.gem (100%)
Successfully installed rspec-mocks-3.7.0
Fetching: rspec-3.7.0.gem (100%)
Successfully installed rspec-3.7.0
Fetching: rspec-its-1.2.0.gem (100%)
Successfully installed rspec-its-1.2.0
Fetching: multi_json-1.13.1.gem (100%)
Successfully installed multi_json-1.13.1
Fetching: net-ssh-4.2.0.gem (100%)
Successfully installed net-ssh-4.2.0
Fetching: net-scp-1.2.1.gem (100%)
Successfully installed net-scp-1.2.1
Fetching: net-telnet-0.1.1.gem (100%)
Successfully installed net-telnet-0.1.1
Fetching: sfl-2.3.gem (100%)
Successfully installed sfl-2.3
Fetching: specinfra-2.73.2.gem (100%)
Successfully installed specinfra-2.73.2
Fetching: serverspec-2.41.3.gem (100%)
Successfully installed serverspec-2.41.3
Parsing documentation for rspec-support-3.7.1
Installing ri documentation for rspec-support-3.7.1
Parsing documentation for rspec-core-3.7.1
Installing ri documentation for rspec-core-3.7.1
Parsing documentation for diff-lcs-1.3
Couldn't find file to include 'Contributing.rdoc' from README.rdoc
Couldn't find file to include 'License.rdoc' from README.rdoc
Installing ri documentation for diff-lcs-1.3
Parsing documentation for rspec-expectations-3.7.0
Installing ri documentation for rspec-expectations-3.7.0
Parsing documentation for rspec-mocks-3.7.0
Installing ri documentation for rspec-mocks-3.7.0
Parsing documentation for rspec-3.7.0
Installing ri documentation for rspec-3.7.0
Parsing documentation for rspec-its-1.2.0
Installing ri documentation for rspec-its-1.2.0
Parsing documentation for multi_json-1.13.1
Installing ri documentation for multi_json-1.13.1
Parsing documentation for net-ssh-4.2.0
Installing ri documentation for net-ssh-4.2.0
Parsing documentation for net-scp-1.2.1
Installing ri documentation for net-scp-1.2.1
Parsing documentation for net-telnet-0.1.1
Installing ri documentation for net-telnet-0.1.1
Parsing documentation for sfl-2.3
Installing ri documentation for sfl-2.3
Parsing documentation for specinfra-2.73.2
Installing ri documentation for specinfra-2.73.2
Parsing documentation for serverspec-2.41.3
Installing ri documentation for serverspec-2.41.3
14 gems installed
[test@cent07 ~]$

 

 

gem で serverspec-runner をインストール

serverspec-runner をインストールします。

[test@cent07 ~]$ sudo gem install serverspec-runner
Fetching: serverspec-runner-1.2.2.gem (100%)
Successfully installed serverspec-runner-1.2.2
Parsing documentation for serverspec-runner-1.2.2
Installing ri documentation for serverspec-runner-1.2.2
1 gem installed
[test@cent07 ~]$

 

 

serverspec-runner の実行

インストールが終わったら、デフォルトの状態で「serverspec-runner」を実行してみます。

[test@cent07 serverspec]$ serverspec-runner
want to create spec-tree to /home/test/serverspec? (y/n): y
Please edit "/home/test/serverspec/scenario.yml" and change directory to "/home/test/serverspec" and exc "serverspec-runner" command !!
[test@cent07 serverspec]$ serverspec-runner
/usr/bin/ruby -I/usr/local/share/gems/gems/rspec-core-3.7.1/lib:/usr/local/share/gems/gems/rspec-support-3.7.1/lib /usr/local/share/gems/gems/rspec-core-3.7.1/exe/rspec ./spec/example/default.rb

### start [example@anyhost-01] (127.0.0.1) serverspec... ###

User "root"
  should exist
  should have uid 0
  should have home directory "/root"

Group "root"
  should have gid 0

Filesystem
  File "/"
    should be mounted

Host "www.google.com"
  should be resolvable
  should be reachable

Command "dmesg | grep "FAIL\|Fail\|fail\|ERROR\|Error\|error""
  exit_status
    should not eq 0 (FAILED - 1)

Failures:

  1) Command "dmesg | grep "FAIL\|Fail\|fail\|ERROR\|Error\|error"" exit_status should not eq 0
     On host `anyhost-01'
     Failure/Error: its(:exit_status){ should_not eq 0 }

       expected: value != 0
            got: 0

       (compared using ==)
       env PATH="/usr/local/bin:/usr/sbin:/sbin:/usr/bin:/bin" /bin/sh -c dmesg\ \|\ grep\ \"FAIL\\\|Fa                                l\\\|fail\\\|ERROR\\\|Error\\\|error\"
       [    1.519720] pci 0000:00:15.3: BAR 13: failed to assign [io  size 0x1000]
[    1.519746] pci 0000:00:15.4: BAR 13: failed to assign [io  size 0x1000]
[    1.519760] pci 0000:00:15.5: BAR 13: failed to assign [io  size 0x1000]
[    1.519785] pci 0000:00:15.6: BAR 13: failed to assign [io  size 0x1000]
[    1.519811] pci 0000:00:15.7: BAR 13: failed to assign [io  size 0x1000]
[    1.519841] pci 0000:00:16.3: BAR 13: failed to assign [io  size 0x1000]
[    1.519854] pci 0000:00:16.4: BAR 13: failed to assign [io  size 0x1000]
[    1.519878] pci 0000:00:16.5: BAR 13: failed to assign [io  size 0x1000]
[    1.519903] pci 0000:00:16.6: BAR 13: failed to assign [io  size 0x1000]
[    1.519914] pci 0000:00:16.7: BAR 13: failed to assign [io  size 0x1000]
[    1.519938] pci 0000:00:17.3: BAR 13: failed to assign [io  size 0x1000]
[    1.519950] pci 0000:00:17.4: BAR 13: failed to assign [io  size 0x1000]
[    1.519976] pci 0000:00:17.5: BAR 13: failed to assign [io  size 0x1000]
[    1.520048] pci 0000:00:17.6: BAR 13: failed to assign [io  size 0x1000]
[    1.520074] pci 0000:00:17.7: BAR 13: failed to assign [io  size 0x1000]
[    1.520099] pci 0000:00:18.2: BAR 13: failed to assign [io  size 0x1000]
[    1.520112] pci 0000:00:18.3: BAR 13: failed to assign [io  size 0x1000]
[    1.520138] pci 0000:00:18.4: BAR 13: failed to assign [io  size 0x1000]
[    1.520163] pci 0000:00:18.5: BAR 13: failed to assign [io  size 0x1000]
[    1.520176] pci 0000:00:18.6: BAR 13: failed to assign [io  size 0x1000]
[    1.520201] pci 0000:00:18.7: BAR 13: failed to assign [io  size 0x1000]
[    1.520242] pci 0000:00:18.7: BAR 13: failed to assign [io  size 0x1000]
[    1.520268] pci 0000:00:18.6: BAR 13: failed to assign [io  size 0x1000]
[    1.520294] pci 0000:00:18.5: BAR 13: failed to assign [io  size 0x1000]
[    1.520307] pci 0000:00:18.4: BAR 13: failed to assign [io  size 0x1000]
[    1.520334] pci 0000:00:18.3: BAR 13: failed to assign [io  size 0x1000]
[    1.520360] pci 0000:00:18.2: BAR 13: failed to assign [io  size 0x1000]
[    1.520374] pci 0000:00:17.7: BAR 13: failed to assign [io  size 0x1000]
[    1.520400] pci 0000:00:17.6: BAR 13: failed to assign [io  size 0x1000]
[    1.520426] pci 0000:00:17.5: BAR 13: failed to assign [io  size 0x1000]
[    1.520439] pci 0000:00:17.4: BAR 13: failed to assign [io  size 0x1000]
[    1.520466] pci 0000:00:17.3: BAR 13: failed to assign [io  size 0x1000]
[    1.520491] pci 0000:00:16.7: BAR 13: failed to assign [io  size 0x1000]
[    1.520505] pci 0000:00:16.6: BAR 13: failed to assign [io  size 0x1000]
[    1.520530] pci 0000:00:16.5: BAR 13: failed to assign [io  size 0x1000]
[    1.520555] pci 0000:00:16.4: BAR 13: failed to assign [io  size 0x1000]
[    1.520567] pci 0000:00:16.3: BAR 13: failed to assign [io  size 0x1000]
[    1.520593] pci 0000:00:15.7: BAR 13: failed to assign [io  size 0x1000]
[    1.520618] pci 0000:00:15.6: BAR 13: failed to assign [io  size 0x1000]
[    1.520631] pci 0000:00:15.5: BAR 13: failed to assign [io  size 0x1000]
[    1.520656] pci 0000:00:15.4: BAR 13: failed to assign [io  size 0x1000]
[    1.520681] pci 0000:00:15.3: BAR 13: failed to assign [io  size 0x1000]

     # ./spec/example/default.rb:25:in `block (2 levels) in <top (required)>'

Finished in 1.81 seconds (files took 1.86 seconds to load)
8 examples, 1 failure

Failed examples:

rspec ./spec/example/default.rb:25 # Command "dmesg | grep "FAIL\|Fail\|fail\|ERROR\|Error\|error"" exit

_status should not eq 0

+--------------------------------------------------------------------------+
|description                                                      | result |
+--------------------------------------------------------------------------+
|example@anyhost-01(127.0.0.1)                                    |        |
|  User "root"                                                    |        |
|    should exist                                                 |   OK   |
|    should have uid 0                                            |   OK   |
|    should have home directory "/root"                           |   OK   |
|  Group "root"                                                   |        |
|    should have gid 0                                            |   OK   |
|  Filesystem                                                     |        |
|    File "/"                                                     |        |
|      should be mounted                                          |   OK   |
|  Host "www.google.com"                                          |        |
|    should be resolvable                                         |   OK   |
|    should be reachable                                          |   OK   |
|  Command "dmesg | grep "FAIL\|Fail\|fail\|ERROR\|Error\|error"" |        |
|    exit_status                                                  |        |
|      should not eq 0                                            |   NG   |
+--------------------------------------------------------------------------+
[test@cent07 serverspec]$

 

 

 

複数のホストに対して serverspec-runner を実施する

複数のホストに対して serverspec-runner で確認テストをする場合は、以下のように yml ファイルを設定します。

[test@cent07 serverspec]$ pwd
/home/test/serverspec
[test@cent07 serverspec]$ ls
_old  _platforms.yml  _serverspec_result.csv  lib  scenario.yml  spec  ssh_options_default.yml
[test@cent07 serverspec]$ vi scenario.yml
example:
  - centos7
  - cent06
  - test07
---
centos7:
  host:        192.168.1.12
cent06:
  host:        192.168.1.11
test07:
  host:        192.168.1.10
[test@cent07 serverspec]$

 

 

serverspec-runner での ssh のオプションを設定してパスワードプロンプトを表示させないようにする

複数のホストに対して serverspec-runner でテストをする際に1つ1つパスワードを入力するのは面倒です。

その場合は、「ssh_options_default.yml」ファイルに「パスワード」「パスフレーズ(鍵認証の場合)」を記載することができます。

[test@cent07 serverspec]$ pwd
/home/test/serverspec
[test@cent07 serverspec]$ ls
_old  _platforms.yml  _serverspec_result.csv  lib  scenario.yml  spec  ssh_options_default.yml
[test@cent07 serverspec]$ vi ssh_options_default.yml
:port: 22
:paranoid: false
:user: "test" ← ssh でログインする際のアカウント
#:keys: ["/path/to/private_key"] ← 鍵認証の場合はこちらのオプションを利用します。
#:passphrase: "xxxxxxxx"     ← 鍵認証の場合はこちらのオプションを利用します。
:password: "xxxxxxxx" ← ssh でログインする際のパスワード
[test@cent07 serverspec]$

 

 

 

複数ホストに対してパスワードプロンプトなしでの serverspec-runner の実行

 

[test@cent07 serverspec]$ serverspec-runner
/usr/bin/ruby -I/usr/local/share/gems/gems/rspec-core-3.7.1/lib:/usr/local/share/gems/gems/rspec-support-3.7.1/lib /usr/local/share/gems/gems/rspec-core-3.7.1/exe/rspec ./spec/example/default.rb

### start [example@centos7] (192.168.1.12) serverspec... ###

User "root"
:paranoid is deprecated, please use :verify_host_key. Supported values are exactly the same, only the name of the option has changed.
  should exist
  should have uid 0
  should have home directory "/root"

Group "root"
  should have gid 0

Filesystem
  File "/"
    should be mounted

Host "www.google.com"
  should be resolvable
  should be reachable

Finished in 5.38 seconds (files took 1.67 seconds to load)
7 examples, 0 failures

/usr/bin/ruby -I/usr/local/share/gems/gems/rspec-core-3.7.1/lib:/usr/local/share/gems/gems/rspec-support-3.7.1/lib /usr/local/share/gems/gems/rspec-core-3.7.1/exe/rspec ./spec/example/default.rb

### start [example@cent06] (192.168.1.11) serverspec... ###

User "root"
:paranoid is deprecated, please use :verify_host_key. Supported values are exactly the same, only the name of the option has changed.
  should exist
  should have uid 0
  should have home directory "/root"

Group "root"
  should have gid 0

Filesystem
  File "/"
    should be mounted

Host "www.google.com"
  should be resolvable
  should be reachable

Finished in 5.38 seconds (files took 1.67 seconds to load)
7 examples, 0 failures

/usr/bin/ruby -I/usr/local/share/gems/gems/rspec-core-3.7.1/lib:/usr/local/share/gems/gems/rspec-support-3.7.1/lib /usr/local/share/gems/gems/rspec-core-3.7.1/exe/rspec ./spec/example/default.rb

### start [example@test07] (192.168.1.10) serverspec... ###

User "root"
:paranoid is deprecated, please use :verify_host_key. Supported values are exactly the same, only the name of the option has changed.
  should exist
  should have uid 0
  should have home directory "/root"

Group "root"
  should have gid 0

Filesystem
  File "/"
    should be mounted

Host "www.google.com"
  should be resolvable
  should be reachable

Finished in 5.36 seconds (files took 1.68 seconds to load)
7 examples, 0 failures

+------------------------------------------------+
|description                            | result |
+------------------------------------------------+
|example@centos7(192.168.1.12)          |        |
|  User "root"                          |        |
|    should exist                       |   OK   |
|    should have uid 0                  |   OK   |
|    should have home directory "/root" |   OK   |
|  Group "root"                         |        |
|    should have gid 0                  |   OK   |
|  Filesystem                           |        |
|    File "/"                           |        |
|      should be mounted                |   OK   |
|  Host "www.google.com"                |        |
|    should be resolvable               |   OK   |
|    should be reachable                |   OK   |
|example@cent06(192.168.1.11)           |        |
|  User "root"                          |        |
|    should exist                       |   OK   |
|    should have uid 0                  |   OK   |
|    should have home directory "/root" |   OK   |
|  Group "root"                         |        |
|    should have gid 0                  |   OK   |
|  Filesystem                           |        |
|    File "/"                           |        |
|      should be mounted                |   OK   |
|  Host "www.google.com"                |        |
|    should be resolvable               |   OK   |
|    should be reachable                |   OK   |
|example@test07(192.168.1.10)           |        |
|  User "root"                          |        |
|    should exist                       |   OK   |
|    should have uid 0                  |   OK   |
|    should have home directory "/root" |   OK   |
|  Group "root"                         |        |
|    should have gid 0                  |   OK   |
|  Filesystem                           |        |
|    File "/"                           |        |
|      should be mounted                |   OK   |
|  Host "www.google.com"                |        |
|    should be resolvable               |   OK   |
|    should be reachable                |   OK   |
+------------------------------------------------+
[test@cent07 serverspec]$

 

 

実際はこんな感じです。

Teraterm の画面ですが、非常に見やすいですよね。

 

 

Posted by 100%レンタルサーバーを使いこなすサイト管理人