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ł.
Komentarze