rsyslog
Ansible Роль: Rsyslog
Устанавливает и настраивает rsyslog на серверах Debian/Ubuntu.
Эта роль устанавливает и настраивает последнюю версию rsyslog из официального APT репозитория (на Debian) или официального PPA (на Ubuntu). По умолчанию она заменяет содержимое файлов /etc/rsyslog.conf
и /etc/rsyslog.d/50-default.conf
.
Требования
Нет.
Переменные роли
Вот доступные переменные с их значениями по умолчанию (как в defaults/main.yml):
rsyslog_rules: []
Массив правил для rsyslog. Каждая запись создаст отдельный конфигурационный файл с именем $priority-$rule_name.conf
. Обязательно проверьте defaults/main.yml
для примера с закомментированными всеми доступными опциями.
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"
Вот пример полностью заполненной записи rsyslog_rules
. Обратите внимание на |
для декларации блока в ruleset
. Дальше используется чистый синтаксис конфигурации rsyslog.
Альтернативный способ определения rsyslog_rules
по отдельным правилам – использовать rsyslog_extra_conf_options
. Это расширяет основной конфигурационный файл /etc/rsyslog.conf
дополнительными опциями вместо создания новых файлов в /etc/rsyslog.d
.
rsyslog_extra_conf_options: |
module(load="imudp")
input(type="imudp" port="514")
Здесь тоже используется |
для декларации блока, а код сам по себе является чистым синтаксисом конфигурации rsyslog. Это также может быть объединено с rsyslog_remove_default_rules: true
, чтобы гарантировать, что /etc/rsyslog.d/
пусто.
Дополнительно в данный момент есть три предварительно настроенных правила rsyslog. У всех них есть специальные, выделенные шаблоны (templates/*.conf.j2
). Только одно из них включено по умолчанию и называется просто default
. Оно заменяет определение файла /etc/rsyslog.d/50-default.conf
. Его можно легко отключить, указав state: "absent"
.
rsyslog_rule_default:
rule_name: "default"
priority: 50
template: "default.conf.j2"
Второе правило – docker
, которое обрабатывает логи для контейнеров Docker, работающих на данном хосте. Оно определяется в файле /etc/rsyslog.d/20-docker.conf
.
rsyslog_rule_docker:
rule_name: "docker"
priority: 20
template: "docker.conf.j2"
rsyslog_rule_docker_tag_all: true
Это создаст /var/log/docker
и поместит туда файлы журналов с именем $CONTAINER_NAME.log
. Ожидается, что $syslogtag
будет содержать docker/
в имени (смотрите пример ниже), в противном случае все логи будут помещены в /var/log/docker/no_tag.log
. Кроме того, есть опция rsyslog_rule_docker_tag_all
, которую можно включить, когда на данном хосте работает более одного контейнера, что позволяет создать один файл с логами, агрегированными с них всех, в /var/log/docker/all.log
(Примечание: это удвоит пространство, необходимое для логов контейнера). Вы можете проверить мою роль hadret.containers для примера определения контейнера с включенной поддержкой syslog.
containers:
- name: cadvisor
image: "google/cadvisor:latest"
state: started
log_driver: journald
log_options:
tag: docker/cadvisor
journald
в настоящее время автоматически подхватывается rsyslog.
Последним, но не менее важным, является обработка remote
. Я хотел создать решение «под ключ» для обработки как клиентской, так и серверной части. Удаленное ведение логов в настоящее время очень сырое и базовое, но работает из коробки с минимальной конфигурацией.
rsyslog_rule_remote:
rule_name: "remote"
role: server
priority: 99
template: "remote.conf.j2"
ruleset_name: "remote"
Должен быть указан как минимум один удаленный протокол (relp
/tcp
/udp
) (Примечание: нет значения по умолчанию, и указание только rsyslog_rule_remote
приведет к ошибке). Обработка на стороне сервера требует определения ruleset_name
, так как именно ruleset
выполняет действие записи логов (через omfile
) и применение предопределенных шаблонов. Эти шаблоны настроены так, чтобы быть как можно более похожими на «обычные» правила с предопределенными выводами: auth.log
, syslog.log
, rsyslog.log
, kern.log
и mail.log
.
rsyslog_rule_remote_relp:
port: 514
В настоящее время только relp
поддерживает настройку 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"
Обе tcp
и udp
в настоящее время позволяют указывать только address
(необязательный в серверном режиме), target
(обязательный в клиентском режиме) и port
(обязательный в обоих режимах).
rsyslog_rule_remote_tcp:
address: 0.0.0.0
port: 514
rsyslog_rule_remote_udp:
address: 0.0.0.0
port: 514
Обратите внимание, что вы можете определить все три из них с разными адресами и портами (но каждый из них только один раз). Вся конфигурация по умолчанию будет помещена в /etc/rsyslog.d/99-remote.conf
(как для сервера, так и для клиента). В данный момент невозможно, чтобы одна машина выступала одновременно и в роли сервера, и клиента, используя только rsyslog_rule_remote_relp
, но возможно указать дополнительное правило с использованием либо rsyslog_extra_conf_options
, либо 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")
Примечание: все три из этих предварительно настроенных правил rsyslog являются словарями, а не массивами. Только rsyslog_rules
позволяет определять несколько правил.
Расширение и замена шаблонов
Я понимаю, что не все охвачено переменными, и существует множество различных возможных опций конфигурации. Именно поэтому я использую шаблоны для всех правил, что позволяет легко расширять, заменять блоки (через наследование шаблонов Jinja2) или полностью заменять шаблоны, чтобы соответствовать нуждам, о которых я не подумал.
rsyslog_conf_template: "rsyslog.conf.j2"
rsyslog_rules_template: "rules.conf.j2"
Это также может быть изменено для каждого правила.
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"
Пример: расширение блока модулей в основном конфигурационном файле
rsyslog_conf_template
должен быть установлен на указание нового файла в каталоге вашей плейбука.
rsyslog_conf_template: "{{ playbook_dir }}/templates/custom-rsyslog.conf.j2"
Файл пользовательского шаблона должен быть размещен относительно вашего 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 %}
Приведенный выше пример заменяет/расширяет блок modules
в основном конфигурационном файле rsyslog.
Зависимости
Нет.
Пример плейбука
hosts: all
roles:
- hadret.rsyslog
Лицензия
MIT.
Авторы
Эта роль была частично собрана в 2019 году Филипом Чабиком.
ansible-galaxy install hadret/ansible-role-rsyslog