Puppet: Sprawdź, czy zasób jest zdefiniowany, lub utwórz go

14

Próbowałem znaleźć sposób, aby sprawdzić, czy zasób jest już zdefiniowany w innym pliku, a jeśli nie, to go utworzyć? Szybki przykład:

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

Jednak - File[$local_container]zawsze wydaje się oceniać jako prawda. Czy jest na to sposób?

gnarf
źródło

Odpowiedzi:

10

Lepszym sposobem jest skorzystanie z funkcji sure_resource z puppetlabs stdlib

Wymaga typu zasobu, tytułu i listy atrybutów, które opisują zasób jako parametry.

powiedzmy, że masz przypadek testowy, aby utworzyć zasób tylko wtedy, gdy jeszcze nie istnieje-

ensure_resource('package', 'test-pkg', {'ensure' => 'present'})
Utkarsh
źródło
Wydaje się to znacznie czystsze, przekazując w ten sposób znacznik wyboru. Dzięki za wskazówkę!
krasnal
15

Masz na myśli „przetestuj, jeśli zasób jest już zdefiniowany ”? Jeśli zdefiniujesz zasób (tj. file {}Itp.), Puppet stworzy to, co opisujesz, jeśli jeszcze nie istnieje (zakładając, że zdałeś ensure => present).

Aby sprawdzić, czy zasób jest już zdefiniowany w katalogu, czy nie:

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

Uwaga: defined()to zależy od kolejności parsowania .

markdrayton
źródło
5
Ta część „zależy od kolejności przetwarzania” czyni ją prawie bezużyteczną.
joerx
2

Lub....

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

I miej oko na te cytaty i nawiasy klamrowe ....

nzidol
źródło
-2

po prostu,

file{ "$local_container":
  ensure => directory,
  replace => false,
}
guest_002
źródło
Nie, jeśli "$local_container"plik został już zdefiniowany w innym miejscu (np. Przez coś, co chciałoby kontrolować uprawnienia / właściciela), nie możesz zdefiniować tego samego zasobu dwa razy.
gnarf