如果某个文件在其他地方有单独的定义,那么 puppet 似乎不会复制属于递归资源的文件。有没有办法避免这种情况?
例如这不起作用:
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
第一步不会复制文件,而第二步会创建一个空文件。但我希望在第一步复制该文件,并跳过第二步,因为该文件已经存在,并且 replace 设置为 false。
出现这个问题的原因是我python::virtualenv
使用的 requirements.txt 文件是作为递归文件资源的一部分复制的。
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'],
....
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。
答案1
由于似乎没有解决方案,我将添加两个解决方法;
第一个也提到了python::virtualenv 票证;再次指定源位置:
file { '/tmp/foo/installer/requirements.txt':
source => 'puppet:///modules/foo/foo/installer/requirements.txt',
...
}
另一种方法是指定一个不包含在第一个递归副本中的不同文件名,并将其用于其他依赖项:
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 的定义来实现。