2017-10-20 37 views
0

如果安装软件包,该如何设置类?cfEngine3 - 如果已安装软件包,则为类

背景:我只想在安装软件包(在特定版本中可选)时触发文件修改。

我(例如)代码不幸的是不起作用:

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])"; 

附录:这个问题类似于CFEngine - set variable if a specific package version is installed,但我想问的编码提示或解决方案:-)

回答

1

我调整您的政策一点点,并提供意见。我认为你的主要问题是你期望返回的packagematching()数据的索引是通过包名称索引的,而不是数字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 

这是否回答你的问题?

+0

工作就像一个魅力 - tyvm(@nick希望你还记得乌尔姆的炸肉排;-)) – domi27

+0

当然@ domi27 https://ibb.co/m369Aw –