hadret.rsyslog

Rôle Ansible : Rsyslog

CI

Installe et configure rsyslog sur les serveurs Debian/Ubuntu.

Ce rôle installe et configure la dernière version de rsyslog à partir du dépôt APT officiel (sur Debian) ou de PPA officiel (sur Ubuntu). Par défaut, il prendra le contrôle du contenu des fichiers /etc/rsyslog.conf et /etc/rsyslog.d/50-default.conf.

Exigences

Aucune.

Variables du rôle

Voici les variables disponibles avec leurs valeurs par défaut (comme dans defaults/main.yml) :

rsyslog_rules: []

Un tableau de règles pour rsyslog. Chaque entrée créera un fichier de configuration séparé nommé $priority-$rule_name.conf. Assurez-vous de vérifier defaults/main.yml pour des exemples commentés avec toutes les options disponibles.

rsyslog_rules:
  - rule_name: "remote-udp"
    priority: 99
    ruleset: |
      module(load="omfwd")
      action(type="omfwd" target="central.server.local" port="514" protocol="udp")
    state: "present"

Voici un exemple d'une entrée rsyslog_rules complètement remplie. Notez le | pour la déclaration du bloc pour le ruleset. À partir de là, cela devient une syntaxe de configuration rsyslog basique.

Une autre possibilité pour définir les rsyslog_rules de manière individuelle est d'utiliser rsyslog_extra_conf_options. Cela étend le fichier de configuration principal /etc/rsyslog.conf avec des options supplémentaires au lieu de créer de nouveaux fichiers dans /etc/rsyslog.d.

rsyslog_extra_conf_options: |
  module(load="imudp")
  input(type="imudp" port="514")

Ici encore, | est utilisé pour la déclaration du bloc et le code lui-même est une syntaxe de configuration rsyslog basique. Cela peut également être combiné avec rsyslog_remove_default_rules: true pour s'assurer que /etc/rsyslog.d/ est vide.

De plus, il y a actuellement trois règles rsyslog préconfigurées. Toutes ont des modèles spéciaux dédiés (templates/*.conf.j2). Une d'entre elles est activée par défaut et s'appelle, eh bien, default. Elle prend le contrôle de la définition du fichier /etc/rsyslog.d/50-default.conf. Elle peut être facilement désactivée en spécifiant state: "absent".

rsyslog_rule_default:
  rule_name: "default"
  priority: 50
  template: "default.conf.j2"

La deuxième est docker, qui gère les logs des conteneurs Docker en cours d'exécution sur l'hôte donné. Elle est définie dans le fichier /etc/rsyslog.d/20-docker.conf.

rsyslog_rule_docker:
  rule_name: "docker"
  priority: 20
  template: "docker.conf.j2"
rsyslog_rule_docker_tag_all: true

Cela créera /var/log/docker et y mettra des fichiers log avec le schéma de nommage $CONTAINER_NAME.log. Il s'attend à ce que le $syslogtag contienne docker/ dans le nom (voir l'exemple ci-dessous), sinon il poussera tous les logs dans /var/log/docker/no_tag.log. De plus, il y a un rsyslog_rule_docker_tag_all qui peut être activé s'il y a plus d'un conteneur en cours d'exécution sur l'hôte donné et permet de créer un fichier unique avec les logs agrégés de tous les conteneurs dans /var/log/docker/all.log (Note : cela va doubler l'espace nécessaire pour les logs des conteneurs). Vous pouvez consulter mon rôle hadret.containers pour un exemple de définition du conteneur avec le support syslog activé.

containers:
  - name: cadvisor
    image: "google/cadvisor:latest"
    state: started
    log_driver: journald
    log_options:
      tag: docker/cadvisor

journald est de nos jours automatiquement pris en charge par rsyslog.

Enfin, il y a la gestion remote. Je voulais créer une solution clé en main pour gérer les parties client et serveur. La journalisation distante est actuellement très basique, mais fonctionne dès la configuration minimale.

rsyslog_rule_remote:
  rule_name: "remote"
  role: server
  priority: 99
  template: "remote.conf.j2"
  ruleset_name: "remote"

Au moins un protocole distant (relp/tcp/udp) doit être spécifié (Note : il n'y a pas de valeur par défaut et indiquer uniquement rsyslog_rule_remote échouera). La manière dont le côté serveur est géré exige de définir ruleset_name car c'est ce ruleset qui exécute l'action réelle d'écriture des logs (via omfile) et applique des modèles prédéfinis. Ceux-ci sont configurés pour être aussi similaires que possible aux règles "ordinaires", avec les sorties prédéfinies : auth.log, syslog.log, rsyslog.log, kern.log et mail.log.

rsyslog_rule_remote_relp:
  port: 514

Actuellement, seul relp prend en charge la configuration TLS.

rsyslog_rule_remote_relp:
  address: 0.0.0.0
  port: 514
  tls: true
  tls_cacert: "/tls-certs/ca.pem"
  tls_mycert: "/tls-certs/cert.pem"
  tls_myprivkey: "/tls-certs/key.pem"
  tls_authmode: "fingerprint"

Les protocoles tcp et udp n'autorisent actuellement que la spécification de address (optionnel en mode serveur), target (requis en mode client) et port (requis dans les deux modes).

rsyslog_rule_remote_tcp:
  address: 0.0.0.0
  port: 514

rsyslog_rule_remote_udp:
  address: 0.0.0.0
  port: 514

Veuillez noter que vous pouvez définir les trois, avec des adresses et ports différents (mais chacun d'eux seulement une fois). Toute la configuration sera par défaut dans /etc/rsyslog.d/99-remote.conf (serveur et client). Il est actuellement impossible d'avoir une seule machine agissant à la fois comme serveur et client en utilisant uniquement rsyslog_rule_remote_relp, mais il est possible de spécifier une règle supplémentaire avec soit rsyslog_extra_conf_options ou rsyslog_rules.

rsyslog_rule_remote:
  rule_name: "server"
  role: server
  priority: 99
  template: "remote.conf.j2"
  ruleset_name: "server"

rsyslog_rule_remote_udp:
  port: 514

rsyslog_rules:
  - rule_name: "client"
    priority: 99
    ruleset: |
      module(load="omfwd")
      action(type="omfwd" target="central.server.local" port="514" protocol="tcp")

Note : ces trois règles rsyslog préconfigurées sont des dictionnaires, pas des tableaux. Seuls les rsyslog_rules permettent plusieurs définitions de règles.

Extension et remplacement des modèles

Je réalise que tout n'est pas couvert par des variables et qu'il existe de nombreuses options de configuration différentes. C'est pourquoi j'utilise des modèles pour toutes les règles, ce qui permet d'étendre facilement, de remplacer des blocs (via l'héritage de modèles Jinja2) ou d'échanger complètement des modèles pour s'adapter à des besoins auxquels je n'ai pas pensé.

rsyslog_conf_template: "rsyslog.conf.j2"
rsyslog_rules_template: "rules.conf.j2"

Cela peut également être modifié au niveau de chaque règle.

rsyslog_rule_default:
  rule_name: "default"
  priority: 50
  template: "{{ playbook_dir }}/templates/custom-default.conf.j2"

rsyslog_rule_docker:
  rule_name: "docker"
  priority: 20
  template: "{{ playbook_dir }}/templates/custom-docker.conf.j2"

rsyslog_rules:
  - rule_name: "remote-udp"
    priority: 90
    template: "{{ playbook_dir }}/templates/custom-udp.conf.j2"
  - rule_name: "remote-tcp"
    priority: 91
    template: "{{ playbook_dir }}/templates/custom-tcp.conf.j2"

Exemple : étendre le bloc des modules dans le fichier de configuration principal

rsyslog_conf_template doit être défini pour pointer vers le nouveau fichier dans votre répertoire de playbook.

rsyslog_conf_template: "{{ playbook_dir }}/templates/custom-rsyslog.conf.j2"

Le fichier de modèle personnalisé doit être placé par rapport à votre playbook.yml.

{% extends 'roles/external/hadret.rsyslog/templates/rsyslog.conf.j2' %}

{% block modules %}
$ModLoad imuxsock
$ModLoad imklog
$ModLoad immark

$ModLoad imudp
$UDPServerRun 514

$ModLoad imtcp
$InputTCPServerRun 514
{% endblock %}

L'exemple ci-dessus remplace/étend le bloc modules dans le fichier de configuration principal de rsyslog.

Dépendances

Aucune.

Exemple de playbook

hosts: all
  roles:
    - hadret.rsyslog

Licence

MIT.

Auteurs

Ce rôle a été en partie assemblé en 2019 par Filip Chabik.

À propos du projet

Rsyslog installation and configuration for Ubuntu/Debian.

Installer
ansible-galaxy install hadret.rsyslog
Licence
mit
Téléchargements
12.4k
Propriétaire
Vegetarian, skeptic & Linux SysAdmin (: