我inheritance了一个傀儡服务器。 它有几十个主机在pipe理,它大多工作正常。
当我主要说有几个主机检查时失败:
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" }
现在,我的(可能是不正确的)理解,这个文件是由puppetpipe理的每个主机使用,但问题只存在于less数主机上。 大多数工作正常。
因此,我正在研究的问题是在客户端而不是服务器的理论。
显然,首先要检查的是文件/etc/postfix/main.cf是否确实存在于问题主机上。 它确实。
我花了一天的时间search这个,所有我发现的问题往往是人写错误,而写清单。 我没有发现任何使用清单的特定主机遇到麻烦,而清单在其他主机上显然可以正常工作。
我是傀儡(但不是Linux)的新手,我发现它很有趣,尽pipe你从傀儡中得到的错误信息可能有点神秘。
任何帮助最受欢迎。
系统是与木偶3.2.3-1的CentOS 6
—更新—
(对不起,延迟回复,我在澳大利亚,所以时区差异适用)
好的,所以根据Craig给出的答案,我已经傀儡木偶上的puppet dir作为main.c的实例了
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: {} } }
主机的清单非常简单。 为了简洁起见,除非询问,否则我不会在这里发表。 他们几乎只是定义networkingIP和ntp服务器。 根本没有任何关系到后缀。 他们从另外一个只与snmp设置和syslogging相关的清单inheritance而来,继而inheritance自default.pp,后者包含导致问题的后缀部分(在问题的开始部分显示)(如果我将其注释掉问题消失)
工作主机和非工作主机之间唯一的差别就是节点名称和IP地址,否则两个清单是相同的。
我可以发布这些文件的内容,如果有人想看到他们。
我也检查了postfix模块的function:
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']
很明显,我对于木偶作品的理解是十分缺乏的,因为我不明白为什么两位空洞的主持人会有不同的performance。
无论如何,感谢你们对这个家伙的帮助,但是现在我想把它放在太硬的篮子里。
你的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主configuration然后设置你的relayhost,而这个文件不是你正在申请的目录的一部分。
关于这个问题的附注:如果你每次都安装postfix主模板,那么让augeas编辑relayhosts:puppet会在每次运行时编辑两次postfixconfiguration。 您可能希望在此处使用单个模板,或者在安装postfix主configuration的file{}
添加replace => no
。
回到你的问题,这听起来像你包括postfix::config
,但没有包括postfix
本身,(AFAIU)将安装postfix的主要configuration。
在打破puppet驱动的每个postfixconfiguration之前,你可能要确保你正在一个单独的环境中工作。 然后,作为一个疯狂的猜测/没有看到你的设置很多:编辑你的postfix/manifests/config.pp
添加到postfix::config
定义内的某个地方:
if (! defined(Class["postfix"])) { include postfix }
请注意,“工作”的节点现在可能会受到重复的后缀定义的影响:寻找其他内含添加定义检查,…
作为一个免责声明:除非你知道你在做什么,否则你不应该编辑你的木偶清单(考虑到所有注册的客户将会刷新他们的configuration,即使在最好的条件下,任何事情都可能会被打破)
对木偶大师来说,这显然是一个问题,但这大概是由于客户端的一些变化引起的,导致不同的木偶清单在后缀模块中被评估。
postfix模块中的某个地方将是一个依赖于File ['/ etc / postfix / main.cf'](一个require,notify,subscribe等)的augeas资源,但是文件{'/ etc / postfix / main .cf':}资源由于某种原因没有被声明(也许它在'if'之内)。 很难猜到,但没有关于postfix模块的更多细节。
是puppetlabs puppetforge的postfix模块吗? 如果是这样,哪一个(有很多),什么版本? 如果没有,你能分享模块吗?