Poznań - Skórzewo ul. Działkowa 32

Ansible w zarządzaniu flotą serwerów VPS - od konfiguracji po monitoring

Zarządzanie wieloma serwerami VPS to wyzwanie, które rośnie wraz z liczbą maszyn. Ręczna konfiguracja, aktualizacje przez SSH do każdego serwera z osobna, czy weryfikacja stanu zabezpieczeń na kilkunastu maszynach - to scenariusze, które pochłaniają czas i zwiększają ryzyko błędu ludzkiego. Ansible oferuje eleganckie rozwiązanie tych problemów poprzez automatyzację zarządzania infrastrukturą jako kod.

Dlaczego Ansible?

Ansible wyróżnia się prostotą - nie wymaga instalacji agentów na zarządzanych serwerach, działa przez SSH, a playbooki zapisane w YAML są czytelne nawet dla osób rozpoczynających przygodę z automatyzacją. Do najczęstszych zastosowań należą:

  • Automatyczne wdrażanie nowych serwerów - od instalacji pakietów, przez konfigurację firewalla, po deployment aplikacji.
  • Konsystentna konfiguracja - zapewnienie, że wszystkie serwery mają identyczne ustawienia bezpieczeństwa i środowiska.
  • Masowe aktualizacje - równoczesna aktualizacja systemu na wszystkich maszynach jednym poleceniem.
  • Audyt i compliance - weryfikacja czy serwery spełniają wymagane standardy bezpieczeństwa.
  • Zarządzanie użytkownikami i kluczami SSH - centralna kontrola dostępu do infrastruktury.

Połączenie Ansible z narzędziami takimi jak Git (wersjonowanie konfiguracji), Ansible Vault (szyfrowanie haseł), oraz Prometheus/Grafana (monitoring) tworzy kompletny ekosystem zarządzania infrastrukturą.

Case Study 1: Przygotowanie VPS pod wydajne środowisko API

Scenariusz

Klient potrzebuje serwera API obsługującego wysoką liczbę requestów. Wymaga to optymalnej konfiguracji systemu operacyjnego, serwera aplikacji, bazy danych oraz reverse proxy.

Rozwiązanie z Ansible

Tworzymy rolę api-server zawierającą:

# roles/api-server/tasks/main.yml
---
- name: Optymalizacja parametrów jądra dla wydajności
  sysctl:
    name: ""
    value: ""
    state: present
    reload: yes
  loop:
    - { key: 'net.core.somaxconn', value: '65535' }
    - { key: 'net.ipv4.tcp_max_syn_backlog', value: '8192' }
    - { key: 'net.ipv4.ip_local_port_range', value: '1024 65535' }

- name: Instalacja i konfiguracja Nginx jako reverse proxy
  apt:
    name: nginx
    state: present
  notify: restart nginx

- name: Konfiguracja rate limiting i cachowania
  template:
    src: nginx-api.conf.j2
    dest: /etc/nginx/sites-available/api
  notify: reload nginx

- name: Instalacja i optymalizacja PostgreSQL
  include_tasks: postgresql.yml

- name: Deployment aplikacji API z PM2
  include_tasks: deploy-api.yml

W pliku group_vars/api_servers.yml definiujemy zmienne specyficzne dla środowiska:

nginx_worker_processes: auto
nginx_worker_connections: 4096
postgresql_max_connections: 200
postgresql_shared_buffers: "256MB"
api_instances: 4

Dzięki takiemu podejściu możemy w kilka minut wdrożyć kolejny identyczny serwer API lub wprowadzić zmianę konfiguracji na wszystkich serwerach jednocześnie.

Case Study 2: Bezpieczna brama dostępowa (bastion host)

Scenariusz

Firma potrzebuje serwera bastion jako jedynego punktu wejścia do wewnętrznej infrastruktury z zaawansowanymi mechanizmami bezpieczeństwa: fail2ban, port knocking, MFA, oraz szczegółowym logowaniem połączeń.

Rozwiązanie z Ansible

Playbook bastion-hardening.yml:

---
- hosts: bastion
  become: yes
  roles:
    - system-hardening
    - fail2ban-advanced
    - port-knocking
    - audit-logging

  tasks:
    - name: Konfiguracja SSH z restrykcyjnymi zasadami
      lineinfile:
        path: /etc/ssh/sshd_config
        regexp: ""
        line: ""
      loop:
        - { regexp: '^PermitRootLogin', line: 'PermitRootLogin no' }
        - { regexp: '^PasswordAuthentication', line: 'PasswordAuthentication no' }
        - { regexp: '^PubkeyAuthentication', line: 'PubkeyAuthentication yes' }
        - { regexp: '^AuthenticationMethods', line: 'AuthenticationMethods publickey,keyboard-interactive' }
      notify: restart ssh

    - name: Instalacja i konfiguracja Google Authenticator dla MFA
      apt:
        name: libpam-google-authenticator
        state: present

    - name: Konfiguracja fail2ban dla SSH
      template:
        src: fail2ban-ssh.j2
        dest: /etc/fail2ban/jail.d/sshd.local
      notify: restart fail2ban

    - name: Setup port knocking z knockd
      template:
        src: knockd.conf.j2
        dest: /etc/knockd.conf

    - name: Auditd dla szczegółowego logowania
      apt:
        name: auditd
        state: present

    - name: Reguły auditd dla monitorowania dostępu
      copy:
        src: audit-rules-bastion.rules
        dest: /etc/audit/rules.d/bastion.rules

W roles/port-knocking/templates/knockd.conf.j2:

