我有这个 serverspec 测试:
describe package("python-pip") do
it { should be_installed.with_version("6.1.1") }
end
它失败了,我在输出中注意到 serverspec 正在检查默认使用 rpm
安装的包。然后我在 serverspec 文档中注意到您可以使用 by()
来指定包管理器,所以我尝试了这个:
describe package("python-pip") do
it { should be_installed.by("yum").with_version("6.1.1") }
end
然而,这也失败了,错误是:
check_is_installed_by_yum 未在 Specinfra::Command::Redhat::Base::Package 中实现
我检查了该类的文档 here并注意到这个列表,其中不包括 yum
:
check_is_installed_by_cpan, check_is_installed_by_gem, check_is_installed_by_npm, check_is_installed_by_pear, check_is_installed_by_pecl, check_is_installed_by_pip, check_is_installed_by_rvm
所以现在我不得不回到describe command
而不是describe package
:
describe command("yum list installed | grep python27-pip") do
its(:exit_status) { should eq 0 }
end
这感觉很糟糕,因为 serverspec 似乎已经具备我正在寻找的功能。有什么我想念的吗?
编辑
Matt 的回答帮助我更好地理解了一些事情,比如 rpm -q
和 yum list installed
是如何工作的,以及 serverspec 的 by()
是如何工作的本来是要使用的(我认为 rpm -q
只显示由 rpm
安装的包,与 yum list
相同,但看起来它们都列出了所有安装包)。知道这一点后,我通过将其更改为以下内容来让我的测试通过:
describe package("python27-pip-6.1.1-1.21.amzn1.noarch") do
it { should be_installed }
end
python27-pip-6.1.1-1.21.amzn1.noarch
是我使用 rpm -qa
或 yum 时打印出来的包名列出已安装
。但是,必须知道整个名称并在此处使用它似乎有点麻烦。我希望有一种方法可以像我在上面尝试使用 with_version()
方法那样做。
编辑 2
所以现在我知道我可以这样写测试了:
describe package("python27-pip") do
it { should be_installed.with_version("6.1.1-1.21.amzn1.noarch") }
end
所以有一些我不理解的 Linux-y 东西,我认为是导致需要问这个问题的原因。在这种情况下,当 Matt 指出使用 rpm
搜索系统包与使用 yum
相同时,它几乎解释了我真正需要知道的内容。
所以我意识到这不是一个很好的问题,但我不确定是否应该删除它,因为也许它可以帮助其他人,但也因为我很感激我得到的帮助并且想要用积分奖励它。
最佳答案
对于初学者,请看这里(假设您使用的是 RHEL/CentOS/SL/OL,因为您说的是 yum
而不是 zypper
或 dnf
):
https://github.com/mizzy/specinfra/blob/master/lib/specinfra/command/redhat/base/package.rb
检查文档是个好主意,但是我碰巧知道有很多其他可用的提供程序链,因为我为 specinfra/serverspec 做出了贡献。不幸的是,它们都不是 yum
。
由于 rpm
和 yum
之间的版本检查链 with_version
本质上没有区别,specinfra 没有针对 yum 的命令供应链。
如果您确实要求通过 yum
而不是 rpm
安装它,并且想使用链到包的方法,那么这将需要一个 PR到specinfra。我已经打算针对在另一个 stackoverflow 问题中发现的问题对 specinfra 进行 PR,因此我也可以随时解决这个问题。
最后,你的障碍在这里:
describe package("python-pip") do
it { should be_installed.with_version("6.1.1") }
end
应该绝对按预期工作(检查是否安装了 python-pip
6.1.1 版)。如果不是,则说明测试、服务器配置或 specinfra/serverspec 存在问题。我建议添加该测试的输出,因为这也是一个值得探索的途径。
关于ruby - Serverspec: "package should be installed"默认为 RPM。不能指定百胜?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37861875/