【问题标题】:Chef/Vagrant/Serverspec: specs ensuring that packages are installed fail, but they are installedChef/Vagrant/Serverspec:确保软件包安装失败的规范,但它们已安装
【发布时间】:2016-11-04 21:53:52
【问题描述】:

从文档看来,使用 Serverspec 来验证是否安装了软件包应该非常简单,但我在使用 vimag (the_silver_searcher) 时遇到了一些有趣的问题。

我正在使用带有kitchen-vagrant 插件的Test Kitchen,并且有两个平台:ubuntu-1404centos-72。我的所有规范都通过了 Ubuntu,其中两个不通过 Centos:vimag

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,好像没有必要。

这里有人推荐吗?这些包有什么我遗漏/做错的吗?我最初认为ag 问题只是,因为它是从源代码而不是包管理器安装的,但vim 是通过包管理器安装的并且仍然有和ag一样的问题。

【问题讨论】:

  • 在您的 Centos 服务器上,如果您登录运行 rpm -q vimis_installed 匹配器尝试的命令),它会输出什么?命令的退出代码是什么?至于 ag 示例,这将失败,因为您是从源代码构建而不是使用 package 资源,所以正如您所发现的,您将不得不使用备用匹配器进行测试。
  • 感谢您的评论。我对ag 的猜测也差不多,这很遗憾,但我想这是意料之中的,所以我真的不明白vim 的事情。对于您的问题:在 Centos 服务器上手动运行该命令会产生与规范运行程序相同的消息:package vim is not installed。退出状态为1。知道为什么会这样吗?
  • 这一行Package 2:vim-enhanced-7.4.160-1.el7.x86_64 already installed and latest version 显示包名实际上是vim-enhanced。自从我不得不处理 yum/CentOS/RHEL 以来已经有好几年了,但看起来实际上并没有 vim 软件包。您的系统已经通过其他方式安装了vim-enhanced,或者正在发生某种别名。无论哪种方式,尝试将软件包安装为 vim-enhanced 并在 CentOS 的 serverspec 中进行测试。
  • @KarenB 谢谢,那条评论很有启发性!看起来我需要了解每个系统的特定包名称。这解决了vim 问题。至于ag,通过在我打开的 GitHub 问题中的讨论,我找到了一种通过包管理器进行安装的方法,现在可以使用 Serverspec 包资源进行测试。如果您想将您的最后一条评论重新表述为答案(请注意,如果未使用包管理器安装某些内容,则必须解决包资源问题)我会将其标记为正确!
  • 我只想指出,yum 允许您以vim 获取包,即使它在系统上安装为vim-enhanced,这让我在困惑中走到了这一步/问题。

标签: ruby centos vagrant chef-infra serverspec


【解决方案1】:

您没有通过软件包安装 ag,因此它不能正常工作并不是“黑客”。

【讨论】:

  • 您的意思是将此作为评论吗?
  • 不,这是一个答案。如果你不是在 CentOS 上通过 yum 安装东西,你不想使用 package() 测试资源。
  • 好的,我的意思是它在技术上是正确的,但只解决了部分问题,所以我不知道如何处理它。这里的 real 解决方案(我认为)是人们必须意识到,仅仅因为可以安装 vimyum install vim 之类的软件包,并不意味着在执行此操作时它们会被该名称识别rpm -q vim...同时指出(很明显,除了几天前的初学者之外)寻找已安装的软件包与寻找已安装的应用程序不同
  • 是的,基本上你所说的 hack 是正确的方法:) 你实际上关心的是 vim 二进制文件的存在,它是如何安装的不在集成测试的范围内。
【解决方案2】:

这个问题的答案分为两部分,一个是关于 Serverspec 的工作方式,另一个是关于各种 Linux 发行版如何处理包的。

1) Serverspec 用户不应假设package 资源的名称未从字面上暗示的任何行为。通过系统包管理器以外的任何方式安装的应用程序将不会被拾取,并且它们的成功安装应该通过其他方式进行测试。如问题中所述,这可能包括测试二进制文件是否存在。

2) 当开发人员安装了一个带有包管理器的应用程序时,他/她必须意识到不同 Linux 发行版上的包管理器有时(通常?)对同一个包有不同的名称。一个典型的例子是 Debian 系统上的 apache2 与 RedHat 系统上的 httpd。在问题中提到的特定情况下,vim 在 CentOS 上被识别为 vim-enhanced,即使 yum 在安装时接受 vim 作为名称(感谢@matt-schuchard 指出它们是链接的) .

还想感谢@Karen B 帮助我在问题的 cmets 中得出这些结论。

【讨论】:

    猜你喜欢
    • 2019-02-12
    • 1970-01-01
    • 1970-01-01
    • 2014-05-10
    • 2015-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-17
    相关资源
    最近更新 更多