Chef/Vagrant/Serverspec: спецификации, обеспечивающие установку пакетов, терпят неудачу, но они устанавливаются

Из документов кажется, что использование Serverspec для проверки того, что пакеты установлены, должно быть довольно простым, но у меня есть некоторые интересные проблемы с vim и ag (the_silver_searcher).

Я использую Test Kitchen с плагином kitchen-vagrant и имею две платформы: ubuntu-1404 и centos-72. Все мои спецификации подходят для Ubuntu, а две из них не подходят для Centos: vim и ag.

вим

Код Chef, который обрабатывает эту установку, очень прост:

package "vim"

А вот и спецификация:

describe "Vim" do
  describe package("vim") do
    it { should be_installed }
  end
end

Опять же, очень прямолинейно. Однако в моей сборке Centos происходит сбой с этой ошибкой:

 2) Vim Package "vim" should be installed
    Failure/Error: it { should be_installed }
      expected Package "vim" to be installed
      /bin/sh -c rpm\ -q\ vim
      package vim is not installed

Тем не менее, если я войду на сервер, он определенно установлен:

▶ kitchen login all-centos-72
Last login: Sat Jul  2 17:53:30 2016 from 10.0.2.2
[vagrant@all-centos-72 ~]$ vim --version
VIM - Vi IMproved 7.4 (2013 Aug 10, compiled Jun 10 2014 06:55:55)
[vagrant@all-centos-72 ~]$ which vim
/usr/bin/vim
[vagrant@all-centos-72 ~]$ sudo yum install -y vim
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
 * base: distro.ibiblio.org
 * extras: mirror.us.leaseweb.net
 * updates: mirror.eboundhost.com
Package 2:vim-enhanced-7.4.160-1.el7.x86_64 already installed and latest version
Nothing to do

возраст

ag сложнее, поскольку для установки требуется сборка из исходного кода на Centos, тогда как в Ubuntu это доступно с apt-get. Вот соответствующая часть рецепта:

  bash "install Development Tools" do
    code "yum -y groupinstall \"Development Tools\""
  end

  package %w(pcre-devel xz-devel)

  target_dir = File.join("/", "usr", "local", "the_silver_searcher")

  git "clone the ag repo" do
    repo "https://github.com/ggreer/the_silver_searcher/"
    revision "master"
    destination target_dir
  end

  bash "install ag" do
    not_if system("hash ag")

    cwd target_dir
    code <<-EOF
      ./build.sh
      make install
    EOF
  end

А вот и спецификация:

describe "The Silver Searcher" do    
  if host_inventory["platform"] == "ubuntu"
    describe package("silversearcher-ag") do
      it { should be_installed }
    end
  else
    describe package("the_silver_searcher") do
      it { should be_installed }
    end
  end
end

Ошибка Centos:

 1) The Silver Searcher Package "the_silver_searcher" should be installed
    Failure/Error: it { should be_installed }
      expected Package "the_silver_searcher" to be installed
      /bin/sh -c rpm\ -q\ the_silver_searcher
      package the_silver_searcher is not installed

Точно так же, если я войду в виртуальную машину Centos, я могу использовать ag:

[vagrant@all-centos-72 ~]$ ag --version
ag version 0.32.0
[vagrant@all-centos-72 ~]$ which ag
/usr/local/bin/ag

Эти команды также работают, если я переключаюсь на пользователя root.

Я пытался обмануть систему, по-разному написав свои спецификации для платформы Centos:

  describe command("ag") do
    its(:stderr) { should match /Usage: ag/ }
  end

Вышеупомянутое также не работает, хотя ввод ag при входе в систему (статус выхода 1) действительно создает этот контент использования. Моя последняя попытка была:

describe file("/usr/local/bin/ag") do
  it { should exist }
end

Это работает, но кажется супер хакерским и, как будто в этом нет необходимости.

У кого-нибудь есть рекомендации здесь? Есть ли что-то, что я упускаю/делаю неправильно с этими пакетами? Сначала я думал, что проблема ag была только потому, что она была установлена ​​из исходного кода, а не менеджером пакетов, но vim была установлена ​​с помощью менеджера пакетов и по-прежнему имеет ту же проблему, что и ag.


