忙しい人向けのserverspec入門 ~HelloWorld編~

目的

serverspecを使ってみたいけど、勉強する時間がなかなか取れず、使い始めるのを躊躇している人のために、 とりあえずserverspecの便利さを体験してもらいたい。

動機

serverspecを使ってみたいけど、導入するための準備がなかなか進まない、という話を最近よく耳にするのがきっかけ。

serverspecは普段ansibleで作ったLinux環境をテストするのに頻繁に使っているので、個人的には使い手が 増えてほしいツールの一つなのだが、確かに、準備をするには面倒な作業が必要になる。 そのため、敷居を高く感じてしまう人もいると思う。

全く何もないWindows環境でserverspecを動かせる環境を作るには、少なくとも下記のステップを踏まなければならない。

  1. Linuxサーバーを少なくとも2台(serverspecを実行するサーバーと、テスト対象のサーバー)用意する

  2. serverspec を実行するサーバーに、ruby,gem, bundler をインストールする

  3. servespec を実行するサーバーから、テスト対象のサーバーにSSHで接続できるようにする

  4. ruby(正確にはrspec)でテストコードを書く

  5. rake コマンドでserverspecを実行

といった感じである。 Linuxrubyを使い慣れている人にとってはなじみの作業が多いが、慣れていない人には、hello world するだけでも かなりの時間と労力を要する作業になってしまう。

ただ、ここで挫折して、serverspecを使わずに手作業で、リリースのたびに細かい環境テストを実行するのは非常に時間がもったいないし、 管理するサーバーの台数が増えればミスも増えてくるだろうから、お客さんにとっても、開発者にとっても、不幸な結果を 生みかねない。 単純な作業はserverspecに肩代わりしてもらって、余った時間を別の作業に充てたほうが、双方ハッピーになれるはずである。

なので、上記の作業に慣れていない人でも30分ぐらいで HelloWorldにこぎつけられるようにして、気軽にserverspecの導入を検討してもらえるようになってほしい。

動作環境 バージョン情報

Windows10

Vagrant2.0

VirtualBox 5.1.26

前提

Vagrant,VirtualBoxはインストール済みである前提です。(インストール方法は公式サイトを見てください。ごめんなさい)

やること

1. Linux サーバーを2台用意する & 2. serverspec を実行するサーバーに、ruby,gem, bundler をインストールする

いつも通り、下記のVagrantfileを作成して、VirtualBox仮想マシンを2台作ります。

Vagrant.configure(2) do |config|
  SERVERS.map do |hostname, ipaddress|
    config.vm.define hostname.to_s do |conf|
      conf.vm.provider "virtualbox" do |vb|
        vb.name = hostname.to_s
        vb.memory = "2048"
      end
      conf.vm.box = "bento/centos-7.2"
      conf.vm.hostname = hostname.to_s
      conf.vm.network "private_network", ip: ipaddress

      conf.vm.provision :shell, inline: <<-SHELL 
      for interface in $(grep 'NM_CONTROLLED=no' /etc/sysconfig/network-scripts/ifcfg-* -l)
      do
        sudo sed -i -e 's/NM_CONTROLLED=no/NM_CONTROLLED=yes/' $interface
        sudo ifdown $interface
        sudo ifup $interface
      done
      SHELL

      conf.vm.provision :shell, inline: <<-SHELL if hostname.to_s == 'serverspec'
        sudo yum install -y git
        sudo git clone https://github.com/sstephenson/rbenv.git /usr/local/rbenv
        sudo git clone https://github.com/sstephenson/ruby-build.git /usr/local/rbenv/plugins/ruby-build
        sudo touch /etc/profile.d/rbenv.sh
        sudo chmod 777 /etc/profile.d/rbenv.sh
        echo 'export RBENV_ROOT="/usr/local/rbenv"' >> /etc/profile.d/rbenv.sh
        echo 'export PATH="${RBENV_ROOT}/bin:${PATH}"'  >> /etc/profile.d/rbenv.sh
        echo 'eval "$(rbenv init -)"'  >> /etc/profile.d/rbenv.sh
        sudo chmod -R 755 /usr/local/rbenv
        sudo yum install -y gcc openssl-devel readline-devel zlib-devel bundler
        sudo -i rbenv install 2.4.2
        sudo -i rbenv global 2.4.2
        sudo -i -u vagrant mkdir /home/vagrant/serverspec
        sudo -i -u vagrant ssh-keygen < <(echo; echo)
      SHELL

      conf.vm.provision :shell, inline: <<-SHELL if hostname.to_s == 'webserver'
        sudo yum install -y httpd
        sudo systemctl start httpd
        sudo systemctl enable httpd
      SHELL
    end
  end
