Назад | Перейти на главную страницу

Запускать puppet exec при обновлении файла сразу после первого применения

Я хочу запустить ресурс exec марионетки на основе обновления файла. Что-то вроде:

File { '/tmp/foo.bar':
    audit => content,
} ~>
exec { 'deployment':
    command => 'do_something_meaningful.sh',
}

Но это выполняется при каждом запуске марионетки. Даже если файл не изменился. Итак, я попробовал атрибут exec refreshonly. Но при этом exec не выполняется при первом применении марионетки. Я думаю, это потому, что еще нет контрольной суммы md5 в state.yml. Он отлично работает со второй попытки.

Мой текущий обходной путь выглядит примерно так:

File { '/tmp/foo.bar':
    audit => content,
} 

exec { 'deployment_on_change':
    command     => 'do_something_meaningful.sh',
    refreshonly => true,
    subscribe   => File['/tmp/foo.bar']
}

exec {'deployment_on_first_run':
    command   => 'do_something_meaningful.sh',
    onlyif    => 'test ! -f marker.file',
    subscribe   => File['/tmp/foo.bar']
} ->
file { 'marker.file':
    ensure => present
}

Есть ли более элегантный способ решить эту проблему?

Вы заставляете Puppet делать то, для чего он не предназначен. Выполняя это, вы только продляете каждый запуск Puppet. А ты этого не хочешь.

Просто используйте cron job, который проверит, не изменилось ли что-то.

file{'/usr/bin/local/do_something_meaningful':
  ensure  => present,
  owner   => 'myuser',
  mode    => '0755',
  source  => 'puppet:///modules/my_module/do_something_meaningful.sh',
}

cron { 'do_something_meaningful':
  command => '/usr/bin/local/do_something_meaningful',
  user    => 'myuser',
  hour    => ['8-17'],
  minute  => '*/30',
  require => File['/usr/bin/local/do_something_meaningful'],
}

Если вы развертываете код с помощью другого инструмента, вам следует подключить do_something_meaningful.sh в процесс развертывания. Puppet хорош для обеспечения существования некоторых ресурсов (файлов, пакетов, служб и т. Д.).