person sixty4bit    schedule 02.07.2016    source источник
comment
На вашем сервере Centos, если вы войдете в систему с запуском rpm -q vim (команда, которую пытается выполнить сопоставитель is_installed), что она выведет? Какой код выхода у команды? Что касается примера с ag, это не удастся, потому что вы строите из исходного кода, а не используете ресурс package, поэтому, как вы обнаружили, вам придется тестировать с альтернативными сопоставителями.   -  person Karen B    schedule 04.07.2016
comment
Спасибо за ваш комментарий. Я так же догадался о ag, это позор, но, думаю, этого следовало ожидать, так что это vim вещь, которую я действительно не понимаю. На ваш вопрос: запуск этой команды на сервере Centos вручную выдает то же сообщение, что и бегун спецификации: package vim is not installed. Статус выхода 1. Любая идея, почему это было бы?   -  person sixty4bit    schedule 04.07.2016
comment
Эта строка Package 2:vim-enhanced-7.4.160-1.el7.x86_64 already installed and latest version показывает, что имя пакета на самом деле vim-enhanced. Прошли годы с тех пор, как мне приходилось иметь дело с yum/CentOS/RHEL, но похоже, что на самом деле нет пакета vim. Либо в вашей системе уже был установлен vim-enhanced другим способом, либо происходит какой-то псевдоним. В любом случае попробуйте установить пакет как vim-enhanced и протестировать его в спецификации сервера для CentOS.   -  person Karen B    schedule 04.07.2016
comment
@KarenB спасибо, этот комментарий был очень поучительным! Похоже, мне нужно знать имена конкретных пакетов для каждой системы. Это устраняет проблему vim. Что касается ag, в ходе обсуждения в выпуске GitHub, который я открыл, я нашел способ заставить работать установку через диспетчер пакетов и теперь могу использовать ресурс пакета Serverspec для тестирования. Если вы хотите переформулировать свой последний комментарий как ответ (с примечанием о необходимости обхода ресурса пакета, если что-то не было установлено с помощью диспетчера пакетов), я отмечу это правильно!   -  person sixty4bit    schedule 04.07.2016
comment
Я просто хочу отметить, что yum позволяет вам получить пакет как vim, даже если он установлен в системе как vim-enhanced, что позволило мне зайти так далеко в моей путанице/проблеме.   -  person sixty4bit    schedule 04.07.2016
comment
@KarenB должна преобразовать свои комментарии в ответ, а текущий ответ должен быть преобразован в комментарий или удален.   -  person Matt Schuchard    schedule 06.07.2016
comment
@MattSchuchard Я рекомендовал это пару дней назад, но она еще не оставила ответа. Думаю, я просто отвечу себе и отдам ей должное, если она не сделает этого сегодня.   -  person sixty4bit    schedule 06.07.2016
comment
@ sixty4bit Звучит хорошо. Напечатайте его и упомяните меня, и я откорректирую его с предложениями. Затем я проголосую, чтобы он имел приоритет над текущим ответом. К вашему сведению, yum перенаправлял ваш запрос vim на vim-enhanced, что является функцией yum. Я думаю, что это будет делать то же самое, например, для запроса на gvim.   -  person Matt Schuchard    schedule 06.07.2016
comment
@MattSchuchard, можете ли вы проголосовать за выбранный ответ, чтобы он имел приоритет?   -  person sixty4bit    schedule 28.07.2016
comment
Я сделал. К сожалению, Serverspec — слишком непопулярный тег в StackOverflow, несмотря на то, что все компании фактически используют его.   -  person Matt Schuchard    schedule 28.07.2016


Ответы (2)


Ответ на вопрос состоит из двух частей: одна касается того, как работает Serverspec, а другая — того, как различные дистрибутивы Linux обрабатывают пакеты.

1) Пользователи Serverspec не должны предполагать какое-либо поведение, которое буквально не подразумевается именем ресурса package. Приложения, установленные любыми средствами, кроме системного диспетчера пакетов, не будут обнаружены, и их успешная установка должна быть проверена другими способами. Это может включать, как и в вопросе, проверку на наличие двоичного файла.

2) Когда разработчик установил приложение с менеджером пакетов, он/она должен знать, что менеджеры пакетов в разных дистрибутивах Linux иногда (часто?) имеют разные имена для одного и того же пакета. Классический пример — apache2 в системах Debian и httpd в системах RedHat. В конкретном случае, упомянутом в вопросе, vim распознается в CentOS как vim-enhanced, хотя yum принимает vim в качестве имени при установке (спасибо @matt-schuchard за указание на то, что они связаны).

Также хотел поблагодарить @Karen B за то, что она помогла мне прийти к этим выводам в комментариях к вопросу.

person sixty4bit    schedule 08.07.2016

Вы не устанавливаете ag через пакет, так что это не «хак», чтобы он не работал.

person coderanger    schedule 05.07.2016
comment
Вы хотели оставить это как комментарий? - person sixty4bit; 06.07.2016
comment
Нет, это ответ. Если вы не устанавливаете что-то через yum в CentOS, вы не хотите использовать тестовый ресурс package(). - person coderanger; 06.07.2016
comment
Хорошо, я имею в виду, что это технически правильно, но решает только часть проблемы, поэтому я не уверен, как с этим справиться. Настоящее решение здесь (я думаю) заключается в том, что нужно знать, что только потому, что можно установить такие пакеты, как vim с yum install vim, не означает, что они будут распознаны под этим именем при выполнении rpm -q vim... а также указывает на (очевидный, за исключением меня, начинающего несколько дней назад) факт, что поиск установленного пакета - это не то же самое, что поиск установленного приложения. - person sixty4bit; 06.07.2016
comment
Да, в основном то, что вы называете взломом, является правильным способом сделать это :) Что вас на самом деле волнует в конце, так это то, что двоичный файл vim существует, то, как он был установлен, выходит за рамки. для интеграционного теста. - person coderanger; 06.07.2016