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.