Marionette: Testen Sie, ob die Ressource definiert ist, oder erstellen Sie sie

14

Ich habe versucht, eine Möglichkeit zu finden, um zu testen, ob eine Ressource bereits in einer anderen Datei definiert ist, und ob sie nicht erstellt wird. Ein kurzes Beispiel:

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

Allerdings - File[$local_container]scheint immer wahr zu bewerten. Gibt es eine Möglichkeit, dies zu tun?

Zwerg
quelle

Antworten:

10

Die bessere Möglichkeit besteht darin, die Funktion verify_resource von puppetlabs stdlib zu verwenden

Es werden ein Ressourcentyp, ein Titel und eine Liste von Attributen benötigt, die eine Ressource als Parameter beschreiben.

Angenommen, Sie haben einen Testfall, um die Ressource nur dann zu erstellen, wenn sie noch nicht vorhanden ist.

ensure_resource('package', 'test-pkg', {'ensure' => 'present'})
Utkarsh
quelle
Dies scheint viel sauberer zu sein und das Häkchen auf diese Weise zu überschreiten. Danke für den Tipp!
Zwerg
15

Meinen Sie "testen, ob eine Ressource bereits definiert ist "? Wenn Sie eine Ressource definieren (z. B. file {}usw.), erstellt Puppet das, was Sie beschreiben, wenn es noch nicht existiert (vorausgesetzt, Sie haben bestanden ensure => present).

So überprüfen Sie, ob eine Ressource bereits im Katalog definiert ist:

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

Hinweis: defined()ist abhängig von Parsing - Reihenfolge .

Markdrayton
quelle
5
Dieser Teil "hängt von der Syntaxanalyse ab" macht ihn fast unbrauchbar.
Joerx
2

Oder....

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

Und behalten Sie diese Anführungszeichen und geschweiften Klammern im Auge ...

nzidol
quelle
-2

einfach,

file{ "$local_container":
  ensure => directory,
  replace => false,
}
guest_002
quelle
Nein, wenn die "$local_container"Datei bereits an einer anderen Stelle definiert wurde (z. B. durch etwas, das die Berechtigungen / den Eigentümer kontrollieren wollte), können Sie dieselbe Ressource nicht zweimal definieren.
Gnarf