OT: Konfigurationsmanagement Re: helpful_warnings=no schaltet nicht "override earlier entry" Warnings aus
Lutz Willek
lutz.willek at belug.de
Fr Feb 13 09:42:01 CET 2015
Hallo Axel,
> wir verteilen unsere main.cf auf Server und Workstations per
> Konfigurationsmanagement.
Tolle Sache! Warum nutzt Du dann Dein Konfigurationmanagement nicht um
Dein Problem zu lösen? Warum nutzt Du Dein Konfigurationsmanagement
lieber um den armen Postfix zu verbiegen? Ich meine das bei Dir
eingesetzte System zur Konfiguration Eurer Server wird doch ganz sicher
eine Funktion _replace_in_file haben, zur Not auch ein _system_call, in
dem Du dann ein sed -i 's/PATTERN/replace' machen kannst. Nicht nur ein
stumpfes "Hole mir irgendwelche Dateien und klebe diese aneinander", so
wie Du das in Deiner Mail beschreibst.
Du verteilst einfach Dein Template mit Variablen anstelle echter
Konfiguration, holst Dir Deine Konfiguration aus den Variablen Deines
Konfigurationsmanagements und ersetzt dann nach dem Import des Templates
die Variablen im Template durch Deine Konfiguration: Genau so wie man
das eben üblicherweise macht, wenn man ein Konfigurationsmanagement
nutzt. Ich kenne ja Dein Konfigurationsmanagement nicht, deshalb nur
Pseudocode dazu:
targethost=silberspitz.ethz.ch
# import template
___get_variable CONTEXT postfix VARNAME configfile DEFAULT
"/etc/postfix/main.cf " HOST $targethost
___import_file $cfgfile HOST $targethost
# get variable
___get_variable CONTEXT postfix VARNAME mydestination DEFAULT
"localhost" HOST $targethost
___get_variable CONTEXT postfix VARNAME relayhost DEFAULT
"smtp.phys.ethz.ch" HOST $targethost
___get_variable CONTEXT postfix VARNAME inet_interfaces DEFAULT
"loopback-only" HOST $targethost
# replace variable in template
___replace_in_file filename ${configfile} pattern '^mydestination =.*$'
with "mydestination = ${mydestination}" HOST $targethost
___replace_in_file filename ${configfile} pattern '^relayhost =.*$' with
"relayhost = ${relayhost}" HOST $targethost
___replace_in_file filename ${configfile} pattern '^mydestination =.*$'
with "inet_interfaces = ${mydestination}" HOST $targethost
Der Kontext in Deinem Konfigurationsmanagement zum Host
silberspitz.ethz.ch müsste dann in etwa so aussehen:
# context postfix
mydestination='
silberspitz.ethz.ch
silberspitz
localhost
bb.phys.ethz.ch
hobbit.phys.ethz.ch
xymon.phys.ethz.ch'
relayhost=''
inet_interfaces='all'
Das ist doch viel viel einfacher als nachträglich an der Postfix-Config
rum zu fummeln um hilfreiche Neuerungen abzustellen, und das nur weil
das Konfigurationsmanagement momentan nicht die Konfiguration liefert
die Postfix braucht um glücklich zu sein.
Gruß Lutz
Am 28.01.15 um 11:54 schrieb Axel Beckert:
> Hallo,
>
> wir verteilen unsere main.cf auf Server und Workstations per
> Konfigurationsmanagement.
>
> Es gibt eine Default-main.cf, die meistens ausreicht. Braucht es
> Abweichungen, so werden diese durch ein beim Deployment angehängtes
> per-host-Konfigurationsschnipsel gelöst. In diesem sind
> ggf. Einstellungen drin, die in der Default-Datei bereits mit anderen
> Wertten drin sind, um diese zu überschreiben.
>
> Mit Debian 7 Wheezy und Postfix 2.9.6 funktioniert dies wunderbar,
> aber seit Debian 8 Jessie und Postfix 2.11.3 jammert Postfix in
> verschiedensten Situationen über diese "Überschreib"-Methoden:
>
> # postconf > /dev/null
> postconf: warning: /etc/postfix/main.cf, line 29: overriding earlier entry: mydestination=
> postconf: warning: /etc/postfix/main.cf, line 30: overriding earlier entry: relayhost=smtp.phys.ethz.ch
> postconf: warning: /etc/postfix/main.cf, line 31: overriding earlier entry: inet_interfaces=loopback-only
> #
>
> Die dazugehörige main.cf sieht wie folgt aus:
>
> ---8<---
> # Note: file generated by dphys-config DO NOT EDIT IN /etc/postfix/main.cf
>
> # Default settings (hostname has been inserted by the configuration
> # deployment tool)
> myhostname = silberspitz.ethz.ch
> smtpd_banner = $myhostname ESMTP $mail_name (Debian/GNU Linux)
> biff = no
> append_dot_mydomain = no
> alias_maps = hash:/etc/aliases
> alias_database = hash:/etc/aliases
> myorigin = /etc/mailname
> relayhost = smtp.phys.ethz.ch
> mynetworks = 127.0.0.0/8, [::1]/128
> mailbox_size_limit = 0
> recipient_delimiter = +
> inet_interfaces = loopback-only
> sender_canonical_maps = pcre:/etc/postfix/sender_canonical
> mydestination =
>
> # Per-host settings
> mydestination =
> silberspitz.ethz.ch
> silberspitz
> localhost
> bb.phys.ethz.ch
> hobbit.phys.ethz.ch
> xymon.phys.ethz.ch
> relayhost =
> inet_interfaces = all
> --->8---
>
> (Grundidee bei diesem Beispiel: Alle Standard-Server sollen Mails via
> Mailserver verschicken, nicht aber der Monitoring-Server von dem
> o.g. Beispiel stammt. Der soll auch noch Mails an das SMS-Gateway
> verschicken können, wenn der Mailserver down ist.)
>
> Um o.g. Warnungen zu unterdrücken habe ich dann noch ein
>
> helpful_warnings = no
>
> ganz vorne in der main.cf hinzugefügt.
>
> Gemäss man page unterdrückt dies "warnings about problematic
> configuration settings, and helpful suggestions." -- Klang für mich
> nach genau der richtigen Einstellung, hat aber leider keinen
> Unterschied gemacht.
>
> Deswegen meine Frage: Wie bekomme ich Postfix dazu, diese Warnungen
> nicht mehr auszugeben? Sie verursachen diverse Mails von Cron-Jobs,
> weil Output (auf STDERR) kommt, z.B. von popularity-contest:
>
> ---8<---
> Subject: Cron <root at silberspitz> test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )
>
> /etc/cron.daily/popularity-contest:
> sendmail: warning: /etc/postfix/main.cf, line 28: overriding earlier entry: mydestination=
> sendmail: warning: /etc/postfix/main.cf, line 29: overriding earlier entry: relayhost=smtp.phys.ethz.ch
> sendmail: warning: /etc/postfix/main.cf, line 30: overriding earlier entry: inet_interfaces=loopback-only
> postdrop: warning: /etc/postfix/main.cf, line 28: overriding earlier entry: mydestination=
> postdrop: warning: /etc/postfix/main.cf, line 29: overriding earlier entry: relayhost=smtp.phys.ethz.ch
> postdrop: warning: /etc/postfix/main.cf, line 30: overriding earlier entry: inet_interfaces=loopback-only
> --->8---
>
> Und nein, ich will nicht pauschal allen Output nach STDERR
> unterdrücken, da könnte ja durchaus mal ein relevanter Fehler drin
> sein. :-) (Mal ganz davon abgesehen, dass ich das nicht in jedem
> Skript machen will, welches irgendwann mal "sendmail" aufruft.)
>
> Im Changelog habe ich diesen Eintrag gefunden:
>
> 20130404
>
> Human factors: warning when a main.cf parameter has multiple
> entries with different values. File: util/dict.c.
>
> Aber das ist doch gar kein Bug, das ist ein Feature! ;-)
>
> Code-Stelle dazu ist recht sicher dies hier:
>
> 459 if ((old = dict->lookup(dict, member)) != 0
> 460 && strcmp(old, val) != 0)
> 461 msg_warn("%s, line %d: overriding earlier entry: %s=%s",
> 462 VSTREAM_PATH(fp), lineno, member, old);
>
> Bei Weiterverfolgen, ob das Log-Level irgendwo ausgewertet wird und
> beeinflusst werden kann, bin ich bis zur Funktion msg_text am Ende von
> util/msg_output.c gekommen, aber da haben mich meine C-Kenntnisse dann
> irgendwann verlassen...
>
> Mit freundlichem Gruss, Axel Beckert
Mehr Informationen über die Mailingliste postfix-users