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

Запускать команду puppet exec только в том случае, если выходной файл был изменен

Я использую команду exec для запуска сценария оболочки, который изменяет определенные файлы конфигурации других пакетов. Команда exec запускается всякий раз, когда меняются входные параметры, такие как IP-адреса, порты или URL-адрес, или когда изменяется сам сценарий оболочки.

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

Но эта конфигурация не определяет, когда какой-либо из файлов конфигурации был изменен за пределами марионетки. Puppet не знает о файлах, которые были изменены сценарием оболочки.

Я ищу способ сделать команду exec зависимой от контрольных сумм других произвольных файлов:

exec { "my_command.sh":
  only_if_file_has_changed => [ 
    "/etc/mysoftware/config.xml", 
    "/etc/othersoftware/defaults", 
  ]
}

Это возможно? Пожалуйста, порекомендуйте.

Это будет работать так:

exec { 'my_command.sh':
  command   => '/bin/my_command.sh',
  subscribe => [ 
    File['/etc/mysoftware/config.xml'], 
    File['/etc/othersoftware/defaults'], 
  ],
  refreshonly => true,
}

Очевидным ограничением здесь является то, что файлы /etc/mysoftware/config.xml и /etc/othersoftware/defaults также необходимо изменить через Puppet.
Если они заменены чем-то другим (внешним по отношению к Puppet), см. Ответ Феликса.
Вы также можете подписаться на Package['xxx'] или, конечно, любая другая более подходящая зависимость.

Puppet может решить эту проблему с помощью аудит метапараметр.

file { [ "/etc/mysoftware/config.xml", 
         "/etc/othersoftware/defaults" ]:
    audit => 'content',
    notify => Exec['my_command'],
}