Я унаследовал марионеточный сервер. У него под управлением пара десятков хостов, и он в основном работает нормально.
Когда я говорю, что в основном есть несколько хостов, которые не работают при регистрации:
Error: Failed to apply catalog: Could not find dependency File[/etc/postfix/main.cf] for Augeas[set postfix 'relayhost' to 'smtp.mydomain.net']
Я покопался и определил, что определение рассматриваемого класса находится в файле "default.pp"
postfix::config {
"relayhost": value => "smtp.mydomain.net"
}
Мое (возможно, неправильное) понимание того, что этот файл используется каждым хостом, которым управляет марионетка, но проблема существует только на нескольких хостах. Большинство работают нормально.
Следовательно, я работаю над теорией, что проблема на стороне клиента, а не на сервере.
Очевидно, что первым делом нужно проверить, действительно ли файл /etc/postfix/main.cf существует на проблемных хостах. Оно делает.
Я потратил день на поиски этого в Google, и все обнаруженные мной проблемы, как правило, связаны с тем, что люди делают ошибки при написании манифестов. Я нигде не нашел никого, у кого были бы проблемы с конкретными хостами, используя манифест, который, очевидно, работает нормально на других хостах.
Я новичок в puppet (но не в Linux), и мне это интересно, хотя сообщения об ошибках, которые вы получаете из puppet, могут быть несколько загадочными.
Любая помощь приветствуется.
Системы CentOS 6 с марионеткой 3.2.3-1
--- ОБНОВИТЬ ---
(Извините за задержку с ответом, я нахожусь в Австралии, поэтому действуют различия в часовых поясах)
Хорошо, поэтому на основе ответа, данного Крейгом ниже, я нашел каталог марионеток на puppetmaster для экземпляров main.cf
root@svd7puppetmaster:/etc/puppet ] # grep -R main.cf *
modules/postfix/manifests/init.pp: file { '/etc/postfix/main.cf':
modules/postfix/manifests/init.pp: source => 'puppet:///modules/postfix/main.cf',
modules/postfix/manifests/config.pp:#configuation file (/etc/postfix/main.cf).
modules/postfix/manifests/config.pp: incl => '/etc/postfix/main.cf',
modules/postfix/manifests/config.pp: require => File['/etc/postfix/main.cf'],
Содержимое файлов следующее (я удалил комментарии в заголовке для краткости);
root@svd7puppetmaster:/etc/puppet ] # cat modules/postfix/manifests/init.pp
class postfix {
# selinux labels differ from one distribution to another
case $::operatingsystem {
RedHat, CentOS: {
case $::lsbmajdistrelease {
'4': { $postfix_seltype = 'etc_t' }
'5','6': { $postfix_seltype = 'postfix_etc_t' }
default: { $postfix_seltype = undef }
}
}
default: {
$postfix_seltype = undef
}
}
# Default value for various options
if $postfix_smtp_listen == '' {
$postfix_smtp_listen = '127.0.0.1'
}
if $root_mail_recipient == '' {
$root_mail_recipient = 'nobody'
}
if $postfix_use_amavisd == '' {
$postfix_use_amavisd = 'no'
}
if $postfix_use_dovecot_lda == '' {
$postfix_use_dovecot_lda = 'no'
}
if $postfix_use_schleuder == '' {
$postfix_use_schleuder = 'no'
}
if $postfix_use_sympa == '' {
$postfix_use_sympa = 'no'
}
if $postfix_mail_user == '' {
$postfix_mail_user = 'vmail'
}
case $::operatingsystem {
/RedHat|CentOS|Fedora/: {
$mailx_package = 'mailx'
}
/Debian|kFreeBSD/: {
$mailx_package = $::lsbdistcodename ? {
/lenny|etch|sarge/ => 'mailx',
default => 'bsd-mailx',
}
}
'Ubuntu': {
if (versioncmp('10', $::lsbmajdistrelease) > 0) {
$mailx_package = 'mailx'
} else {
$mailx_package = 'bsd-mailx'
}
}
}
$master_os_template = $::operatingsystem ? {
/RedHat|CentOS/ => template('postfix/master.cf.redhat.erb', 'postfix/master.cf.common.erb'),
/Debian|Ubuntu|kFreeBSD/ => template('postfix/master.cf.debian.erb', 'postfix/master.cf.common.erb'),
}
package { 'postfix':
ensure => installed,
}
package { 'mailx':
ensure => installed,
name => $mailx_package,
}
service { 'postfix':
ensure => running,
enable => true,
hasstatus => true,
restart => '/etc/init.d/postfix reload',
require => Package['postfix'],
}
file { '/etc/mailname':
ensure => present,
content => "$::fqdn\n",
seltype => $postfix_seltype,
}
# Aliases
file { '/etc/aliases':
ensure => present,
content => '# file managed by puppet\n',
replace => false,
seltype => $postfix_seltype,
notify => Exec['newaliases'],
}
# Aliases
exec { 'newaliases':
command => '/usr/bin/newaliases',
refreshonly => true,
require => Package['postfix'],
subscribe => File['/etc/aliases'],
}
# Config files
file { '/etc/postfix/master.cf':
ensure => present,
owner => 'root',
group => 'root',
mode => '0644',
content => $master_os_template,
seltype => $postfix_seltype,
notify => Service['postfix'],
require => Package['postfix'],
}
# Config files
file { '/etc/postfix/main.cf':
ensure => present,
owner => 'root',
group => 'root',
mode => '0644',
source => 'puppet:///modules/postfix/main.cf',
replace => false,
seltype => $postfix_seltype,
notify => Service['postfix'],
require => Package['postfix'],
}
# Default configuration parameters
$myorigin = $valid_fqdn ? {
'' => $::fqdn,
default => $valid_fqdn,
}
postfix::config {
'myorigin': value => $myorigin;
'alias_maps': value => 'hash:/etc/aliases';
'inet_interfaces': value => 'all';
}
case $::operatingsystem {
RedHat, CentOS: {
postfix::config {
'sendmail_path': value => '/usr/sbin/sendmail.postfix';
'newaliases_path': value => '/usr/bin/newaliases.postfix';
'mailq_path': value => '/usr/bin/mailq.postfix';
}
}
default: {}
}
mailalias {'root':
recipient => $root_mail_recipient,
notify => Exec['newaliases'],
}
}
и
root@svd7puppetmaster:/etc/puppet ] # cat modules/postfix/manifests/config.pp
define postfix::config ($value, $ensure = present) {
Augeas {
incl => '/etc/postfix/main.cf',
lens => 'Postfix_Main.lns',
notify => Service['postfix'],
require => File['/etc/postfix/main.cf'],
}
case $ensure {
present: {
augeas { "set postfix '${name}' to '${value}'":
changes => "set $name '$value'",
}
}
absent: {
augeas { "rm postfix '${name}'":
changes => "rm $name",
}
}
default: {}
}
}
Манифест для хостов довольно прост. Для краткости я не буду размещать их здесь, если вас не попросят. Они в значительной степени просто определяют сетевой IP и ntp-серверы. Ничего общего с postfix. Они наследуются от другого манифеста, который касается только некоторых настроек snmp и системного журнала, и который, в свою очередь, наследуется от default.pp, который содержит раздел постфикса (показанный в начале этого вопроса), который вызывает проблему (если я закомментирую его проблема исчезает)
Единственная разница между рабочим хостом и неработающим хостом - это буквально имя узла и его IP-адрес, в остальном два манифеста идентичны.
Я могу опубликовать содержимое этих файлов, если кто-нибудь захочет их увидеть.
Еще я проверил провидение модуля postfix:
root@svd7puppetmaster:/etc/puppet ] # puppet module list | grep postfix
├── postfix (???)
Я предполагаю, что, поскольку модуль не имеет префикса "puppetlabs", то это не официальный модуль? Я не знаю, как еще это проверить.
--- ОБНОВИТЬ ---
Извините за задержку, в наших производственных системах произошла небольшая драма, на которую потребовалось некоторое время, так что это пришлось отложить.
Как бы то ни было, это мешает мне. Я взял два хоста, один из которых работает, а другой не работает.
Я создал для них обоих совершенно пустые манифесты:
node myhost1 {
}
Таким образом, манифест приложения:
node application {
}
Тем не менее, когда я запускаю марионеточный агент на них обоих, я получаю разные результаты:
[09:32:55 root@myhost01:~ ] # puppet agent --test
Info: Retrieving plugin
Info: Loading facts in /var/lib/puppet/lib/facter/os_maj_version.rb
Info: Loading facts in /var/lib/puppet/lib/facter/iptables_persistent_version.rb
Info: Loading facts in /var/lib/puppet/lib/facter/ip6tables_version.rb
Info: Loading facts in /var/lib/puppet/lib/facter/root_home.rb
Info: Loading facts in /var/lib/puppet/lib/facter/puppet_vardir.rb
Info: Loading facts in /var/lib/puppet/lib/facter/concat_basedir.rb
Info: Loading facts in /var/lib/puppet/lib/facter/pe_version.rb
Info: Loading facts in /var/lib/puppet/lib/facter/iptables_version.rb
Info: Caching catalog for myhost01.mydomain.net
Info: Applying configuration version '1426804333'
Notice: Finished catalog run in 1.00 seconds
и
[root@myhost02 datawarehouse]# puppet agent --test
Info: Retrieving plugin
Info: Loading facts in /var/lib/puppet/lib/facter/os_maj_version.rb
Info: Loading facts in /var/lib/puppet/lib/facter/root_home.rb
Info: Loading facts in /var/lib/puppet/lib/facter/iptables_version.rb
Info: Loading facts in /var/lib/puppet/lib/facter/concat_basedir.rb
Info: Loading facts in /var/lib/puppet/lib/facter/ip6tables_version.rb
Info: Loading facts in /var/lib/puppet/lib/facter/puppet_vardir.rb
Info: Loading facts in /var/lib/puppet/lib/facter/pe_version.rb
Info: Loading facts in /var/lib/puppet/lib/facter/iptables_persistent_version.rb
Info: Caching catalog for myhost02.mydomain.net
Error: Failed to apply catalog: Could not find dependency File[/etc/postfix/main.cf] for Augeas[set postfix 'relayhost' to 'smtp.mydomain.net']
Ясно, что мне сильно не хватает понимания того, как работает марионетка, потому что я не могу понять, почему два хоста с пустыми манифестами будут вести себя по-разному.
В любом случае, спасибо за вашу помощь этим ребятам, но я думаю, что сейчас просто положу это в слишком сложную корзину.
Ваш Error: Failed to apply catalog: Could not find dependency File[/etc/postfix/main.cf] for Augeas[set postfix 'relayhost' to 'smtp.mydomain.net']
означает, что где-то в ваших манифестах есть augeas { "set postfix 'relayhost' to ...."
с require File['/etc/postfix/main.cf']
, подразумевая, что марионетка должна сначала установить основную конфигурацию postfix, а затем настроить ваш relayhost, а рассматриваемый файл не является частью применяемого вами каталога.
Боковое примечание по этому поводу: если вы каждый раз устанавливаете свой основной шаблон постфикса, то заставляйте augeas редактировать relayhosts: puppet будет редактировать конфигурацию постфикса дважды при каждом запуске. Вы можете изучить здесь использование единого шаблона ИЛИ добавить replace => no
к file{}
установка основной конфигурации postfix.
Возвращаясь к вашей проблеме, похоже, вы включаете postfix::config
, но не включены postfix
сам, который (AFAIU) установил бы основную конфигурацию postfix.
Прежде чем нарушать каждую конфигурацию постфикса, управляемую этим мастером марионеток, вы можете убедиться, что вы работаете в отдельной среде. Затем, в качестве дикой догадки / не видевшей многого из вашей настройки: отредактируйте свой postfix/manifests/config.pp
добавление где-то внутри postfix::config
определение:
if (! defined(Class["postfix"])) {
include postfix
}
Обратите внимание на узел, на котором он «работал», теперь может быть затронут повторяющимся определением постфикса: ищите другие включения, добавляя эту проверку определения, ...
В качестве отказа от ответственности: вам не следует редактировать манифесты марионеток, если вы не знаете, что делаете (учитывая всех зарегистрированных клиентов, которые обновят свою конфигурацию, ... даже в лучших условиях все может сломаться, ...)
Это определенно проблема с манифестами кукловода, но предположительно запущен из-за некоторого изменения клиентов, вызывающего оценку другого бита манифеста марионетки, где-то в модуле постфикса.
Где-то в модуле postfix будет ресурс augeas с зависимостью от файла ['/ etc / postfix / main.cf'] (требовать, уведомить, подписаться и т.п.), но файл {'/ etc / postfix / main Ресурс .cf ':} по какой-то причине не был объявлен (возможно, он находится внутри' if 'или чего-то еще). Трудно догадаться, что, без более подробной информации о модуле postfix.
Постфиксный модуль из Puppetlabs Puppetforge? И если да, то какой (их много) и какой версии? Если нет, можете ли вы поделиться модулем?