木偶导致无尽的CUPS重启(如何防止这一点)

这是有道理的,事实上在这个网站上build议,有一个关键的文件更改触发服务重新启动木偶元参数(如通知或订阅)。 例如:

## 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的情况下,这会触发无尽的重启循环; 逻辑工作是这样的:

  1. 更改puppetmaster版本的/etc/cups/printers.conf
  2. 傀儡大师推出新版本的客户端,触发杯子重新启动
  3. cupsd重启坚持把自己的时间标记在printers.conf的顶部,“由cupsd写…”
  4. 这个改变将被视为过时,所以在运行runinterval之后,我们返回到(1)。

有没有办法来压制cupsd的时间戳文件的需要? 还是有木偶戏可以帮助吗?

谢谢!

您可以将该文件复制到另一个名称,并且只有在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"], } 

另一种方法是使用lpadmin将打印机添加到CUPS,以防printer.conf中缺less打印机。

例如:

 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"]; } 

这样,我们就可以在CUPS运行时避免与printers.conf混淆了。 要删除打印机,我们可以使用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可能被分解成可重用的东西,使用variables魔术等等。

由于cupsd坚持要修改printers.conf ,所以不能replace整个文件,而是需要逐行修改它。 看看http://projects.puppetlabs.com/projects/puppet/wiki/Simple_Text_Patterns它会告诉你如何replace文件的一部分。

我以前见过这个问题,看起来它将在CUPS 1.4.7中被上游修复,所以如果改变了,它只会重写文件(更新时间戳)。

Fedora Bug#565674描述了1这个修复,Debian用来携带一个修补程序来防止时间戳被写入。