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_PASSWORD
と SUDO_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
これでパスワードでも鍵認証でも実行できました。が、本当にこれでいいんだろうか。。。