Проверка наличия каталога перед копированием в Puppet - PullRequest
1 голос
/ 22 марта 2019

Я пытаюсь получить резервную копию подкаталога перед удалением родительского каталога путем копирования подкаталога в другое место.

Вот как я это сделал:

exec { "install_path_exists":
  command => "/bin/true",
  onlyif  => "/usr/bin/test -d ${install_path}",
  path    => ['/usr/bin','/usr/sbin','/bin','/sbin'],
}
file { "server_backup_dir" :
  ensure  => 'directory',
  path    => "${distribution_path}/backup/server",
  recurse => true,
  source  => "file:///${install_path}/repository/deployment/server",
  require => Exec["install_path_exists"],
}

Exec проверяет, существует ли каталог, и возвращает true, если это так.Файловому ресурсу «server_backup_dir» требуется, чтобы exec «install_path_exists» возвращал true, если каталог существует.

Когда каталог не существует, а «install_path_exists» возвращает false, «server_backup_dir» выполняется в любом случае и выдает следующееошибка.

Ошибка: / Stage [main] / Is / File [server_backup_dir]: Не удалось оценить: Не удалось получить информацию из файла источника (-ов) производственной среды: //// usr / local/ {project_location} / репозиторий / развертывание / сервер

Что не так с моим подходом и как я могу это исправить?Заранее спасибо.

1 Ответ

2 голосов
/ 22 марта 2019

Я разобью это на две части, что не так, и как это исправить.


Что не так с моим подходом ...

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...