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 VM, я могу использовать 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
,
2 ответа
Ответ на вопрос состоит из двух частей, одна из которых посвящена тому, как работает Serverspec, а другая - тому, как различные дистрибутивы Linux обрабатывают пакеты.
1) Пользователи Serverspec не должны принимать какое-либо поведение, которое буквально не подразумевается под именем package
ресурс. Приложения, которые устанавливаются любым другим способом, кроме системного менеджера пакетов, не будут выбраны, а их успешная установка должна быть проверена другими способами. Это может включать, как в вопросе, тестирование на наличие двоичного файла.
2) Когда разработчик установил приложение с менеджером пакетов, он должен знать, что менеджеры пакетов в разных дистрибутивах Linux иногда (часто?) Имеют разные имена для одного и того же пакета. Классический пример этого apache2
в системах Debian и httpd
в системах RedHat. В конкретном случае, упомянутом в вопросе, vim
признан на CentOS как vim-enhanced
даже если yum
принимает vim
как имя при установке (спасибо @matt-schuchard за указание на то, что они связаны).
Также хотел бы поблагодарить @Karen B за то, что помог мне прийти к этим выводам в комментариях к вопросу.
Вы не устанавливаете ag через пакет, так что это не "хак", чтобы это не сработало.