O Puppet causa reinícios infinitos do CUPS (como se evita isso)

6

Faz sentido e é de fato sugerido neste site , para ter uma alteração crítica no arquivo desencadear uma reinicialização de serviço com meta-parâmetros fantoches (como notificar ou inscrever-se). Por exemplo:

  ## 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']
  }

Mas, no caso do CUPS, isso aciona um loop infinito de reinicializações; a lógica funciona assim:

  1. Alterar a versão do puppetmaster %código%
  2. puppetmaster empurra nova versão para cliente, reiniciando xícaras de disparo
  3. o cupsd restart insiste em colocar o seu próprio carimbo de hora no topo da printers.conf, 'escrito por cupsd ...'
  4. Essa alteração será vista como fora de data, então depois de /etc/cups/printers.conf , nós volte para (1).

Existe uma maneira de suprimir a necessidade do cupsd de registrar o tempo no arquivo? Ou há algum truque de marionetes que possa ajudar aqui?

Obrigado!

    
por Purfideas 14.05.2010 / 00:48

4 respostas

2

Você pode copiar o arquivo para outro nome e ter um exec para copiar somente se o arquivo printers.conf não contiver uma linha que você precise. Por exemplo.

    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"],
    }
    
por 06.12.2010 / 16:58
5

Uma abordagem alternativa é usar lpadmin para adicionar a impressora ao CUPS, caso esteja ausente do arquivo printers.conf.

Por exemplo:

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

Desta forma evitamos mexer com o printers.conf enquanto o CUPS está rodando. Para remover uma impressora, podemos usar lpadmin -x PRINTER-NAME (consulte a página do manual do lpadmin )

Um exemplo mais concreto:

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 }
    }
}

O print-common::lex250 poderia então ser fatorado em algo reutilizável, usando magia variável, etc.

    
por 17.08.2011 / 17:37
3

Como cupsd insiste para modificar printers.conf , não é possível substituir o arquivo inteiro, em vez disso, é necessário modificá-lo linha por linha. Confira link Ele mostrará como substituir partes de um arquivo.

    
por 19.05.2010 / 21:40
0

Eu já vi esse problema antes e parece que ele será corrigido pelo upstream no CUPS 1.4.7, então ele só irá reescrever o arquivo (atualizando o timestamp) se uma mudança tiver sido feita.

O Fedora Bug # 565674 descreve 1 esta correção, e o Debian costumava carregar um patch que previne o timestamp de ser escrito.

    
por 19.08.2011 / 08:33

Tags