Ansible - automatyzacja przesyłania danych do Greylog-a

W dzisiejszym artykule, przedstawię Ci jak można połączyć automatyzatyczne wdrażanie serwerów, wraz z przesyłaniem przez nich danych do serwera Greylog.


Przygotowania

*W naszej roli, aby nieporzebnie nie przedłużać. Wykorzystamy plik inventory z tego artykułu.

Zaczynamy od utworzenia naszej roli która zainstaluje odpowiednie usługi, skonfiguruje firewall oraz skopiuje nasze szablony pod rsyslog-a.

roles/install_greylog/tasks/main.yml

- name: "Install rsyslog"
package:
name: "rsyslog"
state: present
tags: [install]

- name: "Setting firewall"
firewalld:
zone: public
port: {{ port }}/tcp
permanent: true
state: enabled
notify: "Restart firewalld"
tags: [firewall]

- name: Creates directory
ansible.builtin.file:
path: /var/spool/rsyslog
state: directory

- name: "Copy main conf"
template: src=../files/main.conf dest=/etc/rsyslog.d/01-main.conf
notify: "Restart rsyslog"
tags: [configuration]

- name: "Copy apache conf"
template: src=../files/apache.conf dest=/etc/rsyslog.d/02-apache.conf
notify: "Restart rsyslog"
tags: [configuration]
when: "'web' in inventory_hostname"


- name: "Copy mysql conf"
template: src=../files/mysql.conf dest=/etc/rsyslog.d/02-mysql.conf
notify: "Restart rsyslog"
tags: [configuration]
when: "'db' in inventory_hostname"

Teraz utworzymy nasz pierwszy szablon którego celem będzie przesłanie wszystkich wiadomości wysłanych na local6 do naszego serwera greylog, z zastrzeżeniem aby filtrował wiadomości "client denied by server configuration.".

roles/install_greylog/files/main.conf

module(load="imfile" PollingInterval="10")

$template MyCustomTemplate,"<%PRI%>%PROTOCOL-VERSION% %TIMESTAMP:::date-rfc3339% %APP-NAME% %msg%\n"

if $msg contains 'client denied by server configuration' then {
stop
}

local6.* @{{ serwer }}:{{ port }};MyCustomTemplate # UDP

Następnie utworzymy pliki zbierające nasze logi z katalogów:

- /var/log/httpd/*access*, /var/log/httpd/*error*, /var/log/php.errors, /var/log/php-fpm/*.log

roles/install_greylog/files/apache.conf

# [info] Apache access log
input(type="imfile"
File="/var/log/httpd/*access*"
Tag="{{ ansible_host.split('.')[0] }}.{{ ansible_host.split('.')[1] }}.{{ ansible_host.split('.')[2] }}.X apache-access - ip-{{ansible_host}}"
Severity="info"
Facility="local6")

# [error] Apache error log
input(type="imfile"
File="/var/log/httpd/*error*"
Tag="{{ ansible_host.split('.')[0] }}.{{ ansible_host.split('.')[1] }}.{{ ansible_host.split('.')[2] }}.X apache-error - ip-{{ansible_host}}"
Severity="error"
Facility="local6")

# [error] PHP error log
input(type="imfile"
File="/var/log/php.errors"
Tag="{{ ansible_host.split('.')[0] }}.{{ ansible_host.split('.')[1] }}.{{ ansible_host.split('.')[2] }}.X php-error - ip-{{ansible_host}}"
Severity="error"
Facility="local6")

# [error] PHP error log
input(type="imfile"
File="/var/log/php-fpm/*.log"
Tag="{{ ansible_host.split('.')[0] }}.{{ ansible_host.split('.')[1] }}.{{ ansible_host.split('.')[2] }}.X php-error - ip-{{ansible_host}}"
Severity="error"
Facility="local6")

- /var/log/mysql/mysqld.log, /var/log/mysql/*error*

roles/install_greylog/files/mysql.conf

# [info] MySQL database log
input(type="imfile"
File="/var/log/mysql/mysqld.log"
Tag="{{ ansible_host.split('.')[0] }}.{{ ansible_host.split('.')[1] }}.{{ ansible_host.split('.')[2] }}.X mysql-error - ip-{{ansible_host}}"
Severity="debug"
Facility="local6")

# [error] MySQL database log
input(type="imfile"
File="/var/log/mysql/*error*"
Tag="{{ ansible_host.split('.')[0] }}.{{ ansible_host.split('.')[1] }}.{{ ansible_host.split('.')[2] }}.X mysql-error - ip-{{ansible_host}}"
Severity="error"
Facility="local6")

Teraz zdefiniujemy naszą obsługę zdarzeń, w tym przypadku restartu usług firewalla oraz rsyslog-a.

handlers/restart_firewalld.yml

- name: Restart firewalld
service:
name: firewalld
state: restarted

handlers/restart_rsyslog.yml

- name: Restart rsyslog
service:
name: rsyslog
state: restarted
enabled: true

Następnie przejdziemy do utworzenia naszego głównego playbooka. Do którego zaimportujemy naszą rolę oraz odpowiednie uchwyty na zdarzenia które umożliwią nam restart usług.

playbooks/install_greylog.yml

- hosts: '{{ hosts | default("*") }}'
become: yes
become_method: sudo
gather_facts: yes
roles:
- ../roles/install_greylog
handlers:
- import_tasks: ../handlers/restart_rsyslog.yml
- import_tasks: ../handlers/restart_firewalld.yml

Dodatkowo aby działało wysyłanie wiadomości do naszego serwera po przez local6.*, musimy zdefiniować nasz serwer oraz port na którym nasłuchuje..

roles/install_greylog/defaults/main.yml

serwer: <adres_ip_serwera_greylog>
port: <port zdefiniowany w naszym inputs>

Po wszystkim pozostanie nam konfiguracja samego Greyloga, a to już temat na zupełnie inny artykuł.

Kamil Mirończuk

I kiedy czegoś gorąco pragniesz, to cały wszechświat sprzyja potajemnie twojemu pragnieniu
~Paulo Coelho

Komentarze

Zostaw komentarz

Twój adres mailowy NIE zostanie opublikowany. W razie otrzymania zapytania, otrzymasz na niego odpowiedź.
Wymagane pola są oznaczone jako *