2016-06-15 2 views
0

Я учусь Chef и процесс тестирования с помощью Kitchen с драйвером ec2 и имеют следующий serverspec файл:Шеф кухни (кухни-ec2) 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 и она работала хорошо.

Может ли кто-нибудь сказать, есть ли что-то, что я делаю неправильно здесь?

EDIT 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 и он прошел. Любая идея, что мне нужно сделать, чтобы пути правильно работали здесь?

EDIT 2

Таким образом, я обнаружил, что serverspec работает команды, как root, что означает, что изменения в ec2-user «s путь, который имел место во время kitchen converge недоступны.

Я не знаю, есть ли более идиоматический способ сделать это с serverspec, но я изменил свою команду на это и тест в настоящее время проходит:

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

Это позволяет root выполнить команду как другой пользователь. Если кто-то не знает лучшего способа сделать такой тест, я добавлю это как ответ на вопрос.

+0

Попробуйте проверить вывод: 'его (: стандартный вывод) {должен эквалайзер«» } 'и аналогично stderr. Это отобразит их на выходе rspec. – coderanger

+0

@coderanger Я только что понял (еще не добавил к OP), что, когда serverpec запускает команду, переменная '$ PATH' отличается. Я изменил команду на '/home/ec2-user/.rbenv/rbenv versions' и тест прошел. Любая идея, что мне нужно сделать, чтобы пути правильно работали здесь? – sixty4bit

+0

ОК, поэтому я, наконец, понял, что serverpec запускает тесты как пользователь root ... поэтому изменения, которые я сделал для '$ PATH' ec2-user, недоступны ... – sixty4bit

ответ

1

serverspec выполняет свои команды как root, поэтому изменения, внесенные на любой другой путь пользователя при конвергенции, не имеют значения.

Использование команды Linux runuser позволит root выполнить команду от имени другого пользователя, что позволяет получить доступ к этому пользователю $PATH:

runuser -l ec2-user -c 'rbenv versions' 
Смежные вопросы