end

SERVERS = {
  serverspec: '192.168.56.200',
  webserver: '192.168.56.201',
}

上記のVagrantfile を適当なディレクトリに保存したあと、コマンドプロンプト(PowershellWindow)でそのディレクトリにcdして、vagrant upコマンドを実行すれば、VirtualBox上にLinuxサーバーが2台出来上がります。

出来上がったサーバーの簡単な情報を下表に示します。

# サーバー名 概要 IPアドレス ログインユーザー パスワード
1 serverspec サーバースペックを実行するサーバーです。ruby, gem, bundler はインストール済みです。 192.168.56.200 vagrant vagrant
2 webserver テスト対象のサーバーです。apache httpdがインストール済みで、サービスが立ち上がっています。 192.168.56.201 vagrant vagrant

出来上がったサーバーには、TeraTerm等のSSHクライアントを使ってアクセスしてください。

3. servespec を実行するサーバーから、テスト対象のサーバーにSSHで接続できるようにする

テスト対象のサーバーにSSHで接続するには、テスト対象のサーバーの~/.ssh/authorized_keys に、serverspecサーバーの公開鍵情報を 書き込んであげる必要があります。 コピペでやってもいいですが、せっかくなので、 ssh-copy-id を使います。 serverspec サーバーにSSH でログインしたら、下記のコマンドを実行しましょう。

 ssh-copy-id -i ~/.ssh/id_rsa vagrant@192.168.56.201

上記のコマンドを実行すると、2回英語で質問されるので、1回目はyes 2回目は、vagrantユーザーのパスワードをそれぞれ答えてください。

終了すると、webserver の /home/vagrant/.ssh/authorized_keys に、serverspecサーバーの公開鍵情報がめでたく書き込まれます。 ssh-copy-idコマンドは、ディレクトリの作成やパーミッションの設定などを適宜やってくれるので、コピペに比べ、ミスも少なく安心です。

SSHで接続できることを確認するには、serverspecサーバー上で下記のコマンドを実行してください。

ssh vagrant@192.168.56.201 : ;echo $?

このコマンドを実行して、標準出力に0と表示されれば設定は成功しています。 パスワードを聞かれたり、0以外の数字が出力され場合は、ssh-copy-id コマンドを再度実行してみるか、webserverの/home/vagrant/.ssh/authorized_keysに serverspecサーバーの公開鍵情報をコピペしてください。

4. テストコードを書く

これでやっとserverspecを実行するための前提条件が整いました。

ここからは、『webserverにapacheがインストール済みであることを確認するテスト』を実行するまでの手順を説明します。

まず、serverspecサーバーで、下記コマンドを実行してください。

cd ~/serverspec
sudo -i gem install serverspec rake

コマンドが成功したら、下記コマンドを実行して、必要なファイルを生成します。

serverspec-init

いくつか質問されるので、下記の通り答えましょう。

Select OS type:

1) UN*X
2) Windows

Select number: 1

Select a backend type:

1) SSH
2) Exec (local)

Select number: 1

Vagrant instance y/n: n

Input target host name: 192.168.56.201

ここまで出来たら準備完了。

下記のようなファイル、ディレクトリが出来上がるはずです。

/home/vagrant/serverspec/  
   |  
   |- Rakefile  
   |- spec_helper.rb  
   |- spec/  
         |- 192.168.56.201/  
                 |- sample_spec.rb  

ここから、sample_spec.rbを編集して、テストをすることになるのですが、serverspec-init コマンドで作成したsample_spec.rbには、 幸いにも、「webserverにapacheがインストール済みで、80番ポートで待ち構えていることを確認する」という内容のテストが すでに記述されています。

ので、ひとまず実行します。

rake spec

コマンドを実行すると、オールグリーンでテストが終了します。

※webserverのapacheを止めたり、アンインストールしたりすると、それぞれテストが失敗するので、やってみてください。

やっていること。。。の説明は次回

前置きが長くなってしまったので、serverspecが実行している処理の中身や、制御方法については次回解説します。