Я учусь 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
выполнить команду как другой пользователь. Если кто-то не знает лучшего способа сделать такой тест, я добавлю это как ответ на вопрос.
Попробуйте проверить вывод: 'его (: стандартный вывод) {должен эквалайзер«» } 'и аналогично stderr. Это отобразит их на выходе rspec. – coderanger
@coderanger Я только что понял (еще не добавил к OP), что, когда serverpec запускает команду, переменная '$ PATH' отличается. Я изменил команду на '/home/ec2-user/.rbenv/rbenv versions' и тест прошел. Любая идея, что мне нужно сделать, чтобы пути правильно работали здесь? – sixty4bit
ОК, поэтому я, наконец, понял, что serverpec запускает тесты как пользователь root ... поэтому изменения, которые я сделал для '$ PATH' ec2-user, недоступны ... – sixty4bit