russell.ballestrini.net/content/2013-10-17-postfix-salt-state-formula.rst
russell@unturf.com 137d65cc65 Consolidate blog tags: 57 → 23 unique tags
- Fix case duplicates (guide→Guide, project→Project, etc.)
- Consolidate single-post tags into broader categories
- Add technology tags (Python, AWS, Salt, Docker, Kubernetes) to 93 posts
- Add lib/tag_stats.py tool for checking tag usage
- Update CLAUDE.md with tag guidelines
2026-01-26 09:09:53 -05:00

182 lines
4.6 KiB
ReStructuredText

Postfix Salt State Formula
##########################
:date: 2013-10-17 21:28
:author: Russell Ballestrini
:tags: DevOps, Guide, Salt
:slug: postfix-salt-state-formula
:status: published
:summary:
|postfix-config-management|
The following formula was tested on Ubuntu and Debian however it would
not take much work to test on other operating systems.
This state formula will install postfix and mutt. The postfix service
will watch various configuration files for changes and restart
accordingly.
This formula will also manage and watch the /etc/aliases file and invoke
the *newaliases* command to initialize or re-initialize the alias
database. This formula will also manage and watch the
/etc/postfix/virtual file and invoke the *postmap* command to create or
update a managed Postfix lookup table.
**postfix/init.sls:**
::
# Install mutt and postfix mutt packages.
#
# This formula supports setting an optional:
#
# * 'aliases' file
# * 'virtual' map file
#
# Both aliases and virtual use a pillar data schema
# which takes the following form:
#
# postfix:
# aliases: |
# postmaster: root
# root: testuser
# testuser: russell@example.com
# virtual: |
# example.com this is a comment
# test1@example.com me@example.com
# test2@example.com me@example.com
#
# install mutt
mutt:
pkg:
- installed
# install postfix have service watch main.cf
postfix:
pkg:
- installed
service:
- running
- enable: True
- watch:
- pkg: postfix
- file: /etc/postfix/main.cf
# postfix main configuration file
/etc/postfix/main.cf:
file.managed:
- source: salt://postfix/main.cf
- user: root
- group: root
- mode: 644
- template: jinja
- require:
- pkg: postfix
# manage /etc/aliases if data found in pillar
{% if 'aliases' in pillar.get('postfix', '') %}
/etc/aliases:
file.managed:
- source: salt://postfix/aliases
- user: root
- group: root
- mode: 644
- template: jinja
- require:
- pkg: postfix
run-newaliases:
cmd.wait:
- name: newaliases
- cwd: /
- watch:
- file: /etc/aliases
{% endif %}
# manage /etc/postfix/virtual if data found in pillar
{% if 'virtual' in pillar.get('postfix', '') %}
/etc/postfix/virtual:
file.managed:
- source: salt://postfix/virtual
- user: root
- group: root
- mode: 644
- template: jinja
- require:
- pkg: postfix
run-postmap:
cmd.wait:
- name: /usr/sbin/postmap /etc/postfix/virtual
- cwd: /
- watch:
- file: /etc/postfix/virtual
{% endif %}
**postfix/aliases:**
::
# Managed by config management
# See man 5 aliases for format
{{pillar['postfix']['aliases']}}
**postfix/virtual:**
::
# Managed by config management
{{pillar['postfix']['virtual']}}
**postfix/main.cf:**
::
# Managed by config management
# See /usr/share/postfix/main.cf.dist for a commented, more complete version
# Debian specific: Specifying a file name will cause the first
# line of that file to be used as the name. The Debian default
# is /etc/mailname.
#myorigin = /etc/mailname
smtpd_banner = $myhostname ESMTP $mail_name
biff = no
# appending .domain is the MUA's job.
append_dot_mydomain = no
# Uncomment the next line to generate "delayed mail" warnings
#delay_warning_time = 4h
readme_directory = no
# TLS parameters
smtpd_tls_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem
smtpd_tls_key_file=/etc/ssl/private/ssl-cert-snakeoil.key
smtpd_use_tls=yes
smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache
smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache
# See /usr/share/doc/postfix/TLS_README.gz in the postfix-doc package for
# information on enabling SSL in the smtp client.
myhostname = {{ grains['fqdn'] }}
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases
mydestination = {{ grains['fqdn'] }}, localhost
relayhost =
mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128
mailbox_size_limit = 0
recipient_delimiter = +
inet_interfaces = all
{% if 'virtual' in pillar.get('postfix','') %}
virtual_alias_maps = hash:/etc/postfix/virtual
{% endif %}
.. |postfix-config-management| image:: /uploads/2013/10/mysza.gif
.. contents::