Назад | Перейти на главную страницу

Файловый ресурс не должен пропускать файлы, если в марионеточном проекте существует отдельный файловый ресурс.

Похоже, что марионетка не копирует файл, который является частью рекурсивного ресурса, если где-то еще есть отдельное определение для этого файла. Есть ли способ избежать этого?

Например, это не работает:

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

в модуль требований (используется модуль virtualenv) определение файла используется следующим образом:

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

Потому что я не определяю File[$requirements] в моем проекте он будет определен здесь, и моя версия этого файла не будет скопирована.

Если это важно, я использую puppet 2.7.23 в Debian 7.

Поскольку решения нет, я добавлю два обходных пути;

Первый также упоминается в 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.