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

марионетка Не удалось найти зависимость

Я унаследовал марионеточный сервер. У него под управлением пара десятков хостов, и он в основном работает нормально.

Когда я говорю, что в основном есть несколько хостов, которые не работают при регистрации:

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? И если да, то какой (их много) и какой версии? Если нет, можете ли вы поделиться модулем?