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