¿Cómo hacer un archivo / directorio existe condicional en Puppet?

18

Estoy tratando de escribir una función en la marioneta que hará una failsi la ruta de acceso del directorio no existe.

if File["/some/path"]siempre devuelve verdadero, y if defined(File["/some/path"])solo devuelve verdadero si el recurso está definido en títere, independientemente de si realmente existe.

¿Hay alguna manera de hacer esto con una ifdeclaración simple ?

Gracias

ddario
fuente
2
Recuerde: los manifiestos se compilan en el maestro. No saben nada sobre el cliente, excepto por los hechos que presenta. Por lo tanto, escriba un hecho que tenga esta información o dé un paso atrás y díganos lo que realmente está tratando de resolver para que podamos llegar a un mejor enfoque que una declaración if.
Dennis Kaarsemaker

Respuestas:

31

Solución alternativa para esto: utilícelo solo en una "prueba" ejecutiva y solicítelo en la acción que desea ejecutar:

exec {"check_presence":
  command => '/bin/true',
  onlyif => '/usr/bin/test -e /path/must/be/available',
}

whatever {"foo...":
  .....
  require => Exec["check_presence"],
}
Pascal Schmiel
fuente
55
Oh, eso es malo, me gusta :-)
Dennis Kaarsemaker
1
Podría ser aún más simple: exec {"test -e / path / must / be / available":}
Dennis Kaarsemaker
1
Gracias. Esto funciona muy bien para una verificación de directorio único. Sin embargo, estoy tratando de validar una matriz de directorios ... Si agrego esto a una función, aparece el error 'no se puede volver a declarar'.
ddario
66
Gran idea, pero esto significa que en cada ejecución de Puppet habrá un aviso "Exec [check_presence] / devuelve: ejecutado con éxito", ¡lo cual es realmente molesto! Mejor sería: exec {'check_presence': command => '/ bin / false', a menos que => '/ usr / bin / test -e / path / must / be / available',} Esto hará lo mismo, pero solo creará un error / aviso cuando la ruta realmente no exista.
S0me0ne
2
Cualquier cosa que haga que el "requerimiento" falle dará un error ya que lo que sea que tenga una dependencia fallida, ya sea que se use solo si o a menos ... Así que técnicamente funciona pero obtendrá muchos errores registrados en sus registros de marionetas ...
David Gardner
0

Yo también estaba teniendo dificultades para descubrir cómo evitar que un módulo se ejecute si no hay un directorio presente. Esto es lo que encontré que funcionó para mí.

exec { 'module_name':
   command => "command to run with variables", # Double quotes for Variable interpolation
   path   => "/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:",
   onlyif => 'test -d /mydirectory',
   }

Agregar el camino es lo que realmente hizo el truco para mí. Por alguna razón, incluso si agregué la ruta al comando de prueba, ya /bin/testque no parecía funcionar correctamente.

Espero que esto ayude a otros que puedan estar teniendo el mismo problema.

Mike Taylor
fuente
0

También podría usar la función incorporada find_file () para ello ... devuelve undef cuando el archivo / ruta no existe y una cadena si existe.

https://puppet.com/docs/puppet/5.5/function.html#findfile

Miguel
fuente
1
Esto solo se ejecutará en el maestro, y es para encontrar archivos en módulos.
bodgit
Gracias, ¿pero también podría usarlo para buscar archivos en el sistema operativo al proporcionar la ruta completa o no?
Mike
Solo en la máquina donde se está compilando el catálogo, es decir, el maestro.
bodgit
Sí, eso es correcto.
Mike