Serverspec не может проверить какой-либо пакет, установленный pip на целевой OS X

Используя serverspec-2.36.0, я не могу проверить какой-либо пакет, установленный pip на виртуальной машине OS X El Capitan.

Тестирование команды, выполняемой Serverspec, дает правильные результаты.

Следующий пример предназначен для ansible, установленного с pip install ansible --user на пользователе vagrant.

  • My ansible_spec.rb:

    require 'spec_helper'
    
    describe command('whoami') do
      let(:disable_sudo) { true }
      its(:stdout) { should match 'vagrant' }
    end
    
    describe package('ansible') do
      let(:disable_sudo) { true }
      it { should be_installed.by('pip') }
    end
    
  • Результат:

    Command "whoami"
      stdout
        should match "vagrant"
    
    Package "ansible"
      should be installed by "pip" (FAILED - 1)
    

    Детали второй задачи:

    Failures:
    
      1) Package "ansible" should be installed by "pip"
         On host `osx-01'
         Failure/Error: it { should be_installed.by('pip') }
           expected Package "ansible" to be installed by "pip"
           /bin/sh -c pip\ list\ \|\ grep\ -iw\ --\ \\\^ansible
    
         # ./spec/ansible_spec.rb:10:in `block (2 levels) in <top (required)>'
    
  • Я вхожу в систему и запускаю:

    $ whoami
    vagrant
    $ pip list | grep -iw -- ^ansible
    ansible (2.1.0.0)
    $ /bin/sh -c pip\ list\ \|\ grep\ -iw\ --\ \\\^ansible
    ansible (2.1.0.0)
    

Я не знаю ни причины, ни следующих возможных шагов по устранению неполадок.


устранение неполадок

  • Я добавил задачу для проверки which python (внутри Serverspec), и она не работает:

    1) Command "which python" stdout should match "/usr/local/bin/python"
       On host `ansible-osx-devops-environment-01'
       Failure/Error: its(:stdout) { should match '/usr/local/bin/python' }
         expected "" to match "/usr/local/bin/python"
         env PATH="/usr/local/bin" /bin/sh -c which\ python
    
       # ./spec/ansible_spec.rb:11:in `block (2 levels) in <top (required)>'
    

person techraf    schedule 15.06.2016    source источник
comment
Эти обратные косые черты предназначены для экранирования, а фактическая команда - pip list | grep -iw -- ^ansible (github.com/mizzy/specinfra/blob/). Тем не менее, результат тот же. Интересным побочным эффектом является то, что команда также вернет ложный успех, скажем, для ansible-lint, несмотря на отсутствие ansible. Во всяком случае, это больше похоже на проблему с бродяжничеством, чем на проблему с серверами.   -  person Matt Schuchard    schedule 15.06.2016
comment
Отлично подмечено -w! И это фактически предотвратит обнаружение ansible-lint.   -  person techraf    schedule 15.06.2016
comment
Да, извините, что ничем не мог помочь, но я собираюсь пообщаться с Specinfra из-за этого. Вероятно, это происходит и с другими поставщиками пакетов. Кстати, пробовали ли вы это: github.com/jvoorhis/vagrant-serverspec? Я никогда им не пользовался, но, безусловно, выглядит многообещающе.   -  person Matt Schuchard    schedule 15.06.2016
comment
Думаю, я на правильном пути. По какой-то причине Serverspec не находит pip (даже which pip с явно указанным PATH не работает).   -  person techraf    schedule 15.06.2016


Ответы (1)


По причинам, не понятным мне, Serverspec не смог найти ни собственный Python для OS X (в /usr/bin/python), ни тот, который был установлен вместе с Homebrew (в /usr/local/bin/python).

В качестве обходного пути я добавил:

set :path, '/usr/local/bin:$PATH'

to spec_helper.rb.

person techraf    schedule 15.06.2016