3
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

ansible_specでsudoパスワードが設定できない

Last updated at Posted at 2018-11-29

追記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']というものがセットされている。

spec/spec_helper.rb
  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_passwordset :sudo_passwordに書き換える。
serverspecと合わせるため、ENVの部分も書き換える。

spec/spec_helper.rb
-  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

3
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?