私は、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-user
kitchen converge
serverspec でこれを行うためのより慣用的な方法があるかどうかはわかりませんが、コマンドを次のように変更したところ、テストに合格するようになりました。
runuser -l ec2-user -c 'rbenv versions'
これによりroot
、別のユーザーとしてコマンドを実行できます。この種のテストを行うためのより良い方法を誰かが知らない限り、これを質問への回答として追加します。