rpm和Yum不相信在Chef安装

时间:2015-07-16 16:55:01

标签: package chef rpm yum chef-solo

在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(''))

文件根据分发进行移动,但我需要专门编辑该文件并进行更改。

1 个答案:

答案 0 :(得分:1)

未经测试的代码,只是为了提出这个想法:

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在两个阶段运行,编译然后收敛。

在编译时,它构建一组资源,并在收敛时执行资源代码,使其处于描述状态。

编译日志资源时,会评估丑陋的反向标记,此时集合中有一个包资源,但资源尚未执行,因此输出正确。

我根本不明白你想用这些日志资源实现什么。 如果你想在厨师运行后测试你的节点状态,可以使用handler调用ServerSpec,就像在Test-Kitchen中一样。