O recurso de arquivo não deve ignorar arquivos se existir um recurso de arquivo separado no projeto de marionetes

2

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.

    
por wimh 29.06.2014 / 19:08

1 resposta

0

Como não parece haver uma solução, adicionarei duas soluções alternativas:

O primeiro também é mencionado no tíquete python :: virtualenv ; Especifique o local de origem (novamente):

file { '/tmp/foo/installer/requirements.txt':
  source  => 'puppet:///modules/foo/foo/installer/requirements.txt',
  ...
}

Outra maneira é especificar um nome de arquivo diferente, que não está incluído na primeira cópia recursiva, e usá-lo para outras dependências:

file { '/tmp/foo/installer/requirements.tmp.txt':
  source  => '/tmp/foo/installer/requirements.txt',
  ...
}

python::virtualenv { '/tmp/python-virtualenv':
  requirements => '/tmp/foo/installer/requirements.tmp.txt',

Isso também pode ser implementado como uma definição que envolve o python :: virtualenv nesse caso.

    
por 01.07.2014 / 10:07

Tags