Puppet: tester si la ressource est définie ou la créer

14

J'ai essayé de trouver un moyen de tester si une ressource est déjà définie dans un autre fichier, et sinon la créer? Un exemple rapide:

  if File[$local_container] {
    alert("Testing - It existed $local_container")
  } else {
    file{ "$local_container":
      ensure => directory,
    }
  }

Cependant - File[$local_container]semble toujours évaluer vrai. Y a-t-il un moyen de faire cela?

gnarf
la source

Réponses:

10

La meilleure façon de le faire est d'utiliser la fonction assure_resource de puppetlabs stdlib

Il prend un type de ressource, un titre et une liste d'attributs qui décrivent une ressource en tant que paramètres.

disons que vous avez un cas de test pour créer la ressource uniquement si elle n'existe pas déjà-

ensure_resource('package', 'test-pkg', {'ensure' => 'present'})
Utkarsh
la source
Cela semble beaucoup plus propre, en passant la coche de cette façon. Merci pour le conseil!
gnarf
15

Vous voulez dire "tester si une ressource est déjà définie "? Si vous définissez une ressource (c'est-à-dire, file {}etc.), Puppet créera ce que vous décrivez si elle n'existe pas déjà (en supposant que vous réussissiez ensure => present, bien sûr).

Pour vérifier si une ressource est déjà définie dans le catalogue ou non:

mark-draytons-macbook:~ mark$ cat test.pp 
file { "/tmp/foo": ensure => present }

if defined(File["/tmp/foo"]) {
  alert("/tmp/foo is defined")
} else {
  alert("/tmp/foo is not defined")
}

if defined(File["/tmp/bar"]) {
  alert("/tmp/bar is defined")
} else {
  alert("/tmp/bar is not defined")
}

mark-draytons-macbook:~ mark$ puppet test.pp 
alert: Scope(Class[main]): /tmp/foo is defined
alert: Scope(Class[main]): /tmp/bar is not defined
notice: //File[/tmp/foo]/ensure: created

Note: defined()est dépendante de l' ordre d'analyse syntaxique .

Markdrayton
la source
5
Cette partie "dépend de l'ordre d'analyse" la rend presque inutile.
joerx
2

Ou....

unless File["${local_container}"] {
  file{ "${local_container}":
     ensure => directory,
  }
}

Et gardez un œil sur ces citations et accolades ...

nzidol
la source
-2

simplement,

file{ "$local_container":
  ensure => directory,
  replace => false,
}
guest_002
la source
Non, si le "$local_container"fichier a déjà été défini ailleurs (comme par exemple par quelque chose qui voulait contrôler les autorisations / propriétaire), vous ne pouvez pas définir deux fois la même ressource.
gnarf