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.
运行 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.