Layman overlays e Puppet

3

Estamos começando a usar o Puppet como forma de gerenciar a configuração em nossos vários servidores. Temos um repositório do Portage com alguns pacotes próprios, com cada máquina usando o Layman para gerenciar as sobreposições.

É fácil o suficiente para instalar pacotes no fantoche, mas como devemos nos certificar de que o Layman esteja configurado ? Existe um módulo lá fora?

    
por Marcus Downing 03.03.2011 / 15:42

2 respostas

3

Eu não sei as especificidades do gentoo, portage ou layman, e não vejo nenhum módulo existente no módulo de marionetes forjar mas a partir de uma rápida olhada em alguma documentação leiga do gentoo , parece que seria bastante fácil Escreva você mesmo com o Puppet:

stage { "first": before => Stage[main] } # Set up first stage, before main

class layman { # "overlays"?
  package { "layman": ensure => present }
  # Then everything else (file, execs, whatever) to configure layman,
  # overlays, etc
  # Looks to me like you need to change /etc/make.conf, /etc/layman/layman.cfg
  # and write some execs that run "layman -a <overlay-name>"
  # depending on output of "layman -i <overlay-name>"
  # or possibly grepping /var/lib/layman/overlays.xmls
}

class{"layman": stage => "first"} # Set layman class to run in the first stage

Em vez de usar estágios, você pode ter require => Class[layman] em todas as instruções package que precisam dele. Usar require é mais detalhado; Eu usaria isso se eu precisasse apenas de algumas coisas, ou se eu estivesse exigindo uma sobreposição específica. Eu acredito que você deve geralmente evitar o uso requer que os limites do palco cruzado, no entanto, como é redundante e provavelmente agradar bugs estranhos .

Alternativo, dependendo do que você precisa, evita etapas e apenas explicitamente exige ordem. Eu faço coisas assim com o RHEL e o yum repos:

# In a "layman" module.
class layman {
  [...]
}

define layman::overlay() {
  exec {
    "layman -a $name":
      require => Class[layman],
      creates => "/var/lib/layman/${name}",
  }
}

class layman::overlay::php {
  layman::overlay { "php": }
}

class layman::overlay::apache2 {
  layman::overlay { "apache2": }
}

class apache {
  include layman::overlay::apache2
  package { "apache2":
    ensure => present,
    require => Class[layman::overlay::apache2];
  }
  file { "/etc/apache2/conf.d/whatever.conf":
    source => "...",
    require => Package[apache2],
    notify => Service[apache2];
  }
  service { "apache2":
    ensure => running,
    enable => true,
    require => [ Package[apache2], File["/etc/apache2/conf.d/whatever.conf"] ];
  }

}

# "yoursite" module or "somephpapp" module
class yoursite::somephpapp {
  include apache
  include layman::overlay::php
  package { "somephpapp":
    ensure => present,
    require => [ Class[apache], Class[layman::overlay::php] ];
  }
  file {
    "/path/to/somephpapp.conf":
      source => "...",
      require => Package[somephpapp],
      notify => Service[apache2]; # probably not actually required, example
  }
}
    
por 03.03.2011 / 19:22
1

Para além da resposta gratuita, aqui está o que acabei com.

class packages-layman {
    Exec { path => '/usr/bin:/bin:/usr/sbin:/sbin', loglevel => 'debug' }

    package { 'app-portage/layman': ensure => 'installed' }

    file { '/etc/eix-sync.conf':
        ensure => present,
        content => '*',
    }

    line { 'layman-make.conf-overlay':
        file => '/etc/make.conf',
        line => 'source /var/lib/layman/make.conf',
    }

    exec { 'layman-list':
        command => 'layman -o "http://dev.mycompany.com" -L',
        require => [
            Package['app-portage/layman'],
            Service['openvpn']
        ],
    }

    exec { 'layman-my-overlay':
        command => 'layman -o "http://dev.mycompany.com" -a myoverlay',
        returns => [0,1],
        require => Exec['layman-list'],
    }

    exec { 'layman-eix-sync':
        command => 'eix-sync',
        require => [
            File['/etc/eix-sync.conf'],
            Line['layman-make.conf-overlay'],
            Exec['layman-my-overlay'],
        ],
    }
}

Observe que o exec 'lista de leigos' está lá para superar o que parece ser um erro na versão do layman no Gentoo que impede que as sobreposições funcionem até que elas sejam listadas.

O Puppet pode optar por executar comandos em qualquer ordem aleatória, portanto, a ordem das várias tarefas é imposta com todas as entradas require . Para garantir que uma tarefa aconteça depois desta, use require da seguinte forma:

package { 'app-misc/my-custom-package':
    ensure => 'installed',
    require => Exec['layman-eix-sync']
}

Ele precisa esta definição de line do wiki do Puppet para permitir que você edite linhas simples de um arquivo maior:

define line($file, $line, $ensure = 'present') {
    case $ensure {
        default : { err ( "unknown ensure value ${ensure}" ) }
        present: {
            exec { "/bin/echo '${line}' >> '${file}'":
                unless => "/bin/grep -qFx '${line}' '${file}'"
            }
        }
        absent: {
            exec { "/usr/bin/perl -ni -e 'print unless /^\Q${line}\E\$/' '${file}'":
                onlyif => "/bin/grep -qFx '${line}' '${file}'"
            }
        }
    }
}
    
por 10.03.2011 / 10:15

Tags