2017-10-20 2 views
0

comment puis-je définir une classe si un paquet est installé? Contexte: Je veux déclencher une modification de fichier seulement si un paquet est installé (facultatif dans une version spécifique).cfEngine3 - classe si le paquet est installé

Mon (par exemple) le code ne fonctionne malheureusement pas:

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

Addendum: cette question est semblable à CFEngine - set variable if a specific package version is installed mais je voudrais demander des conseils ou des solutions codées :-)

Répondre

1

Je peaufiné votre politique un peu et a fourni des commentaires en ligne. Je pense que votre problème principal était que vous attendiez que l'index des données packagesmatching() renvoyées soit indexé par nom de package, au lieu d'un ID numérique.

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ésultats dans cette sortie:

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 

Est-ce que cette réponse à votre question?

+0

A travaillé comme un charme - tyvm (@nick espère que vous vous souvenez encore "le schnitzel" dans Ulm ;-)) – domi27

+0

Bien sûr @ domi27 https://ibb.co/m369Aw –