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

Наложения непрофессионала и марионетка

Мы начинаем использовать Puppet как способ управления конфигурацией наших различных серверов. У нас есть репозиторий Portage с несколькими собственными пакетами, где каждая машина использует Layman для управления наложениями.

Это достаточно легко установить пакеты в марионетке, но как мы должны убедиться, что Layman настроен? Есть там модуль?

Я не знаю специфики gentoo, portage или непрофессионала, и я не вижу никаких существующих модулей в марионеточный модуль кузница но с беглого взгляда на некоторая документация для непрофессионала по gentoo похоже, было бы довольно просто написать это самостоятельно с помощью 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

Вместо использования этапов вы могли бы вместо этого иметь require => Class[layman] на всех package заявления, которые в этом нуждаются. Использование require более подробное; Я бы использовал его, если бы мне нужно было всего несколько вещей или если бы мне требовалось определенное наложение. Я считаю, что вам, как правило, следует избегать использования требований, которые пересекают границы стадии, поскольку это одновременно избыточно и, вероятно, пощекочет странные ошибки.

Альтернатива, в зависимости от того, что вам нужно, избегает этапов и требует только явного упорядочивания. Я делаю такие вещи с репозиториями RHEL и yum:

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

В дополнение к ответу freiheit, вот что у меня получилось.

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

Обратите внимание, что exec «layman-list» предназначен для преодоления того, что кажется ошибкой в ​​версии layman в Gentoo, которая препятствует работе оверлеев до тех пор, пока они не будут перечислены.

Puppet может запускать команды в любом случайном порядке, поэтому порядок выполнения различных задач обеспечивается всеми require записи. Чтобы убедиться, что задача выполняется после этой, используйте require вот так:

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

Это нужно это определение line из Puppet wiki, чтобы вы могли редактировать отдельные строки большего файла:

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