ruby - Serverspec: "package should be installed"默认为 RPM。不能指定百胜?

标签 ruby linux rspec devops serverspec

我有这个 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 -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.noarch 是我使用 rpm -qayum 时打印出来的包名列出已安装。但是,必须知道整个名称并在此处使用它似乎有点麻烦。我希望有一种方法可以像我在上面尝试使用 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 而不是 zypperdnf):

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

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

由于 rpmyum 之间的版本检查链 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/

相关文章:

ruby-on-rails - Rails 测试中缺少记录

ruby - 主模块中名为 `hash` 的方法覆盖了某些对象的 `hash` 方法

ruby-on-rails - 为什么我必须在使用客户验证器后重新加载 rspec 中的记录?

ruby-on-rails - Capybara 的 save_and_open_page 带有样式表和 javascript 的绝对路径

javascript - 错误 : Cannot find module '@rails/webpacker' rails 6

ruby - 无论如何以编程方式扩展 Heroku worker 的数量?

linux - 如何在文件中为 R 编写和执行 hello world 程序?

php - Carbon::setLocale() 不工作 Laravel 5.4

linux - xmodmap 清除命令

ruby-on-rails - Rspec 中的动态期望