在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(''))
文件根据分发进行移动,但我需要专门编辑该文件并进行更改。
答案 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中一样。