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

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

如果某个文件在其他地方有单独的定义,那么 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 的定义来实现。

相关内容