Parece que o fantoche não copia um arquivo que faz parte de um recurso recursivo, se houver uma definição separada para esse arquivo em outro lugar. Existe uma maneira de evitar isso?
Por exemplo, isso não funciona:
file { '/tmp/foo':
ensure => 'directory',
source => 'puppet:///modules/foo/foo',
recurse => true,
}
file { '/tmp/foo/installer/requirements.txt':
ensure => present,
replace => false,
require => File['/tmp/foo'],
}
saída:
$ ls modules/foo/files/foo/installer/
README.rst requirements.txt
$ rm -r /tmp/foo ; puppet apply --modulepath modules manifests/site.pp
notice: /Stage[main]//File[/tmp/foo]/ensure: created
notice: /File[/tmp/foo/installer]/ensure: created
notice: /File[/tmp/foo/installer/README.rst]/ensure: defined content as '{md5}c25f2f6d9c3254bab1fd8ae5e4384888'
notice: /Stage[main]//File[/tmp/foo/installer/requirements.txt]/ensure: created
notice: Finished catalog run in 0.05 seconds
Portanto, o arquivo requirements.txt
não é copiado como parte da primeira etapa, mas um arquivo vazio é criado como parte da segunda etapa. Mas eu quero que o arquivo seja copiado no primeiro passo e o segundo passo seja ignorado, porque o arquivo já existe e o substituto está definido como falso.
A razão pela qual isso é um problema é que eu uso python::virtualenv
e o arquivo requirements.txt que eu uso é copiado como parte de um recurso de arquivo recursivo.
file { '/tmp/foo':
ensure => 'directory',
source => 'puppet:///modules/foo/foo',
recurse => true,
}
python::virtualenv { '/tmp/python-virtualenv':
ensure => present,
requirements => '/tmp/foo/installer/requirements.txt',
require => File['/tmp/foo'],
....
No módulo de requisitos (usado pelo módulo virtualenv ) uma definição de arquivo é usada assim:
if !defined(File[$requirements]) {
file { $requirements:
ensure => present,
....
replace => false,
content => '# Puppet will install and/or update pip packages listed here',
}
}
Como não defino File[$requirements]
no meu projeto, ele será definido aqui e minha versão desse arquivo não será copiada.
Caso seja importante, eu uso o puppet 2.7.23 no Debian 7.