Verifique o diretório antes de criar o arquivo no fantoche?

4

Estou tentando fazer uma função que o diretório / arquivo será criado somente quando o primeiro diretório existir, não deve ser ignorado por causa da dependência com falha.

Eu tentei esta solução única "onlyif" , mas infelizmente não funciona com a minha função.

$check_directory = file("/path/to/directory")
if($check_directory != '') {
    file{"/path/to/config":
        ensure  =>  directory,
        mode    =>  0755,
    }
    file{"/path/to/config/a.conf":
        ensure  =>  file,
        mode    =>  0755,
        content =>  template("config_template.conf"),
    }
}

Eu recebi um erro:

Error: Is a directory - /path/to/directory

Existe uma maneira de fazer qualquer outra declaração if? Ou algum parâmetro? Obrigado.

    
por skantana 16.09.2015 / 14:08

2 respostas

3

Você deve poder simplesmente usar uma instrução require no recurso de arquivo a.conf :

file{"/path/to/directory":
    ensure  =>  directory,
    mode    =>  0755,
}

file{"/path/to/config":
    ensure  =>  directory,
    mode    =>  0755,
}
file{"/path/to/config/a.conf":
    ensure  =>  file,
    mode    =>  0755,
    content =>  template("config_template.conf"),
    require => File["/path/to/directory"],
}

Isso fará com que o diretório seja criado antes do arquivo.

    
por 16.09.2015 / 14:42
0

O ethos da resposta de @Sven está absolutamente correto: você configurou as dependências de recursos no Puppet usando before , require , notify , etc. A única coisa que eu mudaria é que usaria o defined() função para testar:

file { '/tmp/foo':
  ensure => 'directory',
  mode   => '0755',
}
if defined(File['/tmp/foo']) {
  notice("/tmp/foo is defined! making /tmp/bar/baz")

  file { '/tmp/bar':
    ensure => 'directory',
    mode   => '0755',
  }

  file { '/tmp/bar/baz':
    ensure  => 'present',
    mode    => '0755',
    require => File['/tmp/bar'],
  }
}

Duas outras informações úteis:

  • Se você ativar o "Analisador futuro" no Puppet 3.2+, pode acessar atributos de recursos da seguinte forma: $a = File['/tmp/foo']['ensure'] . Isso armazenaria o valor do atributo ensure para o recurso de arquivo /tmp/foo na variável $a . Se você decidir analisar isso, eu reescreveria o exemplo acima para usar if defined(File['/tmp/foo']) and File['/tmp/foo']['ensure'] == 'directory' (UNTESTED).

  • Se você passar esses itens como parâmetros para uma classe, há uma maneira sorrateira de acessar os valores dos parâmetros de classe por meio de .

por 16.09.2015 / 16:53