忙しい人向けのserverspec入門 ~HelloWorld編~
目的
serverspecを使ってみたいけど、勉強する時間がなかなか取れず、使い始めるのを躊躇している人のために、 とりあえずserverspecの便利さを体験してもらいたい。
動機
serverspecを使ってみたいけど、導入するための準備がなかなか進まない、という話を最近よく耳にするのがきっかけ。
serverspecは普段ansibleで作ったLinux環境をテストするのに頻繁に使っているので、個人的には使い手が 増えてほしいツールの一つなのだが、確かに、準備をするには面倒な作業が必要になる。 そのため、敷居を高く感じてしまう人もいると思う。
全く何もないWindows環境でserverspecを動かせる環境を作るには、少なくとも下記のステップを踏まなければならない。
Linuxサーバーを少なくとも2台(serverspecを実行するサーバーと、テスト対象のサーバー)用意する
serverspec を実行するサーバーに、ruby,gem, bundler をインストールする
servespec を実行するサーバーから、テスト対象のサーバーにSSHで接続できるようにする
rake コマンドでserverspecを実行
といった感じである。 Linuxやrubyを使い慣れている人にとってはなじみの作業が多いが、慣れていない人には、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が実行している処理の中身や、制御方法については次回解説します。