rpm 和 Yum 不相信在 Chef 安装后安装了包

rpm and Yum don't believe a package is installed after Chef installs

运行 centos6.6 上的 chef-solo(安装 Chef Omnibus (12.3))

我的食谱有以下简单代码:

package 'cloud-init' do
    action :install
end 
log 'rpm-qi' do
    message `rpm -qi cloud-init`
    level :warn
end
log 'yum list' do
    message `yum list cloud-init`
    level :warn
end

但它输出如下:

       - install version 0.7.5-10.el6.centos.2 of package cloud-init

     * log[rpm-qi] action write[2015-07-16T16:46:35+00:00] WARN: package cloud-init is not installed

[2015-07-16T16:46:35+00:00] WARN: Loaded plugins: fastestmirror, presto
   Available Packages
   cloud-init.x86_64                  0.7.5-10.el6.centos.2                 extras

我不知道为什么 rpm/yum 实际上 rpmquery 没有看到安装包。

编辑:为了澄清,我专门寻找以下字符串 post package install,然后将更改应用到文件(我知道这不是一种非常厨师的方式来做我很乐意接受的事情建议):

rpmquery -l cloud-init | grep 'distros/__init__.py$'

我发现使用以下方法:

install_report =  shell_out('yum install -y cloud-init').stdout 
cloudinit_source = shell_out("rpmquery -l cloud-init | grep 'distros/__init__.py$'").stdout

然后我可以得到我正在寻找的文件并执行

Chef::Util::FileEdit.new(cloudinit_source.chomp(''))

文件根据分布移动,但我需要使用适当的更改专门编辑该文件。

未经测试的代码,仅供参考:

package 'cloud-init' do
    action :install
    notifies :run,"ruby_block[update_cloud_init]"
end 

ruby_block 'update_cloud_init' do
  block do
    cloudinit_source = shell_out("rpmquery -l cloud-init | grep 'distros/__init__.py$'").stdout
    rc = Chef::Util::FileEdit.new(cloudinit_source.chomp(''))
    rc.search_file_replace_line(/^what to find$/,
   "replacement datas for the line")
    rc.write_file
  end
end

ruby_block 示例取自 here

我最好使用模板来管理整个文件,我不明白的是为什么你一开始不知道它会在哪里...


上一个回答

我认为这是一个编译与收敛问题。在存储消息时(因此您的命令被执行)软件包尚未安装。

Chef 运行分两阶段编译收敛

在编译时它构建资源集合,在收敛时它执行资源代码以使它们处于所描述的状态。

当你的日志资源被编译时,丑陋的反引号被评估,此时集合中有一个包资源但是资源还没有被执行,所以输出是正确的。

我完全不明白你想用那些日志资源实现什么。 如果你想在 chef-运行 之后测试你的节点状态,使用 handler maybe calling ServerSpec as in Test-Kitchen.