Appearance
Автоконфигурация через Ansible и Terraform
Для массового подключения узлов инфраструктуры к подсистеме ЖУРНАЛЛИСТ рекомендуется использовать средства автоматизации. На практике обычно применяется следующий подход:
- Ansible — для настройки syslog-клиентов и правил отправки журналов
- Terraform — для подготовки инфраструктуры, сетевых правил и начальной bootstrap-конфигурации узлов
Terraform удобен для создания серверов, сетей и security rules, а Ansible — для детальной настройки rsyslog, syslog-ng, NXLog и сопутствующих сервисов.
Ansible
Общая идея
Ansible позволяет централизованно:
- развернуть конфигурацию syslog-клиента
- указать адрес и порт сервера ЖУРНАЛЛИСТ
- выбрать протокол UDP или TCP
- перезапустить службу
- проверить примененные настройки
Пример inventory
ini
[journal_clients_debian]
deb01 ansible_host=192.168.10.11
deb02 ansible_host=192.168.10.12
[journal_clients_rhel]
rhel01 ansible_host=192.168.20.11
rhel02 ansible_host=192.168.20.12
[journal_clients_all:children]
journal_clients_debian
journal_clients_rhelПример group_vars
yaml
journalist_host: "journalist-server.example.local"
journalist_port: 514
journalist_protocol: "tcp" # tcp or udp
journalist_format: "RSYSLOG_SyslogProtocol23Format"Пример playbook для rsyslog
yaml
- name: Configure syslog forwarding to JOURNALIST
hosts: journal_clients_all
become: true
vars:
rsyslog_target: >-
{{ '@@' if journalist_protocol == 'tcp' else '@' }}{{ journalist_host }}:{{ journalist_port }}
tasks:
- name: Ensure rsyslog is installed
package:
name: rsyslog
state: present
- name: Deploy rsyslog forwarding config
copy:
dest: /etc/rsyslog.d/90-journalist.conf
content: |
*.* {{ rsyslog_target }};{{ journalist_format }}
owner: root
group: root
mode: '0644'
notify: restart rsyslog
- name: Ensure rsyslog is enabled and running
service:
name: rsyslog
enabled: true
state: started
handlers:
- name: restart rsyslog
service:
name: rsyslog
state: restartedПример с очередью для надежной доставки
yaml
- name: Configure reliable syslog forwarding
hosts: journal_clients_all
become: true
vars:
rsyslog_target: >-
{{ '@@' if journalist_protocol == 'tcp' else '@' }}{{ journalist_host }}:{{ journalist_port }}
tasks:
- name: Deploy advanced rsyslog config
copy:
dest: /etc/rsyslog.d/90-journalist.conf
content: |
$ActionQueueType LinkedList
$ActionQueueFileName journalist_queue
$ActionResumeRetryCount -1
$ActionQueueSaveOnShutdown on
*.* {{ rsyslog_target }};{{ journalist_format }}
owner: root
group: root
mode: '0644'
notify: restart rsyslog
handlers:
- name: restart rsyslog
service:
name: rsyslog
state: restartedПример playbook для syslog-ng
yaml
- name: Configure syslog-ng forwarding to JOURNALIST
hosts: journal_clients_all
become: true
tasks:
- name: Ensure syslog-ng is installed
package:
name: syslog-ng
state: present
- name: Deploy syslog-ng config
copy:
dest: /etc/syslog-ng/conf.d/journalist.conf
content: |
destination d_journalist {
tcp("{{ journalist_host }}" port({{ journalist_port }}));
};
log {
source(src);
destination(d_journalist);
};
owner: root
group: root
mode: '0644'
notify: restart syslog-ng
handlers:
- name: restart syslog-ng
service:
name: syslog-ng
state: restartedПример отправки тестового сообщения через Ansible
yaml
- name: Send test syslog message
hosts: journal_clients_all
become: true
tasks:
- name: Send test log
command: logger -p user.info "Test message to JOURNALIST from Ansible"
changed_when: trueTerraform
Общая идея
Terraform обычно используется не для тонкой настройки syslog-клиента, а для:
- создания виртуальных машин
- настройки сетевых правил
- открытия порта 514 TCP/UDP
- передачи cloud-init или user-data для начальной настройки пересылки логов
На практике Terraform часто работает в связке с Ansible:
- Terraform создает инфраструктуру
- Ansible завершает настройку ОС и syslog
Пример: security group для syslog
Ниже пример для AWS. Аналогичный подход используется и в других облаках.
hcl
resource "aws_security_group" "journalist_syslog" {
name = "journalist-syslog"
description = "Allow syslog traffic to JOURNALIST"
ingress {
from_port = 514
to_port = 514
protocol = "tcp"
cidr_blocks = ["10.0.0.0/8"]
}
ingress {
from_port = 514
to_port = 514
protocol = "udp"
cidr_blocks = ["10.0.0.0/8"]
}
egress {
from_port = 0
to_port = 0
protocol = "-1"
cidr_blocks = ["0.0.0.0/0"]
}
}Пример: bootstrap rsyslog через cloud-init
hcl
variable "journalist_host" {
default = "journalist-server.example.local"
}
variable "journalist_port" {
default = 514
}
resource "aws_instance" "journal_client" {
ami = "ami-xxxxxxxx"
instance_type = "t3.micro"
user_data = <<-EOF
#!/bin/bash
set -e
if command -v apt-get >/dev/null 2>&1; then
apt-get update
apt-get install -y rsyslog
elif command -v dnf >/dev/null 2>&1; then
dnf install -y rsyslog
elif command -v yum >/dev/null 2>&1; then
yum install -y rsyslog
fi
cat >/etc/rsyslog.d/90-journalist.conf <<CFG
*.* @@${var.journalist_host}:${var.journalist_port};RSYSLOG_SyslogProtocol23Format
CFG
systemctl enable rsyslog
systemctl restart rsyslog
logger -p user.info "Bootstrap syslog forwarding configured by Terraform"
EOF
}Пример: передача inventory для дальнейшего запуска Ansible
hcl
resource "local_file" "ansible_inventory" {
content = <<-EOF
[journal_clients_all]
${aws_instance.journal_client.private_ip}
EOF
filename = "${path.module}/inventory.ini"
}Такой подход позволяет после terraform apply сразу запускать:
bash
ansible-playbook -i inventory.ini configure-journalist.ymlРекомендуемая схема Terraform + Ansible
Вариант 1. Минимальная автоматизация
- Terraform создает серверы
- Terraform передает user-data
- узлы начинают отправку syslog сразу после старта
Подходит для:
- тестовых стендов
- простых сред
- пилотных внедрений
Вариант 2. Промышленная автоматизация
- Terraform создает серверы и сети
- Terraform формирует inventory
- Ansible настраивает syslog, очереди, фильтры, TLS, сервисы
- Ansible выполняет проверку и тестовую отправку
Подходит для:
- production
- больших инфраструктур
- типовых roll-out сценариев
Практические рекомендации
Для промышленной эксплуатации рекомендуется:
использовать TCP вместо UDP, если важна надежность доставки
включать очереди rsyslog
выделять отдельные правила для:
- системных сообщений
- сообщений приложений
- сообщений безопасности
проверять доступность сервера ЖУРНАЛЛИСТ на уровне сети
закладывать bootstrap через Terraform, а детальную настройку выполнять через Ansible
Пример целевой архитектуры автоматизации
- Terraform создает:
- VM
- сетевые интерфейсы
- firewall rules
- DNS-записи
- базовую bootstrap-конфигурацию
- Ansible выполняет:
- установку rsyslog или syslog-ng
- настройку forward-правил
- включение надежной очереди
- настройку формата RFC5424
- тестовую отправку события
- Подсистема ЖУРНАЛЛИСТ:
- принимает сообщения
- разбирает их
- связывает с объектами инфраструктуры
- включает их в аналитику и автоматизацию
Краткий вывод
Terraform помогает быстро и массово подготовить инфраструктуру. Ansible обеспечивает воспроизводимую и управляемую настройку отправки журналов. Совместное использование этих инструментов позволяет промышленно подключать к подсистеме ЖУРНАЛЛИСТ сотни и тысячи узлов.