1

我有这个 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 is not implemented in Specinfra::Command::Redhat::Base::Package

我在这里查看了该课程的文档,并注意到了这个列表,其中不包括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 似乎已经具有我正在寻找的功能。有什么我想念的吗?

编辑

马特的回答帮助我更好地理解了一些事情,比如如何rpm -qyum 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.noarchrpm -qa是我使用or时打印出来的包名yum list installed。但是,必须知道整个名称并在这里使用它似乎有点麻烦。我希望有一种方法可以做到这一点,类似于我在上面尝试使用该with_version()方法的方式。

编辑 2

所以现在我知道我可以这样写测试:

  describe package("python27-pip") do
    it { should be_installed.with_version("6.1.1-1.21.amzn1.noarch") }
  end

所以有一些我不明白的 Linux 问题,我认为是导致需要问这个问题的原因。在这种情况下,当 Matt 指出搜索系统包 with 与 withrpm相同时yum,它几乎解释了我真正需要知道的内容。

所以我意识到这不是一个好问题,但我不确定我是否应该删除它,因为也许它可以帮助其他人,但也因为我感谢我得到的帮助并希望用积分来奖励它。

4

1 回答 1

1

对于初学者,请看这里(假设您使用的是 RHEL/CentOS/SL/OL,因为您说yumand not zypperor dnf):

https://github.com/mizzy/specinfra/blob/master/lib/specinfra/command/redhat/base/package.rb

检查文档是个好主意,但是我碰巧知道还有许多其他可用的提供程序链,因为我为 specinfra/serverspec 做出了贡献。不幸的是,没有一个yum

由于和with_version之间的版本检查链本质上没有区别,因此 specinfra 没有 yum 提供程序链的命令。rpmyum

如果您确实要求它由yum而不是安装rpm,并且想要使用链接到 package 方法,那么这将需要一个 PR 到 specinfra。我已经准备针对在另一个 stackoverflow 问题中发现的问题进行 PR 以进行规范,所以我也可以随时解决这个问题。

最后,你的块在这里:

describe package("python-pip") do
  it { should be_installed.with_version("6.1.1") }
end

应该绝对按预期工作(检查是否python-pip安装了 6.1.1 版)。如果不是,那么要么是测试有问题,要么是您的服务器配置有问题,或者是 specinfra/serverspec。我建议添加该测试的输出,因为这也是值得探索的途径。

于 2016-06-16T16:37:39.683 回答