ようへいの日々精進XP

よかろうもん

超メモで走り切る 2015 年(1)〜 Serverspec で任意の ssh config ファイルを利用する 〜

tl;dr

Serverspec でリモートホストをテストする際の ssh は ${HOME}/.ssh/config を利用するようだが、${HOME}/.ssh/config 以外のファイルを利用出来ないものか気になって眠れなかったので調べたメモ。(単に調べ方が悪かったのかもしれないけど)


memo

そもそも

Serverspec というよりも Net::SSH を見るべきだった。

ssh config ファイルの例

$ cat ~/.ssh/ecs_ssh_config 
Host ecs
  hostname xx.xx.xx.xx
  user ubuntu
  IdentityFile ~/.ssh/key.pem

Net::SSH::Config

Net::SSH::Config クラスの for メソッドの引数で指定する。

Net::SSH::Config.for(host, files=["~/.ssh/ecs_ssh_config"])

files とあるし、配列で指定するっぽいから、ファイルは複数指定出来るようだ。

spec_helper.rb を魔改造

以下のように魔改造

require 'serverspec'
require 'net/ssh'

set :backend, :ssh

if ENV['ASK_SUDO_PASSWORD']
  begin
    require 'highline/import'
  rescue LoadError
    fail "highline is not available. Try installing it."
  end
  set :sudo_password, ask("Enter sudo password: ") { |q| q.echo = false }
else
  set :sudo_password, ENV['SUDO_PASSWORD']
end

host = ENV['TARGET_HOST']

unless ENV['SSH_CONFIG_FILE']
  options = Net::SSH::Config.for(host)
else
  options = Net::SSH::Config.for(host, files=[ENV['SSH_CONFIG_FILE']])
end

options[:user] ||= Etc.getlogin

set :host,        options[:host_name] || host
set :ssh_options, options

試す

docker_container リソース

以下のようなテストファイルを書く。

require 'spec_helper'

describe docker_container('nginx') do
  it { should be_running }
end

もちろん、spec_helper.rb は上述のように任意の ssh config を指定する。

テスト

リモートホストで nginx コンテナが起動しているかをテストする。

$ SSH_CONFIG_FILE="~/.ssh/ecs_ssh_config" rake
/path/to/.rbenv/versions/2.2.3/bin/ruby -I/path/to/.rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/rspec-core-3.4.1/lib:/path/to/.rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/rspec-support-3.4.1/lib /path/to/.rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/rspec-core-3.4.1/exe/rspec --pattern spec/ecs/\*_spec.rb

Docker container "nginx"
  should be running

Finished in 6.17 seconds (files took 0.46187 seconds to load)
1 example, 0 failures

おけおけ、起動している。しかも、任意の ssh config で。


ということで

捗るかも

プロジェクト毎やロール毎に ssh config を分けていたりする場合に捗るかもしれない...。

ずっと気になっていたことなので...

嬉しい、クリスマスプレゼントだった。