puppet Não foi possível encontrar dependência

1

Eu herdei um servidor de marionetes. Ele tem algumas dúzias de hosts sob gerenciamento e está funcionando normalmente.

Quando digo principalmente, há alguns hosts que falham no check-in:

Error: Failed to apply catalog: Could not find dependency File[/etc/postfix/main.cf] for Augeas[set postfix 'relayhost' to 'smtp.mydomain.net']

Eu investiguei e determinei que a definição de classe em questão está no arquivo "default.pp"

postfix::config {
    "relayhost": value  => "smtp.mydomain.net"
}

Agora, é meu (possivelmente incorreto) entender que esse arquivo é usado por todos os hosts que são gerenciados pelo Puppet, mas o problema só existe em um punhado de hosts. A maioria funciona bem.

Por isso, estou trabalhando na teoria de que o problema está no lado do cliente e não no servidor.

Obviamente, a primeira coisa a verificar é se o arquivo /etc/postfix/main.cf realmente existe nos hosts problemáticos. Faz.

Eu passei o dia procurando isso e todos os problemas que encontrei tendem a ser pessoas cometendo erros enquanto escrevem manifestos. Em nenhum lugar eu encontrei alguém que está tendo problemas com hosts específicos usando um manifesto que aparentemente funciona bem em outros hosts.

Eu sou novo no fantoche (mas não no Linux) e estou achando interessante, mesmo que as mensagens de erro que você tira do fantoche possam ser um pouco enigmáticas.

Qualquer ajuda é muito bem-vinda.

Os sistemas são o CentOS 6 com fantoches 3.2.3-1

--- ATUALIZAÇÃO ---

(Desculpe pela demora em responder, estou na Austrália, então as diferenças de fuso horário se aplicam)

OK, então com base na resposta dada por Craig abaixo, eu tenho grepped o dir de fantoche no mestre de bonecos para instâncias de 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'],

O conteúdo dos arquivos é o seguinte (removi os comentários do cabeçalho por brevidade);

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

e

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: {}
  }
}

O manifesto dos hosts é bem simples. Por uma questão de brevidade, não vou publicá-las aqui, a menos que seja solicitado. Eles praticamente apenas definem servidores IP e ntp de rede. Nada relacionado ao postfix em tudo. Eles herdam de outro manifesto que está apenas preocupado com algumas configurações snmp e coisas syslogging e que por sua vez herda de default.pp que contém a seção postfix (mostrada no início desta questão) que causa o problema (se eu comentar o problema desaparece)

A única diferença entre um host funcional e um host não funcional é literalmente o nome do nó e seu endereço IP, caso contrário, os dois manifestos são idênticos.

Eu posso postar o conteúdo desses arquivos se alguém quiser vê-los.

Eu também verifiquei o providência do módulo postfix:

root@svd7puppetmaster:/etc/puppet ] # puppet module list | grep postfix
├── postfix (???)

Estou assumindo que, como o módulo não é prefixado por "puppetlabs", ele não é um módulo oficial? Não sei mais como verificar isso.

--- ATUALIZAÇÃO ---

Sinto muito pelo atraso, tive um pouco de drama em nossos sistemas de produção que levou algum tempo para que isso tivesse que ficar em segundo plano.

De qualquer forma, isso está fazendo a minha cabeça dentro Eu peguei dois hosts, um que está funcionando, o outro que está falhando.

Eu criei manifestos completamente vazios para os dois:

node myhost1 {

}

O manifesto do aplicativo é assim:

node application {

}

No entanto, quando eu corro o agente de marionetes neles, obtenho resultados diferentes:

[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

e

[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']

Claramente, minha compreensão de como funciona o fantoche está gravemente deficiente porque não consigo entender por que dois hosts com manifestos vazios se comportariam de maneira diferente.

De qualquer forma, agradeço a sua ajuda sobre esse pessoal, mas acho que por agora vou colocá-lo na cesta muito difícil.

    
por brettg 17.03.2015 / 06:27

2 respostas

1

Seu Error: Failed to apply catalog: Could not find dependency File[/etc/postfix/main.cf] for Augeas[set postfix 'relayhost' to 'smtp.mydomain.net'] significa que você tem em algum lugar do manifesto um augeas { "set postfix 'relayhost' to ...." com require File['/etc/postfix/main.cf'] , o que implica que o fantoche primeiro instale a configuração principal do postfix e defina seu relayhost, enquanto o arquivo em questão não faz parte do catálogo está aplicando.

Anote o assunto: se você instalar o modelo principal do postfix a cada vez, faça o augeas edit relayhosts: o puppet editaria a configuração do postfix duas vezes em cada execução. Você pode querer investigar o uso de um único modelo aqui ou adicionar um replace => no à configuração principal do postfix de instalação do file{} .

Voltando ao seu problema, parece que você está incluindo postfix::config , mas não incluiu postfix , que (AFAIU) teria instalado a configuração principal do postfix.

Antes de quebrar todas as configurações de postfix dirigidas por esse mestre de fantoches, convém verificar se você está trabalhando em um ambiente separado. Então, como um palpite / não tendo visto muito da sua configuração: edite seu postfix/manifests/config.pp adicionando em algum lugar dentro de postfix::config definition:

if (! defined(Class["postfix"])) {
    include postfix
}

Observe que o nó em que ele "funcionou" pode agora ser afetado por uma definição duplicada de postfix: procure outras inclusões adicionando essa verificação de definição, ...

Como um aviso: você não deve editar seus manifestos de fantoches a menos que você saiba o que está fazendo (considerando todos os clientes registrados que atualizarão sua configuração, ... mesmo nas melhores condições, qualquer coisa pode quebrar, ... )

    
por 07.02.2017 / 07:31
0

É definitivamente um problema com os manifestos no mestre de fantoches, mas é presumivelmente desencadeado por alguma variação nos clientes fazendo com que um bit diferente dos manifestos de fantoches seja avaliado, em algum lugar no módulo postfix .

Em algum lugar no módulo postfix, haverá um recurso augeas com dependência do arquivo ['/ etc / postfix / main.cf'] (um require, notify, subscribe ou similar), mas o arquivo {'/ etc / O recurso postfix / main.cf ':} não foi declarado por algum motivo (talvez esteja dentro de um' if 'ou algo assim). É difícil adivinhar o quê, sem mais detalhes sobre o módulo postfix.

O módulo postfix do puppetforge do puppetlabs? E se sim, qual (existem muitos) e qual versão? Se não, você é capaz de compartilhar o módulo?

    
por 17.03.2015 / 07:46

Tags