[options]
    logfile = /var/log/knockd.log

[openSSH]
    sequence    = 
    seq_timeout = 15
    command     = /sbin/iptables -I INPUT -s %IP% -p tcp --dport 22 -j ACCEPT
    tcpflags    = syn
    cmd_timeout = 30
    stop_command = /sbin/iptables -D INPUT -s %IP% -p tcp --dport 22 -j ACCEPT

Wrażliwe dane jak knock_sequence przechowujemy zaszyfrowane w Ansible Vault:

ansible-vault encrypt_string '7000,8000,9000' --name 'knock_sequence'

Case Study 3: Zarządzanie farmą serwerów - monitoring i aktualizacje

Scenariusz

Zarządzanie 20+ serwerami VPS wymaga ciągłego monitorowania, regularnych aktualizacji oraz szybkiej reakcji na incydenty. Potrzebujemy rozwiązania do zbierania metryk, centralizacji logów i automatyzacji rutynowych zadań.

Rozwiązanie z Ansible + Prometheus + Grafana

Krok 1: Deployment stack’u monitorującego

Playbook monitoring-stack.yml:

---
- hosts: monitoring_server
  roles:
    - prometheus
    - grafana
    - alertmanager
    - loki

- hosts: all_vps
  roles:
    - node-exporter
    - promtail

Krok 2: Automatyczne aktualizacje z weryfikacją

Playbook update-and-verify.yml:

---
- hosts: all_vps
  serial: 3  # aktualizuj 3 serwery naraz
  max_fail_percentage: 10

  tasks:
    - name: Weryfikacja dostępności przed aktualizacją
      wait_for:
        port: ""
        timeout: 5
      loop: ""

    - name: Aktualizacja pakietów
      apt:
        update_cache: yes
        upgrade: dist
        autoremove: yes
      register: update_result

    - name: Sprawdzenie czy wymagany restart
      stat:
        path: /var/run/reboot-required
      register: reboot_required

    - name: Reboot jeśli konieczny
      reboot:
        reboot_timeout: 300
      when: reboot_required.stat.exists

    - name: Weryfikacja usług po aktualizacji
      systemd:
        name: ""
        state: started
      loop: ""

    - name: Raport z aktualizacji
      debug:
        msg: "Serwer :  pakietów zaktualizowanych"

Krok 3: Analiza logów i wykrywanie anomalii

# playbook: analyze-logs.yml
---
- hosts: all_vps
  tasks:
    - name: Zbieranie błędów z journald (ostatnie 24h)
      shell: "journalctl --since '24 hours ago' --priority=err --no-pager"
      register: errors
      changed_when: false

    - name: Analiza nieudanych logowań SSH
      shell: "grep 'Failed password' /var/log/auth.log | tail -20"
      register: failed_logins
      changed_when: false

    - name: Sprawdzenie zużycia dysku
      shell: "df -h / | awk 'NR==2 {print $5}'"
      register: disk_usage
      changed_when: false

    - name: Alert przy wysokim zużyciu dysku
      debug:
        msg: "UWAGA:  - dysk zapełniony w "
      when: disk_usage.stdout | replace('%','') | int > 85

    - name: Generowanie raportu
      template:
        src: health-report.j2
        dest: "/tmp/health-.txt"
      delegate_to: localhost

Integracja z Prometheus

W roles/node-exporter/tasks/main.yml automatycznie konfigurujemy eksporter metryk na każdym VPS:

- name: Instalacja node_exporter
  get_url:
    url: https://github.com/prometheus/node_exporter/releases/download/v1.7.0/node_exporter-1.7.0.linux-amd64.tar.gz
    dest: /tmp/

- name: Konfiguracja jako systemd service
  template:
    src: node-exporter.service.j2
    dest: /etc/systemd/system/node-exporter.service
  notify: restart node-exporter

Prometheus automatycznie dodaje nowe serwery do monitoringu dzięki template’owi konfiguracji:

# roles/prometheus/templates/prometheus.yml.j2
scrape_configs:
  - job_name: 'vps-fleet'
    static_configs:

Dobre praktyki i podsumowanie

  1. Wersjonowanie w Git - wszystkie playbooki i role trzymaj w repozytorium z jasną strukturą katalogów.
  2. Ansible Vault - nigdy nie commituj haseł w plain text, używaj ansible-vault do szyfrowania wrażliwych danych.
  3. Role i collections - dziel kod na reużywalne komponenty, korzystaj z Ansible Galaxy.
  4. Testowanie - używaj --check i --diff przed wykonaniem zmian na produkcji.
  5. Idempotentność - playbooki powinny dawać ten sam rezultat przy wielokrotnym uruchomieniu.
  6. Dokumentacja - każda rola powinna mieć README z opisem zmiennych i przykładami użycia.

Ansible w połączeniu z ekosystemem narzędzi DevOps przekształca zarządzanie serwerami VPS z czasochłonnego obowiązku w zautomatyzowany, przewidywalny proces. Początkowa inwestycja czasu w przygotowanie playbooków zwraca się wielokrotnie przy każdej kolejnej operacji na infrastrukturze - czy to wdrożenie nowego serwera, które zamiast godziny zajmuje 5 minut, czy masowa aktualizacja wykonana z pewnością, że wszystko zostało zrobione konsystentnie i zgodnie z najlepszymi praktykami.

Kontakt z nami

Jeśli jesteś zainteresowany/-a automatyzacją zarządzania infrastrukturą serwerową, napisz do nas.

Zapoznaj się z naszą pełną ofertą: