追記20190701
このページで書いている問題は、以下のansible_specのPRがマージされたことで、解消されました。
https://github.com/volanja/ansible_spec/pull/125
概要
ansible_specでsudoパスワードを設定しても、以下のエラーが出て、ssh接続できない。
$ ASK_BECOME_PASSWORD=1 bundle exec rake all
vendor/bundle/ruby/2.5.0/gems/specinfra-2.76.3/lib/specinfra/backend/ssh.rb:76:in `create_ssh': Passing nil, or [nil] to Net::SSH.start is deprecated for keys
: keys
Please set sudo password to Specinfra.configuration.sudo_password.
環境
- CentOS 7.5
- ruby 2.5.0
関連記事
調査
serverspecでのsudoパスワードの設定方法
serverspecでsudoが必要な場合は、以下のようにコマンドに変数を付けるか、export SUDO_PASSWORD=xxxx
のように環境変数をセットする。
$ ASK_SUDO_PASSWORD=1 bundle exec rake all
しかし、ansible_specで同様にしてテストを実行すると、以下のエラーが出てssh接続できない。
Please set sudo password
は、serverspecでsudoパスワードがセットされていないときに出力されるエラーだ。
vendor/bundle/ruby/2.5.0/gems/specinfra-2.76.3/lib/specinfra/backend/ssh.rb:76:in `create_ssh': Passing nil, or [nil] to Net::SSH.start is deprecated for keys
: keys
Please set sudo password to Specinfra.configuration.sudo_password.
serverspecとansible_specの違い
spec/spec_helper.rbを確認したところ、ENV['ASK_BECOME_PASSWORD']
とENV['BECOME_PASSWORD']
というものがセットされている。
if ENV['ASK_BECOME_PASSWORD']
begin
require 'highline/import'
rescue LoadError
fail "highline is not available. Try installing it."
end
set :become_password, ask("Enter become password: ") { |q| q.echo = false }
else
set :become_password, ENV['BECOME_PASSWORD']
end
そこで、以下のようにコマンドを変えてみた。
しかし結果は変わらなかった。
$ ASK_BECOME_PASSWORD=1 bundle exec rake all
set :become_password
??
もう少しspec/spec_helper.rbを見てみると、set :become_password
と定義されている箇所がある。
set :become_password, ask("Enter become password: ") { |q| q.echo = false }
set :become_password, ENV['BECOME_PASSWORD']
ここは、serverspecではset :sudo_password
と定義されている箇所だ。
解決方法
set :become_password
をset :sudo_password
に書き換える。
serverspecと合わせるため、ENV
の部分も書き換える。
- if ENV['ASK_BECOME_PASSWORD']
+ if ENV['ASK_SUDO_PASSWORD']
begin
require 'highline/import'
rescue LoadError
fail "highline is not available. Try installing it."
end
- #set :become_password, ask("Enter become password: ") { |q| q.echo = false }
+ set :sudo_password, ask("Enter sudo password: ") { |q| q.echo = false }
else
- #set :become_password, ENV['BECOME_PASSWORD']
+ set :sudo_password, ENV['SUDO_PASSWORD']
end
これでsudoパスワードをセットでき、ssh接続、テストも正常に実行された。
interactiveではなく、環境変数を使う場合はexport SUDO_PASSWORD=xxxx
を実行してください。
$ ASK_SUDO_PASSWORD=1 bundle exec rake all
ansible_specのソースをちゃんと読んでいないが、なぜこういう実装になっているんだろう。
grepしてみた感じでは、該当箇所は以下。
$ grep -i 'become_password' . -r
./spec/spec_helper.rb: set :become_password, ask("Enter become password: ") { |q| q.echo = false }
./spec/spec_helper.rb: set :become_password, ENV['BECOME_PASSWORD']
./vendor/bundle/ruby/2.5.0/gems/ansible_spec-0.2.25/lib/src/spec/spec_helper.rb: if ENV['ASK_BECOME_PASSWORD']
./vendor/bundle/ruby/2.5.0/gems/ansible_spec-0.2.25/lib/src/spec/spec_helper.rb: set :become_password, ask("Enter become password: ") { |q| q.echo = false }
./vendor/bundle/ruby/2.5.0/gems/ansible_spec-0.2.25/lib/src/spec/spec_helper.rb: set :become_password, ENV['BECOME_PASSWORD']
他の箇所に対する影響などは今の所不明だが、とりあえずこの方法で対応する。
Issue
Issueで問い合わせ中。
以下のPRで修正されました。
https://github.com/volanja/ansible_spec/pull/125