cfEngine3 - class 如果安装了包
cfEngine3 - class if package is installed
如果安装了软件包,我如何设置 class?
背景:我想只在安装包时触发文件修改(特定版本可选)。
不幸的是,我的(示例)代码不起作用:
vars:
"cfengine_rpm" data => packagesmatching("cfengine-nova", ".*", ".*", ".*");
"cfengine_rpm_installed" slist => getindices(cfengine_rpm);
classes:
"cfengine_installed" expression => some("cfengine", cfengine_rpm_installed);
reports:
cfengine_installed::
"cfEngine is installed ";
# Bonus :-)
"cfEngine Version : $(cfengine_rpm[$(cfengine_rpm_installed)][version])";
附录:这个问题类似于,但我想寻求编码提示或解决方案:-)
我稍微调整了您的政策并提供了一致的意见。我认为您的主要问题是您期望返回的 packagesmatching() 数据的索引按包名称而不是数字 id 进行索引。
bundle agent main
{
vars:
# Return data from cfengines internal cache about any packages matching the
# name cfengine-nova
"p"
data => packagesmatching("cfengine.*", ".*", ".*", ".*");
# Get the index (list of keys) from this data structure for iteration
# Each value in the list is a number which is the position of the JSON
# object in the data returned from packagesmatching(). For example, if
# cfengine-nova-hub is the only package found to be installed that matches
# then the data structure returend to p will look like the following
# snippet. Note it's the 0th element inside the array ([]).
#
# [
# {
# "arch":"x86_64",
# "method":"dpkg",
# "name":"cfenigne-nova-hub",
# "version":"3.10.1-1"
# }
# ]
"i" slist => getindices(p);
"c" slist => classesmatching( ".*", "defined_from=$(this.bundle)");
classes:
# Iterate over the packages found, if one of their names matches
# cfengine-nova.* then define the class cfengine_installed.
"cfengine_installed"
expression => regcmp( "cfengine.*", "$(p[$(i)][name])" ),
meta => { "defined_from=$(this.bundle)" };
reports:
# Emit the version of cfengine from the internal sys var
"CFEngine $(sys.cf_version)";
# Iterate over the index (i) of the data returned from packagesmatching
# cfengine-nova (p) and print the name of each package.
"CFEngine cached knowledge of $(p[$(i)][name]) $(p[$(i)][version])";
"Found the class '$(c)' defined from $(this.bundle)";
cfengine_installed::
"CFEngine is installed ";
# Bonus :-)
# In case you had multiuple packages returned, you might want to make
# this more strict, or it will emit the version of each package found
# by packagesmatching.
"CFEngine Package Version : $(p[$(i)][version])"
if => strcmp( "cfengine-nova-hub", "$(p[$(i)][name])" );
}
此输出结果:
R: CFEngine 3.10.1
R: CFEngine cached knowledge of cfengine-nova-hub 3.10.1-1
R: Found the class 'cfengine_installed' defined from main
R: CFEngine is installed
R: CFEngine Package Version : 3.10.1-1
这是否回答了您的问题?
如果安装了软件包,我如何设置 class?
背景:我想只在安装包时触发文件修改(特定版本可选)。
不幸的是,我的(示例)代码不起作用:
vars:
"cfengine_rpm" data => packagesmatching("cfengine-nova", ".*", ".*", ".*");
"cfengine_rpm_installed" slist => getindices(cfengine_rpm);
classes:
"cfengine_installed" expression => some("cfengine", cfengine_rpm_installed);
reports:
cfengine_installed::
"cfEngine is installed ";
# Bonus :-)
"cfEngine Version : $(cfengine_rpm[$(cfengine_rpm_installed)][version])";
附录:这个问题类似于
我稍微调整了您的政策并提供了一致的意见。我认为您的主要问题是您期望返回的 packagesmatching() 数据的索引按包名称而不是数字 id 进行索引。
bundle agent main
{
vars:
# Return data from cfengines internal cache about any packages matching the
# name cfengine-nova
"p"
data => packagesmatching("cfengine.*", ".*", ".*", ".*");
# Get the index (list of keys) from this data structure for iteration
# Each value in the list is a number which is the position of the JSON
# object in the data returned from packagesmatching(). For example, if
# cfengine-nova-hub is the only package found to be installed that matches
# then the data structure returend to p will look like the following
# snippet. Note it's the 0th element inside the array ([]).
#
# [
# {
# "arch":"x86_64",
# "method":"dpkg",
# "name":"cfenigne-nova-hub",
# "version":"3.10.1-1"
# }
# ]
"i" slist => getindices(p);
"c" slist => classesmatching( ".*", "defined_from=$(this.bundle)");
classes:
# Iterate over the packages found, if one of their names matches
# cfengine-nova.* then define the class cfengine_installed.
"cfengine_installed"
expression => regcmp( "cfengine.*", "$(p[$(i)][name])" ),
meta => { "defined_from=$(this.bundle)" };
reports:
# Emit the version of cfengine from the internal sys var
"CFEngine $(sys.cf_version)";
# Iterate over the index (i) of the data returned from packagesmatching
# cfengine-nova (p) and print the name of each package.
"CFEngine cached knowledge of $(p[$(i)][name]) $(p[$(i)][version])";
"Found the class '$(c)' defined from $(this.bundle)";
cfengine_installed::
"CFEngine is installed ";
# Bonus :-)
# In case you had multiuple packages returned, you might want to make
# this more strict, or it will emit the version of each package found
# by packagesmatching.
"CFEngine Package Version : $(p[$(i)][version])"
if => strcmp( "cfengine-nova-hub", "$(p[$(i)][name])" );
}
此输出结果:
R: CFEngine 3.10.1
R: CFEngine cached knowledge of cfengine-nova-hub 3.10.1-1
R: Found the class 'cfengine_installed' defined from main
R: CFEngine is installed
R: CFEngine Package Version : 3.10.1-1
这是否回答了您的问题?