Chef/Vagrant/Serverspec: specs ensuring the packages are installed fail, but they are installed
Chef/Vagrant/Serverspec: specs ensuring that packages are installed fail, but they are installed
从文档看来,使用 Serverspec 验证软件包是否已安装应该非常简单,但我在 vim
和 ag
方面遇到了一些有趣的问题(the_silver_searcher
).
我正在使用带有 kitchen-vagrant
插件的 Test Kitchen,并且有两个平台:ubuntu-1404
和 centos-72
。我的所有规格都通过了 Ubuntu,其中两个在 Centos 上失败了:vim
和 ag
.
vim
处理此安装的 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
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
这可行,但感觉超级 hacky,好像没有必要。
这里有人有推荐吗?这些软件包有什么我 missing/doing 不对的地方吗?我最初认为 ag
问题只是 因为它是从源代码而不是包管理器安装的,但是 vim
是 使用包管理器安装,但仍然存在与 ag
.
相同的问题
您没有通过软件包安装 ag,因此 "hack" 无法正常工作。
问题的答案分为两部分,一部分涉及 Serverspec 的工作方式,另一部分涉及各种 Linux 发行版如何处理包。
1) Serverspec 用户不应该假定 package
资源名称没有从字面上暗示的任何行为。通过系统包管理器以外的任何方式安装的应用程序将不会被拾取,并且应通过其他方式测试它们是否成功安装。就像问题中一样,这可能包括测试二进制文件的存在。
2) 当开发人员 安装了带有包管理器的应用程序时,he/she 必须注意不同 Linux 发行版上的包管理器有时(经常?)对同一个包有不同的名称。一个典型的例子是 Debian 系统上的 apache2
与 RedHat 系统上的 httpd
。在问题中提到的特定情况下,vim
在 CentOS 上被识别为 vim-enhanced
,即使 yum
在安装时接受 vim
作为名称(感谢 @matt-schuchard指出它们是有联系的)。
还想感谢@Karen B 在对问题的评论中帮助我得出这些结论。
从文档看来,使用 Serverspec 验证软件包是否已安装应该非常简单,但我在 vim
和 ag
方面遇到了一些有趣的问题(the_silver_searcher
).
我正在使用带有 kitchen-vagrant
插件的 Test Kitchen,并且有两个平台:ubuntu-1404
和 centos-72
。我的所有规格都通过了 Ubuntu,其中两个在 Centos 上失败了:vim
和 ag
.
vim
处理此安装的 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
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
这可行,但感觉超级 hacky,好像没有必要。
这里有人有推荐吗?这些软件包有什么我 missing/doing 不对的地方吗?我最初认为 ag
问题只是 因为它是从源代码而不是包管理器安装的,但是 vim
是 使用包管理器安装,但仍然存在与 ag
.
您没有通过软件包安装 ag,因此 "hack" 无法正常工作。
问题的答案分为两部分,一部分涉及 Serverspec 的工作方式,另一部分涉及各种 Linux 发行版如何处理包。
1) Serverspec 用户不应该假定 package
资源名称没有从字面上暗示的任何行为。通过系统包管理器以外的任何方式安装的应用程序将不会被拾取,并且应通过其他方式测试它们是否成功安装。就像问题中一样,这可能包括测试二进制文件的存在。
2) 当开发人员 安装了带有包管理器的应用程序时,he/she 必须注意不同 Linux 发行版上的包管理器有时(经常?)对同一个包有不同的名称。一个典型的例子是 Debian 系统上的 apache2
与 RedHat 系统上的 httpd
。在问题中提到的特定情况下,vim
在 CentOS 上被识别为 vim-enhanced
,即使 yum
在安装时接受 vim
作为名称(感谢 @matt-schuchard指出它们是有联系的)。
还想感谢@Karen B 在对问题的评论中帮助我得出这些结论。