Остановите марионеточное ведущее устройство, в то время как Должностное лицо запускает скрипт

Я довольно плохо знаком с марионеткой и думающий, существует ли способ применить ресурс только после того, как команда, инициируемая Должностным лицом, завершается, это - задание. Мое требование - то, что я должен запланировать задание резервного копирования только после того, как другое задание будет завершено. Мой код, данный ниже, не работает. Крон планируется, как только основное задание резервного копирования инициируется.

Править: Я должен выполнить основное задание только однажды во время жизни контейнера (использование докера). Основное задание резервного копирования может занять до 5 часов и вторичное устройство приблизительно один час. Primary-backup-script.py использует subprocess.popen модуль, для запуска задания, которое разветвляет задание в фоне, но я не думаю, что это важно. Исправьте меня, если я неправ.

exec{ 'primary-backup-job':
    command     => '/path/primary-backup-script.py',
    require     => File['/path/primary-backup-script.py'],
    refreshonly => true,
    }

# Schedule cron job only after primary backup is completed.
cron{ schedule-secondary-backup:
    command => "/path/secondary-backup-script.py",
    require => Exec['primary-backup-job'],
    user    => root,
    hour    => 05,
    minute  => 00,
    weekday => 1-5;
    }

Какие-либо мысли или предложения?

0
задан 23 November 2014 в 22:21
2 ответа

Вы неправильно используете инструмент. Puppet - это декларативный язык, то есть вы должны объявлять состояния с помощью puppet, а не управлять вещами. Вы можете это сделать, конечно, но это сложнее, это будет выглядеть неуклюже и подвержено ошибкам.

При использовании марионетки следует по возможности избегать использования ресурса exec. Почему? Поскольку exec является внешним по отношению к «конечному автомату», то есть exec будет изменять систему (для марионетки) неконтролируемым и неизвестным способом.

Связывание других ресурсов с exec может даже ухудшить ситуацию.

Следующая проблема заключается в том, что марионетка не является cron, поэтому вам следует избегать запуска заданий через exec из самого Puppet. Вот почему у нас есть cron.

В вашем конкретном случае не было бы проще добавить однострочное описание создания задания cron в конец вашего исходного скрипта? У вас будет несколько преимуществ:

  • нет необходимости внедрять сложные и подверженные ошибкам хаки для обмена сообщениями с другим процессом
  • нет необходимости внедрять сторожевой таймер
  • нет необходимости отлаживать различные проблемы, которые будут из этого решения.

Если это возможно - просто добавьте создание cron в конец исходного сценария первого резервного копирования. Если это проприетарный инструмент или скрипт - и вы не можете его редактировать, просто создайте простую оболочку bash и вызовите эту оболочку через ресурс exec.

Если вы хотите управлять cron из самой марионетки, вы все равно можете это сделать, но старайтесь избегать связывание ресурсов exec и cron вместе.

В этом случае (когда вы хотите / должны управлять cron из кода марионетки) я бы сделал следующее:

cron { schedule-secondary-backup:
  command => "pgrep primary-backup-script && echo 'still running' || /path/secondary-backup-script.py",
  user    => root,
  hour    => 05,
  minute  => 00,
  weekday => 1-5;
}

Другим решением является изменение основного сценария для создания файла в файловой системе, когда он завершается выполнением, и использование следующей команды cron в предыдущем определении ресурса:

  command => "[ ! -e /path/to/first_script_finished_file ] && /path/secondary-backup-script.py",

Надеюсь, это поможет.

0
ответ дан 5 December 2019 в 13:02

Хм .. Ну, поскольку он работает в фоновом режиме, сложно что-то запустить в ответ на его завершение. Как бы вы относились к переключению вторичного сервера на что-то вроде этого:

exec { 'secondary-backup':
    command => "/path/secondary-backup-script.py",
    unless  => "/bin/ps -ef | /bin/grep primary-backup-script",
}

.. с параметрами grep, установленными на то, что найдет первичный процесс резервного копирования?

Это приведет к вторичному срабатыванию при следующем запуске Puppet после первичное резервное копирование завершено.

0
ответ дан 5 December 2019 в 13:02

Теги

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