Como um arquivo / dir existe condicional no Puppet?

17

Estou tentando escrever uma função no fantoche que fará um failse o caminho do diretório passado não existir.

if File["/some/path"]sempre retorna true e if defined(File["/some/path"])somente retorna true se o recurso estiver definido no fantoche, independentemente de ele realmente existir.

Existe uma maneira de fazer isso com uma ifdeclaração simples ?

obrigado

ddario
fonte
2
Lembre-se: os manifestos são compilados no mestre. Eles não sabem nada sobre o cliente, exceto pelos fatos apresentados. Portanto, escreva um fato com essas informações ou dê um passo atrás e conte-nos o que você está realmente tentando resolver para que possamos ter uma abordagem melhor do que uma declaração if.
Dennis Kaarsemaker

Respostas:

30

Solução alternativa para isso: use apenas se um "teste" executivo e exigir em sua ação que você deseja executar:

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

whatever {"foo...":
  .....
  require => Exec["check_presence"],
}
Pascal Schmiel
fonte
5
Oh que é mau, I like it :-)
Dennis Kaarsemaker
1
Poderia ser ainda mais simples: exec { "test -e / path / must / ser / disponível":}
Dennis Kaarsemaker
1
Obrigado. Isso funciona muito bem para uma única verificação de diretório. No entanto, estou tentando validar uma matriz de diretórios ... Se eu adicionar isso a uma função, recebo um erro 'não é possível redefinir'.
ddario
6
Ótima idéia, mas isso significa que em cada execução do Puppet haverá um aviso "Exec [check_presence] / Returns: executado com êxito", o que é realmente irritante! Melhor seria: exec {'check_presence': comando => '/ bin / false', a menos que => '/ usr / bin / test -e / caminho / deve / esteja / disponível',} Isso fará o mesmo, mas criará apenas um erro / aviso quando o caminho realmente não existir.
S0me0ne 29/08/14
2
Qualquer coisa que faça com que o "requeira" falhe dará um erro, pois o que tiver uma dependência com falha, seja usando onlyif ou a menos ... Então, tecnicamente funciona, mas você receberá muitos erros registrados em seus logs de marionetes ...
David Gardner
0

Eu também estava tendo dificuldade em descobrir como impedir a execução de um módulo se um diretório não estivesse presente. Foi o que descobri que funcionou para mim.

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',
   }

Adicionar o caminho é o que realmente fez o truque para mim. Por alguma razão, mesmo se eu adicionasse o caminho ao comando test, como /bin/testse não parecesse funcionar corretamente.

Espero que isso ajude outras pessoas que possam estar tendo o mesmo problema.

Mike Taylor
fonte
0

Você também pode usar a função interna find_file () para ela ... ela retorna undef quando o arquivo / caminho não existe e uma string, se existir.

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

Mike
fonte
1
Isso será executado apenas no mestre e é para encontrar arquivos nos módulos.
bodgit 10/10
Obrigado, mas você também pode usá-lo para encontrar arquivos no sistema operacional, fornecendo o caminho completo para ele ou não?
Mike
Somente na máquina em que o catálogo está sendo compilado, ou seja, o mestre.
bodgit
sim está certo.
Mike