Это имеет смысл и на самом деле предлагается на этом сайте, чтобы критическое изменение файла запускало перезапуск службы с мета-параметрами марионетки (такими как уведомление или подписка). Например:
## file definition for printers.conf
file { "/etc/cups/printers.conf":
[snip],
source => "puppet:///module/etc/cups/printers.conf"
}
## service definition for sshd
service { 'cups':
ensure => running,
subscribe => File['/etc/cups/printers.conf']
}
Но в случае CUPS это триггеры и бесконечный цикл перезапусков; логика работает так:
/etc/cups/printers.conf
runinterval
, вернемся к (1).Есть ли способ подавить потребность cupsd в отметке времени файла? Или здесь может помочь кукольный трюк?
Спасибо!
Альтернативный подход - использование lpadmin
чтобы добавить принтер в CUPS, если он отсутствует в printers.conf.
Например:
exec {
"/usr/sbin/lpadmin -p Lexmark-E450 -E -v usb://Lexmark/E450 -P /path/to/Lexmark_E450.ppd":
unless => "/bin/grep Lexmark-E450 /etc/cups/printers.conf 2>/dev/null",
require => File["/path/to/Lexmark_E450.ppd"];
}
Таким образом мы избегаем путаницы с printers.conf во время работы CUPS. Чтобы удалить принтер, мы можем использовать lpadmin -x PRINTER-NAME
(см. lpadmin справочная страница)
Более конкретный пример:
class print-common::lex250 {
exec {
"/usr/sbin/lpadmin -p Lexmark-E250 -E -v usb://Lexmark/E250d -P /path/to/PRINTER.ppd":
unless => "/bin/grep Lexmark-E250 /etc/cups/printers.conf 2>/dev/null",
require => File["/path/to/PRINTER.ppd"];
}
}
class print-common {
package {
"cups": ensure => installed;
}
service {
"cups":
ensure => running,
require => Package["cups"],
subscribe => File["/etc/cups/cupsd.conf"];
}
file {
"/etc/cups/cupsd.conf":
ensure => present,
owner => root,
group => root,
mode => 644,
source => "puppet://puppet.mr.lan/files/etc/cups/cupsd.conf";
"/path/to/ppd/":
ensure => directory;
"/path/to/PRINTER.ppd":
ensure => present,
owner => root,
group => root,
mode => 644,
source => "puppet://puppet.mr.lan/files/path/to/PRINTER.ppd",
require => File["/path/to/ppd/"];
}
case $fqdn {
'host1.domain.name','host2.domain.name': { include print-common::lex250 }
}
}
В print-common::lex250
затем, вероятно, можно было бы выделить что-то многоразовое, используя переменную магию и т.
поскольку cupsd
настаивает на изменении printers.conf
вы не можете заменить весь файл, вместо этого вам нужно изменить его построчно. Проверять, выписываться http://projects.puppetlabs.com/projects/puppet/wiki/Simple_Text_Patterns он покажет вам, как заменить части файла.
Вы можете скопировать файл с другим именем и иметь команду exec для копирования только в том случае, если printers.conf не содержит нужной вам строки. Например.
file { "/etc/cups/printers.conf.puppet":
source => "puppet:///modules/desktop/cups/printers.conf",
mode => 0600,
owner => root,
group => lp;
}
# cups will put it's own timestamp in printers.conf, causing a loop if
# puppet always replaces if the timestamp is different. This only replaces
# the file is HP-Laserjet is not present
exec { "/bin/cp /etc/cups/printers.conf.puppet /etc/cups/printers.conf":
unless => '/bin/grep "HP-LaserJet-2300" /etc/cups/printers.conf 2>/dev/null',
subscribe => File["/etc/cups/printers.conf.puppet"],
refreshonly => "true",
require => Package["cups"],
notify => Service["cups"],
}
Я видел эту проблему раньше, и похоже, что она будет исправлена апстримом в CUPS 1.4.7, поэтому он будет перезаписывать файл (обновляя временную метку) только в случае внесения изменений.
Fedora Bug # 565674 описывает1 это исправление, а в Debian использовался патч, предотвращающий запись метки времени.