読者です 読者をやめる 読者になる 読者になる

set setting reset

インフラ関連の小ネタと備忘録

ssh で rake spec する時に sudo password が渡せない

追記

serverspec の実行時や、ローカルPCの環境変数に sudo_password を設定すればデフォルトのままで問題ありませんでした。

Sudo password support

If you log into servers as non-root user, Serverspec add "sudo" in front of the command. You can specify sudo password like this.

$ SUDO_PASSWORD=xxxxxxxx rake spec

Or display prompt for sudo password if you run Serverspec like this.

$ ASK_SUDO_PASSWORD=1 rake spec

tutorial を先に読まないとこういうことになりますね。猛省します。

追記ここまで

.ssh/config や /etc/hosts をごにょごにょして、
デフォルトの spec_helper.rb を使って鍵認証でもパスワード認証でも ssh ログインまでできたのですが、sudo できずにエラーで終了してしまいます。

$ rake spec
(in /home/vagrant/serverspec)
/home/vagrant/.rbenv/versions/2.2.3/bin/ruby -I/home/vagrant/.rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/rspec-support-3.4.0/lib:/home/vagrant/.rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/rspec-core-3.4.1/lib /home/vagrant/.rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/rspec-core-3.4.1/exe/rspec --pattern spec/test-001/\*_spec.rb

Package "postgresql-9.3"
hoge@test-001's password:
Wrong sudo password! Please confirm your password on test-001.

Finished in 6.7 seconds (files took 0.37223 seconds to load)
1 example, 0 failures

/home/vagrant/.rbenv/versions/2.2.3/bin/ruby -I/home/vagrant/.rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/rspec-support-3.4.0/lib:/home/vagrant/.rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/rspec-core-3.4.1/lib /home/vagrant/.rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/rspec-core-3.4.1/exe/rspec --pattern spec/test-001/\*_spec.rb failed

必要な環境変数null なことが原因のようです。

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 = failse }
else
  set :sudo_password, ENV['SUDO_PASSWORD']
end

対象は ASK_SUDO_PASSWORDSUDO_PASSWORD の両方の様で、
上記 if 文の後に puts ENV['ASK_SUDO_PASSWORD'] と、 puts ENV['SUDO_PASSWORD'] したら結果は null 。
なので、highline がインストールされているかどうかのチェックもできず落ちていた模様。

(highline が未インストールだったのでパスワード認証の時に、標準入力にパスワード丸見えになってしまった・・)

なので if 文を削って強制的に sudo password を入力させることにしました。
(環境変数を追加するのはちょっと抵抗あるので)
また、ssh が成功した時に set :request_pty, true と書くように怒られたので、追記しています。

require 'serverspec'
require 'net/ssh'

set :backend, :ssh
set :request_pty, true

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 }

host = ENV['TARGET_HOST']

options = Net::SSH::Config.for(host)

options[:user] ||= Etc.getlogin

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

これでパスワードでも鍵認証でも実行できました。が、本当にこれでいいんだろうか。。。