existe dir no fantoche

1

Eu quero verificar a condição "se dir existe" com o fantoche como foi feito aqui Como fazer um arquivo / dir existe condicional em Puppet? mas se eu escrever

  exec { 'check_presence':
    command => "true",
    path    =>  ["/usr/bin","/usr/sbin", "/bin"],
    onlyif  => "test -d /test"
  }
  file { '/test/123':
    ensure  => directory,
    mode    => '0644',
    require => Exec['check_presence']
  }

de exec i get alwyas true e o fantoche sempre tenta criar / testar / 123

Debug: Exec[check_presence](provider=posix): Executing check 'test -e /test'
Debug: Executing 'test -e /test'

Error: Cannot create /test/123; parent directory /test does not exist
Error: /Stage[main]/tst::test/File[/test]/ensure: change from absent to directory failed: Cannot create /test/123; parent directory /test does not exist

Por que ele faz isso ?! E como eu devo verificar o diretório pai existe?!

Meu boneco é 3.8

UPD Não quero criar /test ! Quero criar /test/123 APENAS se / test já existir!

    
por user423253 03.07.2017 / 16:21

2 respostas

0

o fantoche não tem uma função nativa para isso, a única solução alternativa:

mkdir -p your_module_path/lib/puppet/parser/functions/ agora você precisa criar este arquivo directory_exists.rb com este código:

require 'puppet'

module Puppet::Parser::Functions
  newfunction(:directory_exists, :type => :rvalue) do |args|
    if File.directory?(args[0])
      return true
    else
      return false
    end
  end
end

Agora, no seu código de fantoches, você pode usar a função:

if directory_exists('/test') {
  file { '/test/123':
    ensure  => directory,
    mode    => '0644',
    owner   => 'root',
    group   => 'root',
  }
}
    
por 03.07.2017 / 17:32
0

Se você não quiser criar / testar, acredito que terá que fazer as duas coisas em um exec :

exec { '/usr/bin/install /test/123':
  onlyif  => "/usr/bin/test -d /test"
}

Usar install em vez de mkdir ativa a configuração de propriedades como o modo no mesmo comando.

A maneira mais fácil de criar diretórios pai é encadear file s:

file { '/test':
  ensure  => directory,
  mode    => '0644',
} ->
file { '/test/123':
  ensure  => directory,
  mode    => '0644',
}

A semântica do seu código simplesmente requer que o exec seja "instanciado" (isto é, execute) antes que o diretório filho seja criado. Não há nenhuma opção implícita nisto - true será executado se /test existir, caso contrário true não não será executado.

    
por 03.07.2017 / 16:45