如果木偶项目中存在单独的文件资源,则文件资源不应跳过文件

似乎傀儡不复制作为recursion资源一部分的文件,如果该文件在其他地方有单独的定义。 有没有办法避免这种情况?

例如,这不起作用:

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

输出:

 $ 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 

因此,作为第一步的一部分,不会将requirements.txt文件复制,但是会在第二步中创build一个空文件。 但是我想要在第一步中复制该文件,并跳过第二步,因为该文件已经存在,replace设置为false。

这是一个问题的原因是我使用python::virtualenv和我使用的requirements.txt文件被复制为recursion文件资源的一部分。

 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'], .... 

在需求模块 (由virtualenv模块使用 )中,文件定义如下所示:

 if !defined(File[$requirements]) { file { $requirements: ensure => present, .... replace => false, content => '# Puppet will install and/or update pip packages listed here', } } 

因为我没有在我的项目中定义File[$requirements] ,所以将在这里定义,我的版本不会被复制。

如果重要的话,我使用Debian 7上的puppet 2.7.23。

由于似乎没有解决办法,我将添加两个解决方法;

第一个也是在python :: virtualenv票中提到的; 指定来源位置(再次):

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

另一种方法是指定一个不包含在第一个recursion副本中的文件名,并将其用于其他依赖项:

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

这也可以作为在这种情况下围绕python :: virtualenv的定义来实现。