似乎傀儡不复制作为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的定义来实现。