Puppet 导致 CUPS 无限重启(如何防止这种情况发生)

Pur*_*eas 6 cups puppet

这是有道理的,实际上是在这个站点上建议的 ,让关键文件更改触发带有 puppet 元参数(例如通知或订阅)的服务重新启动。例如:

  ## 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']
  }
Run Code Online (Sandbox Code Playgroud)

但是在 CUPS 的情况下,这会触发无限循环的重启;逻辑是这样的:

  1. 更改傀儡师的版本 /etc/cups/printers.conf
  2. puppetmaster 向客户端推送新版本,触发cups 重启
  3. cupsd restart 坚持将自己的时间戳放在printers.conf 的顶部,“由cupsd 编写...”
  4. 此更改将被视为过时,因此在 之后runinterval,我们返回到(1)。

有没有办法抑制cupsd需要给文件加时间戳?或者是否有木偶戏法可以在这里提供帮助?

谢谢!

小智 5

另一种方法是使用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"];
}
Run Code Online (Sandbox Code Playgroud)

这样我们就可以避免在 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 }
    }
}
Run Code Online (Sandbox Code Playgroud)

print-common::lex250会那么很可能被分解出来的东西可重复使用,使用可变魔术等


Ham*_*ner 2

您可以将文件复制到另一个名称,并让 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"],
    }
Run Code Online (Sandbox Code Playgroud)