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

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

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

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 файл не копируется как часть первого шага, но пустой файл создается как часть второго шага. Но я хочу, чтобы тот файл был скопирован в первом шаге и втором шаге, который будет пропущен, потому что файл уже существует, и замена имеет значение 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] в моем проекте это будет определено здесь, и моя версия того файла не будет скопирована.

В случае, если это важно, я использую марионеточные 2.7.23 на Debian 7.

2
задан 29 June 2014 в 20:08
1 ответ

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

Первый также упоминается в python::virtualenv ticket; Укажите расположение источника (еще раз):

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.

0
ответ дан 3 December 2019 в 15:04

Теги

Похожие вопросы