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