0

私は、ec2 ドライバーで Kitchen を使用して Chef とテスト プロセスを学習しており、次の serverspec ファイルがあります。

require "serverspec"

set :backend, :exec

describe "rbenv" do
  describe file("/home/ec2-user/.rbenv") do
    it { should be_directory }
  end

  describe command("rbenv versions") do
    its(:exit_status) { should eq 0 }
  end
end

最初のテストを実行kitchen verify amazon-linuxすると成功しますが、2 番目のテストは失敗し、エラーが発生します。

rbenv
         File "/home/ec2-user/.rbenv"
           should be directory
         Command "rbenv versions"
           exit_status
             should eq 0 (FAILED - 1)

       Failures:

         1) rbenv Command "rbenv versions" exit_status should eq 0
            Failure/Error: its(:exit_status) { should eq 0 }

              expected: 0
                   got: 127

              (compared using ==)
              /bin/sh -c rbenv\ versions

            # /tmp/verifier/suites/serverspec/rbenv_spec.rb:11:in `block (3 levels) in <top (required)>'

 Finished in 0.05481 seconds (files took 0.30304 seconds to load)
       2 examples, 1 failure

       Failed examples:

       rspec /tmp/verifier/suites/serverspec/rbenv_spec.rb:11 # rbenv Command "rbenv versions" exit_status should eq 0

       /opt/chef/embedded/bin/ruby -I/tmp/verifier/suites/serverspec -I/tmp/verifier/gems/gems/rspec-support-3.4.1/lib:/tmp/ver
ifier/gems/gems/rspec-core-3.4.4/lib /opt/chef/embedded/bin/rspec --pattern /tmp/verifier/suites/serverspec/\*\*/\*_spec.rb --c
olor --format documentation --default-path /tmp/verifier/suites/serverspec failed
       !!!!!! Ruby Script [/tmp/verifier/gems/gems/busser-serverspec-0.5.9/lib/busser/runner_plugin/../serverspec/runner.rb /tm
p/verifier/suites/serverspec] exit code was 1
>>>>>> Verify failed on instance <default-amazon-linux>.
>>>>>> Please see .kitchen/logs/default-amazon-linux.log for more details
>>>>>> ------Exception-------
>>>>>> Class: Kitchen::ActionFailed
>>>>>> Message: SSH exited (1) for command: [sh -c '
BUSSER_ROOT="/tmp/verifier"; export BUSSER_ROOT
GEM_HOME="/tmp/verifier/gems"; export GEM_HOME
GEM_PATH="/tmp/verifier/gems"; export GEM_PATH
GEM_CACHE="/tmp/verifier/gems/cache"; export GEM_CACHE

sudo -E /tmp/verifier/bin/busser test
']
>>>>>> ----------------------

サーバーに手動でログインして同じコマンド/bin/sh -c rbenv\ versionsを実行したところ、問題なく動作しました。

ここで私が間違っていることがあるかどうか誰にもわかりますか?

編集1

serverspec がコマンドを実行する$PATHと、手動でログインしたときの変数とは異なることがわかりました。puts ENV['PATH']テストに追加したところ、出力は次のようになりました。

/sbin:/bin:/usr/sbin:/usr/bin

ただし、手動でログインすると、次のようになります。

/home/ec2-user/.rbenv/shims:/home/ec2-user/.rbenv/bin:/home/ec2-user/.rbenv/shims:/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/opt/aws/bin:/home/ec2-user/.local/bin:/home/ec2-user/bin

テストのコマンドを に変更した/home/ec2-user/.rbenv/rbenv versionsところ、合格しました。ここでパスを正しく機能させるために何をする必要があるか考えていますか?

編集2

そのため、serverspec が としてコマンドを実行していることを発見しました。これは、実行中に行われた のパスrootへの変更が利用できないことを意味します。ec2-userkitchen converge

serverspec でこれを行うためのより慣用的な方法があるかどうかはわかりませんが、コマンドを次のように変更したところ、テストに合格するようになりました。

runuser -l ec2-user -c 'rbenv versions'

これによりroot、別のユーザーとしてコマンドを実行できます。この種のテストを行うためのより良い方法を誰かが知らない限り、これを質問への回答として追加します。

4

1 に答える 1

1

serverspec はそのコマンドを root として実行するため、収束中に他のユーザーのパスに加えられた変更は無関係です。

Linuxrunuserコマンドを使用するとroot、別のユーザーとしてコマンドを実行できるため、そのユーザーの$PATH:

runuser -l ec2-user -c 'rbenv versions'
于 2016-06-16T12:53:43.053 に答える