簡體   English   中英

Chef Kitchen(Kitchen-EC2)ServerSpec規范失敗並導致錯誤

[英]Chef Kitchen (kitchen-ec2) serverspec spec failing and causing error

我正在學習Chef和使用ec2驅動程序的Kitchen的測試過程,並且具有以下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運行命令時, $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用戶以另一個用戶身份運行命令。 除非有人知道做這種測試的更好方法,否則我將其添加為問題的答案。

serverspec以root用戶身份運行其命令,因此在融合過程中對其他任何用戶的路徑所做的更改都是無關緊要的。

使用Linux runuser命令將允許root用戶以另一個用戶身份運行命令,從而獲得對該用戶$PATH訪問權限:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM