diff --git a/README.rst b/README.rst index cf81661..4388045 100644 --- a/README.rst +++ b/README.rst @@ -25,9 +25,17 @@ Installs the ``logrotate`` package and service/timer/cron. Manages logrotate config and include dir. +``logrotate.install`` +--------------------- + +Installs the logrotate package and its dependencies. + ``logrotate.jobs`` ------------------ Create custom job for logrotate. +``logrotate.service`` +--------------------- +Manages the startup and running state of the logrotate service. diff --git a/logrotate/config.sls b/logrotate/config.sls index 68b1503..b24165f 100644 --- a/logrotate/config.sls +++ b/logrotate/config.sls @@ -3,14 +3,20 @@ include: - logrotate -logrotate_config: +logrotate-config: file.managed: - name: {{ logrotate.conf_file }} - - source: salt://logrotate/files/{{ salt['grains.get']('os_family') }}/logrotate.conf + - source: salt://logrotate/templates/logrotate.conf.tmpl - template: jinja - user: {{ salt['pillar.get']('logrotate:config:user', logrotate.user) }} - group: {{ salt['pillar.get']('logrotate:config:group', logrotate.group) }} - mode: {{ salt['pillar.get']('logrotate:config:mode', '644') }} - - require: - - pkg: logrotate + +logrotate-directory: + file.directory: + - name: {{ logrotate.include_dir }} + - user: {{ salt['pillar.get']('logrotate:config:user', logrotate.user) }} + - group: {{ salt['pillar.get']('logrotate:config:group', logrotate.group) }} + - mode: 755 + - makedirs: True diff --git a/logrotate/defaults.yaml b/logrotate/defaults.yaml new file mode 100644 index 0000000..dc2456d --- /dev/null +++ b/logrotate/defaults.yaml @@ -0,0 +1,16 @@ +# -*- coding: utf-8 -*- +# vim: ft=yaml + +logrotate: + pkg: logrotate + conf_file: '/etc/logrotate.conf' + include_dir: '/etc/logrotate.d' + user: root + group: root + service: cron + login_records_jobs: True + default_config: + weekly: True + rotate: 4 + create: True + diff --git a/logrotate/files/Arch/logrotate.conf b/logrotate/files/Arch/logrotate.conf deleted file mode 100644 index 974f0f4..0000000 --- a/logrotate/files/Arch/logrotate.conf +++ /dev/null @@ -1,38 +0,0 @@ -# see "man logrotate" for details -# rotate log files weekly -weekly - -# keep 4 weeks worth of backlogs -rotate 4 - -# restrict maximum size of log files -#size 20M - -# create new (empty) log files after rotating old ones -create - -# uncomment this if you want your log files compressed -#compress - -# Logs are moved into directory for rotation -# olddir /var/log/archive - -# Ignore pacman saved files -tabooext + .pacorig .pacnew .pacsave - -# Arch packages drop log rotation information into this directory -include /etc/logrotate.d - -/var/log/wtmp { - monthly - create 0664 root utmp - minsize 1M - rotate 1 -} - -/var/log/btmp { - missingok - monthly - create 0600 root utmp - rotate 1 -} diff --git a/logrotate/files/Debian/logrotate.conf b/logrotate/files/Debian/logrotate.conf deleted file mode 100644 index 349f82a..0000000 --- a/logrotate/files/Debian/logrotate.conf +++ /dev/null @@ -1,38 +0,0 @@ -# see "man logrotate" for details -# rotate log files weekly -weekly - -{% if grains['os'] == "Ubuntu" %} -# use the syslog group by default, since this is the owning group -# of /var/log/syslog. -su root syslog -{% endif %} - -# keep 4 weeks worth of backlogs -rotate 4 - -# create new (empty) log files after rotating old ones -create - -# uncomment this if you want your log files compressed -#compress - -# packages drop log rotation information into this directory -include /etc/logrotate.d - -# no packages own wtmp, or btmp -- we'll rotate them here -/var/log/wtmp { - missingok - monthly - create 0664 root utmp - rotate 1 -} - -/var/log/btmp { - missingok - monthly - create 0660 root utmp - rotate 1 -} - -# system-specific logs may be configured here diff --git a/logrotate/files/RedHat/logrotate.conf b/logrotate/files/RedHat/logrotate.conf deleted file mode 100644 index 56e9103..0000000 --- a/logrotate/files/RedHat/logrotate.conf +++ /dev/null @@ -1,35 +0,0 @@ -# see "man logrotate" for details -# rotate log files weekly -weekly - -# keep 4 weeks worth of backlogs -rotate 4 - -# create new (empty) log files after rotating old ones -create - -# use date as a suffix of the rotated file -dateext - -# uncomment this if you want your log files compressed -#compress - -# RPM packages drop log rotation information into this directory -include /etc/logrotate.d - -# no packages own wtmp and btmp -- we'll rotate them here -/var/log/wtmp { - monthly - create 0664 root utmp - minsize 1M - rotate 1 -} - -/var/log/btmp { - missingok - monthly - create 0600 root utmp - rotate 1 -} - -# system-specific logs may be also be configured here. diff --git a/logrotate/files/Suse/logrotate.conf b/logrotate/files/Suse/logrotate.conf deleted file mode 100644 index 0981de0..0000000 --- a/logrotate/files/Suse/logrotate.conf +++ /dev/null @@ -1,26 +0,0 @@ -# see "man logrotate" for details -# rotate log files weekly -weekly - -# keep 4 weeks worth of backlogs -rotate 4 - -# create new (empty) log files after rotating old ones -create - -# use date as a suffix of the rotated file -dateext - -# uncomment this if you want your log files compressed -#compress - -# comment these to switch compression to use gzip or another -# compression scheme -compresscmd /usr/bin/xz -uncompresscmd /usr/bin/xzdec - -# former versions had to have the compressext set accordingly -#compressext .xz - -# RPM packages drop log rotation information into this directory -include /etc/logrotate.d diff --git a/logrotate/init.sls b/logrotate/init.sls index 73f8037..8e907f6 100644 --- a/logrotate/init.sls +++ b/logrotate/init.sls @@ -1,19 +1,7 @@ -{% from "logrotate/map.jinja" import logrotate with context %} - -logrotate: - pkg.installed: - - name: {{ logrotate.pkg|json }} - service.running: - - name: {{ logrotate.service }} - - enable: True - -logrotate_directory: - file.directory: - - name: {{ logrotate.include_dir }} - - user: {{ salt['pillar.get']('logrotate:config:user', logrotate.user) }} - - group: {{ salt['pillar.get']('logrotate:config:group', logrotate.group) }} - - mode: 755 - - makedirs: True - - require: - - pkg: logrotate +# -*- coding: utf-8 -*- +# vim: ft=sls +include: + - logrotate.install + - logrotate.config + - logrotate.service diff --git a/logrotate/install.sls b/logrotate/install.sls new file mode 100644 index 0000000..ffcc8c9 --- /dev/null +++ b/logrotate/install.sls @@ -0,0 +1,8 @@ +# -*- coding: utf-8 -*- +# vim: ft=sls + +{% from "logrotate/map.jinja" import logrotate with context %} + +logrotate-pkg: + pkg.installed: + - name: {{ logrotate.pkg }} diff --git a/logrotate/jobs.sls b/logrotate/jobs.sls index b122916..eb2b9ab 100644 --- a/logrotate/jobs.sls +++ b/logrotate/jobs.sls @@ -5,8 +5,8 @@ include: - logrotate -{% for key,value in jobs.items() %} -logrotate_{{key}}: +{% for key, value in jobs.items() %} +logrotate-{{ key }}: file.managed: - name: {{ logrotate.include_dir }}/{{ key.split("/")[-1] }} - source: salt://logrotate/templates/job.tmpl @@ -15,7 +15,7 @@ logrotate_{{key}}: - group: {{ salt['pillar.get']('logrotate:config:group', logrotate.group) }} - mode: {{ salt['pillar.get']('logrotate:config:mode', '644') }} - require: - - pkg: logrotate + - pkg: logrotate-pkg - context: {% if value is mapping %} path: {{ value.get('path', []) }} diff --git a/logrotate/map.jinja b/logrotate/map.jinja index 898c06b..791522d 100644 --- a/logrotate/map.jinja +++ b/logrotate/map.jinja @@ -1,42 +1,48 @@ -{% set logrotate = salt['grains.filter_by']({ - 'RedHat': { - 'pkg' : 'logrotate', - 'service' : 'crond', - 'conf_file' : '/etc/logrotate.conf', - 'include_dir' : '/etc/logrotate.d', - 'user' : 'root', - 'group' : 'root', +# -*- coding: utf-8 -*- +# vim: ft=jinja + +{% import_yaml 'logrotate/defaults.yaml' as default_settings %} + +{% set os_family_map = salt['grains.filter_by']({ + 'Arch': { + 'service': 'logrotate.timer', + 'default_config': { + 'tabooext': '+ .pacorig .pacnew .pacsave', + }, + }, + 'RedHat': { + 'service': 'crond', + 'default_config': { + 'dateext': True, + }, + }, + 'Suse': { + 'login_records_jobs': False, + 'default_config': { + 'dateext': True, + 'compresscmd': '/usr/bin/xz', + 'uncompresscmd': '/usr/bin/xzdec', + }, + }, }, - 'ScientificLinux': { - 'pkg' : 'logrotate', - 'service' : 'crond', - 'conf_file' : '/etc/logrotate.conf', - 'include_dir' : '/etc/logrotate.d', - 'user' : 'root', - 'group' : 'root', + grain="os_family", + merge=salt['pillar.get']('logrotate:lookup')) or {} +%} + +{% set os_map = salt['grains.filter_by']({ + 'Ubuntu': { + 'default_config': { + 'su': 'root syslog' + }, + }, }, - 'Arch': { - 'pkg' : 'logrotate', - 'service' : 'logrotate.timer', - 'conf_file' : '/etc/logrotate.conf', - 'include_dir' : '/etc/logrotate.d', - 'user' : 'root', - 'group' : 'root', - }, - 'Debian': { - 'pkg' : 'logrotate', - 'service' : 'cron', - 'conf_file' : '/etc/logrotate.conf', - 'include_dir' : '/etc/logrotate.d', - 'user' : 'root', - 'group' : 'root', - }, - 'Suse': { - 'pkg' : 'logrotate', - 'service' : 'cron', - 'conf_file' : '/etc/logrotate.conf', - 'include_dir' : '/etc/logrotate.d', - 'user' : 'root', - 'group' : 'root', - }, - }, merge=salt['pillar.get']('logrotate:lookup')) %} + grain="os", + merge=os_family_map) or {} +%} + +{% set logrotate = salt['grains.filter_by']( + default_settings, + merge=os_map, + base='logrotate', + ) +%} diff --git a/logrotate/service.sls b/logrotate/service.sls new file mode 100644 index 0000000..1dbb774 --- /dev/null +++ b/logrotate/service.sls @@ -0,0 +1,17 @@ +# -*- coding: utf-8 -*- +# vim: ft=sls + +{% from "logrotate/map.jinja" import logrotate with context %} + +include: + - logrotate.config + - logrotate.install + +logrotate: + service.running: + - name: {{ logrotate.service }} + - enable: True + - require: + - pkg: logrotate-pkg + - file: logrotate-config + - file: logrotate-directory diff --git a/logrotate/templates/logrotate.conf.tmpl b/logrotate/templates/logrotate.conf.tmpl new file mode 100644 index 0000000..49b183b --- /dev/null +++ b/logrotate/templates/logrotate.conf.tmpl @@ -0,0 +1,70 @@ +{%- from "logrotate/map.jinja" import logrotate with context -%} +{%- set config = salt['pillar.get']('logrotate:default_config', logrotate.default_config) -%} + +{%- set processed_parameters = [] -%} + +{%- macro set_parameter(parameter, default=None) -%} +{%- set value = config.get(parameter, default) -%} +{%- if value is not none %} + {%- if value is sameas true -%} +{{ parameter }} + {%- elif value is sameas false -%} +no{{ parameter }} + {%- elif value is string or value is number -%} +{{ parameter }} {{ value }} + {%- else -%} +{{ value }} + {%- endif %} +{%- do processed_parameters.append(parameter) %} +{%- endif %} +{%- endmacro -%} + +# Managed by saltstack +# +# See "man logrotate" for details. + +# log files rotation period +{% for period in ['hourly', 'daily', 'weekly', 'yearly'] -%} +{{ set_parameter(period) }} +{%- endfor %} + +# keep x periods worth of backlogs +{{ set_parameter('rotate', 4) }} + +# create new (empty) log files after rotating old ones +{{ set_parameter('create', True) }} + +# use date as a suffix of the rotated file +{{ set_parameter('dateext', False) }} + +# change this if you want your log files compressed +{{ set_parameter('compress', False) }} + +{#- Accept arbitrary parameters #} +{%- for parameter in config %} + {%- if parameter not in processed_parameters %} +{{ set_parameter(parameter) }} + {%- endif %} +{%- endfor %} + +# packages drop log rotation information into this directory +include {{ logrotate.include_dir }} + +{% if logrotate.login_records_jobs -%} +# no packages own wtmp and btmp -- we'll rotate them here +/var/log/wtmp { + monthly + create 0664 root utmp + minsize 1M + rotate 1 +} + +/var/log/btmp { + missingok + monthly + create 0600 root utmp + rotate 1 +} +{%- endif %} + +# system-specific logs may be configured here diff --git a/pillar.example b/pillar.example index 52b682e..a9c5e30 100644 --- a/pillar.example +++ b/pillar.example @@ -3,6 +3,12 @@ logrotate: lookup: pkg: logrotate service: crond + default_config: + weekly: True + rotate: 52 + create: True + compress: True + dateext: True jobs: /tmp/var/log/mysql/error: config: