Serverspec:“应该安装软件包”默认为RPM。不能指定yum?

时间:2016-06-16 14:18:56

标签: 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 is not implemented in 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仅显示由rpmyum 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 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-y我不明白的东西,我认为这是导致这个问题需要被问到的原因。在这种情况下,当Matt指出使用rpm搜索系统包与yum相同时,它几乎解释了我真正需要知道的内容。

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

1 个答案:

答案 0 :(得分:1)

对于初学者,请看一下(假设您使用的是RHEL / CentOS / SL / OL,因为您说yum而不是zypperdnf):

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

检查文档是一个好主意,但有一些其他提供商链可供我碰巧知道,因为我参与了specinfra / serverspec。不幸的是,没有yum

由于with_versionrpm之间的版本检查链yum基本上没有区别,因此specinfra没有针对yum提供商链的命令。

如果你真的要求它由yum而不是rpm安装,并且想要使用一个链到package方法,那么这将需要PR来指定。我已经要为另一个stackoverflow问题中发现的问题对specinfra做一个公关,所以我也可以一直打开这个问题。

最后,你的阻止在这里:

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

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