Chef Kitchen (kitchen-ec2) serverspec 规范失败并导致错误
Chef Kitchen (kitchen-ec2) serverspec spec failing and causing error
我正在学习使用 Kitchen 和 ec2 驱动程序的 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
第一个测试通过但第二个测试失败并导致错误时:
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 运行s 命令时 $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
的路径在 [=21= 期间发生的变化] 不可用。
我不知道是否有更惯用的方法来使用 serverspec 执行此操作,但我将我的命令更改为此并且测试现在通过了:
runuser -l ec2-user -c 'rbenv versions'
这允许 root
以 运行 作为另一个用户的命令。除非有人知道进行此类测试的更好方法,否则我会将其添加为问题的答案。
serverspec 运行它的命令是 root,因此在收敛期间对任何其他用户的路径所做的更改都是无关紧要的。
使用 Linux runuser
命令将允许 root
以 运行 另一个用户的命令,从而获得对该用户的 $PATH
的访问权限:
runuser -l ec2-user -c 'rbenv versions'
我正在学习使用 Kitchen 和 ec2 驱动程序的 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
第一个测试通过但第二个测试失败并导致错误时:
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 运行s 命令时 $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
的路径在 [=21= 期间发生的变化] 不可用。
我不知道是否有更惯用的方法来使用 serverspec 执行此操作,但我将我的命令更改为此并且测试现在通过了:
runuser -l ec2-user -c 'rbenv versions'
这允许 root
以 运行 作为另一个用户的命令。除非有人知道进行此类测试的更好方法,否则我会将其添加为问题的答案。
serverspec 运行它的命令是 root,因此在收敛期间对任何其他用户的路径所做的更改都是无关紧要的。
使用 Linux runuser
命令将允许 root
以 运行 另一个用户的命令,从而获得对该用户的 $PATH
的访问权限:
runuser -l ec2-user -c 'rbenv versions'