Я разобью это на две части, что не так, и как это исправить.
Что не так с моим подходом ...
Вы неправильно понимаете строку 'require' и природу отношений в Puppet, а также то, как Puppet использует код возврата команды, выполненной в Exec.
Когда вы используете любой из четырехназывается метапараметрами для отношений в Puppet, а именно: require
, before
, subscribe
& notify
- вы говорите Puppet, что хотите, чтобы приложение одного ресурса было упорядоченным во времени по отношению к другому.(Кроме того, команды «подписаться» и «уведомить» отвечают на события обновления , но здесь это не имеет значения.)
Итак, когда Puppet применяет каталог, созданный из вашего кода, он в первую очередь будет применятьсяресурс Exec, т.е. выполнить команду / bin / true, если и только если существует путь установки;и затем он во-вторых будет управлять ресурсом файла server_backup_dir.Также обратите внимание, что он будет применять ресурс File независимо от того, была ли фактически выполнена команда Exec;единственная гарантия состоит в том, что / bin / true никогда не будет запущен после ресурса File.
Кроме того, код возврата команды в Exec функционирует иначе, чем вы ожидаете.Состояние выхода 0 при возврате команды / bin / true только говорит Puppet, что настройка должна продолжаться;сравните это с командой Exec, возвращающей ненулевой статус выхода, который заставит Puppet остановить выполнение с ошибкой.
Вот простая демонстрация этого:
▶ puppet apply -e "exec { '/usr/bin/false': }"
Notice: Compiled catalog for alexs-macbook-pro.local in environment production in 0.08 seconds
Error: '/usr/bin/false' returned 1 instead of one of [0]
Error: /Stage[main]/Main/Exec[/usr/bin/false]/returns: change from 'notrun' to ['0'] failed: '/usr/bin/false' returned 1 instead of one of [0]
Notice: Applied catalog in 0.02 seconds
Для получения дополнительной информации, внимательно прочитайте страницу, на которую я ссылался выше.Как правило, требуется немного времени, чтобы разобраться в отношениях и упорядочении в Puppet.
Как я могу это исправить?
Вы обычно используете пользовательский факт примерно так:
# install_path.rb
Facter.add('install_path') do
setcode do
Facter::Core::Execution.execute('/usr/bin/test -d /my/install/path')
end
end
А затем в ваших манифестах:
if $facts['install_path'] {
file { "server_backup_dir" :
ensure => 'directory',
path => "${distribution_path}/backup/server",
recurse => true,
source => "file:///my/install/path/repository/deployment/server",
}
}
Консультируется с документами для получения дополнительной информации о написании и включения пользовательских фактов в вашу кодовую базу.
Примечание:
В конце я замечаю, что вы повторно используете $install_path
в параметре source
.Если вам необходимо иметь карту путей установки к путям распространения, вы также можете построить структурированный факт .Однако, не зная точно, что вы пытаетесь сделать, я не могу быть уверен, как бы вы написали этот кусок.