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 を分けていたりする場合に捗るかもしれない...。
ずっと気になっていたことなので...
嬉しい、クリスマスプレゼントだった。