Kon*_*lic 5 chef-infra chef-recipe chef-solo
我正在调整 Apache 食谱以与 2.4 Apache 一起使用。Opscode Cookbook 目前失败,因为它正在生成带有 LockFile 关键字的 conf 文件,该关键字被排除在 Apache 2.4 关键字列表之外。
我想制定一个通用解决方案,并根据软件版本填充我的conf文件。为此,我必须找出已安装软件的版本。同样的问题已经困扰我一段时间了,但我一直在设法避免它。由于我一遍又一遍地问这个问题,我想问:
如果说明书没有指定,即安装最新的可用版本,如何查找已安装的软件包/软件的版本?
注意:请不要告诉我将命令传递给底层 shell。我想知道是否有更好、更...Chefy的方法?也许与欧海有关?
编辑:看来我被误解了。我想知道是否有一个抽象平台层的解决方案(就像 Ohai 所做的那样),我会说类似gimme_version('apache')并获取已安装的 apache 版本。我想避免case node['platform_family'] when... when... when在内部编写特定于平台的代码。
我创建了 Ohai 插件来解决我的问题。将以下代码放入 .rb 文件中,并将该文件放入ohai/plugin/linux文件夹中。(无法提供绝对路径,因为它因平台和安装类型而异)
Ohai.plugin(:PackageVersion) do
provides "package_version"
depends "platform_family"
collect_data do
pckg_list = Hash.new
case platform_family
when 'debian'
pckg_list = eval '{'+`dpkg-query -W -f='"${Package}"=> "${Version}", '`+'}'
when 'rhel' || 'fedora'
pckg_list = eval '{'+`rpm -qa --queryformat '"%{NAME}"=> "%{VERSION}", '`+'}'
when 'arch'
pckg_list = eval '{'+`package-query -Q -f '"%n"=> "%v", '`+'}'
when 'gentoo'
pckg_list = eval '{'+`equery list --format='"$name" => "$version", ' '*'`+'}'
end
package_version Mash.new pckg_list
end
end
Run Code Online (Sandbox Code Playgroud)
下次运行 Chef 时,软件包版本信息将位于node["package_version"]["<package_name>"]例如node["package_version"]["glibc"]. 我使它适用于 5 个平台系列,但对于 Arch,您必须确保已package-query安装。
重要提示:Ohai 在 Chef 菜谱执行之前加载/填充。此解决方案不会自动更新 Ohai,因此如果您想访问新安装/升级的软件包的数据,在当前 Chef 运行期间,您必须手动重新加载 Ohai。为此,请将以下块放置到包安装/升级块下的配方中,如下所示:
#example package instalation
package "whatever"
ohai "reload_ohai" do
action :reload
end
Run Code Online (Sandbox Code Playgroud)
感谢@markoconnor。他指出,这个解决方案基于社区插件。那些已经不在线了。我将它们调整为与 Chef 11.0+ 一起使用,它们就在这里。
| 归档时间: |
|
| 查看次数: |
6924 次 |
| 最近记录: |