Мы начинаем использовать 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}'"
}
}
}
}