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

Puppet вызывает бесконечные перезапуски CUPS (как это предотвратить)

Это имеет смысл и на самом деле предлагается на этом сайте, чтобы критическое изменение файла запускало перезапуск службы с мета-параметрами марионетки (такими как уведомление или подписка). Например:

  ## 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. Изменить версию кукловода /etc/cups/printers.conf
  2. puppetmaster отправляет новую версию клиенту, вызывая перезапуск чашек
  3. cupsd restart настаивает на том, чтобы поставить собственную отметку времени в верхней части printers.conf, «Написано cupsd ...»
  4. Это изменение будет считаться устаревшим, поэтому после 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 использовался патч, предотвращающий запись метки времени.