Skip to content

Автоконфигурация через 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: true

Terraform

Общая идея

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

Пример целевой архитектуры автоматизации

  1. Terraform создает:
  • VM
  • сетевые интерфейсы
  • firewall rules
  • DNS-записи
  • базовую bootstrap-конфигурацию
  1. Ansible выполняет:
  • установку rsyslog или syslog-ng
  • настройку forward-правил
  • включение надежной очереди
  • настройку формата RFC5424
  • тестовую отправку события
  1. Подсистема ЖУРНАЛЛИСТ:
  • принимает сообщения
  • разбирает их
  • связывает с объектами инфраструктуры
  • включает их в аналитику и автоматизацию

Краткий вывод

Terraform помогает быстро и массово подготовить инфраструктуру. Ansible обеспечивает воспроизводимую и управляемую настройку отправки журналов. Совместное использование этих инструментов позволяет промышленно подключать к подсистеме ЖУРНАЛЛИСТ сотни и тысячи узлов.