首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >厨师厨房(厨房-EC2)服务规范失败并导致错误

厨师厨房(厨房-EC2)服务规范失败并导致错误
EN

Stack Overflow用户
提问于 2016-06-15 23:14:30
回答 1查看 276关注 0票数 0

我正在学习厨师和使用厨房进行ec2驱动程序的测试过程,并有以下serverspec文件:

代码语言:javascript
复制
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时,第一个测试通过了,但是第二个测试失败并导致一个错误:

代码语言:javascript
复制
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的形式运行命令,这意味着在kitchen converge期间对ec2-user路径的更改是不可用的。

我不知道使用serverspec是否有更多的惯用方法,但我更改了命令,现在测试通过了:

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

这允许root以另一个用户的身份运行命令。除非有人知道做这种测试的更好的方法,否则我会把这个作为这个问题的答案。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-06-16 12:53:43

serverspec将其命令作为root运行,因此在收敛过程中对任何其他用户路径进行的更改都是无关紧要的。

使用Linux runuser命令将允许root以另一个用户的身份运行命令,从而访问该用户的$PATH

代码语言:javascript
复制
runuser -l ec2-user -c 'rbenv versions'
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37847358

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档