 Autor: [Piotr Wasilewski](/autorzy/piotr-wasilewski) Architekt rozwiązań chmurowych · Zweryfikowano Kwiecień 2026

1.  [HostGrade.pl](/)
2.  [Baza wiedzy](/baza-wiedzy)
3.  Ansible — automatyzacja konfiguracji serwera

# Ansible podstawy — automatyzacja konfiguracji VPS

Kategoria: [Serwer VPS](/baza-wiedzy) · Aktualizacja: Kwiecień 2026

## Co to jest Ansible i dlaczego warto go używać?

Ansible to narzędzie do **Infrastructure as Code** — pozwala opisać konfigurację serwerów w plikach YAML (playbooks) i uruchomić ją na dziesiątkach maszyn jednocześnie. Kluczowe cechy:

-   **Agentless** — nie wymaga instalacji agenta na zarządzanych serwerach, używa SSH
-   **Idempotentny** — uruchomienie playbooka dwa razy daje ten sam wynik (nie duplikuje zmian)
-   **Deklaratywny** — opisujesz stan docelowy, nie sekwencję kroków
-   **Reużywalny** — role to gotowe moduły (np. nginx, php-fpm, postgresql)

Powiązane tematy: [SSH keys na VPS](/baza-wiedzy/ssh-keys-konfiguracja-vps), [Docker na VPS](/baza-wiedzy/docker-na-vps), [Nginx vhost konfiguracja](/baza-wiedzy/nginx-vhost-konfiguracja) oraz [UFW firewall](/baza-wiedzy/ufw-firewall-konfiguracja-vps). Porównaj serwery VPS na [stronie VPS](/vps).

## Instalacja Ansible

```
# Ubuntu/Debian (na maszynie sterującej — twój laptop lub CI/CD)
sudo apt update
sudo apt install ansible

# macOS
brew install ansible

# pip (cross-platform)
pip3 install ansible

# Sprawdź wersję
ansible --version
```

## Inventory — lista serwerów

Plik inventory definiuje, którymi serwerami zarządza Ansible:

```
# inventory/hosts.ini
[webservers]
web1 ansible_host=10.0.0.1 ansible_user=root
web2 ansible_host=10.0.0.2 ansible_user=ubuntu ansible_become=yes

[databases]
db1 ansible_host=10.0.0.3 ansible_user=root

[all:vars]
ansible_ssh_private_key_file=~/.ssh/id_ed25519
```

```
# Test połączenia ze wszystkimi serwerami
ansible all -i inventory/hosts.ini -m ping

# Tylko webservery
ansible webservers -i inventory/hosts.ini -m ping
```

## Pierwszy playbook — konfiguracja serwera bazowego

```
# playbooks/setup-server.yml
---
- name: Konfiguracja bazowa serwera Ubuntu
  hosts: webservers
  become: yes  # sudo

  vars:
    packages:
      - nginx
      - php8.2-fpm
      - php8.2-mysql
      - php8.2-redis
      - git
      - ufw

  tasks:
    - name: Aktualizacja apt cache
      apt:
        update_cache: yes
        cache_valid_time: 3600

    - name: Instalacja pakietów
      apt:
        name: "{{ packages }}"
        state: present

    - name: Uruchom i włącz Nginx
      service:
        name: nginx
        state: started
        enabled: yes

    - name: Uruchom i włącz PHP-FPM
      service:
        name: php8.2-fpm
        state: started
        enabled: yes

    - name: UFW — zezwól SSH
      ufw:
        rule: allow
        port: '22'
        proto: tcp

    - name: UFW — zezwól HTTP/HTTPS
      ufw:
        rule: allow
        port: "{{ item }}"
        proto: tcp
      loop:
        - '80'
        - '443'

    - name: Włącz UFW
      ufw:
        state: enabled
```

```
# Uruchom playbook
ansible-playbook -i inventory/hosts.ini playbooks/setup-server.yml

# Dry run (--check) — pokaż co się zmieni bez wykonania
ansible-playbook -i inventory/hosts.ini playbooks/setup-server.yml --check
```

## Zmienne i szablony Jinja2

```
# playbooks/nginx-vhost.yml
---
- name: Konfiguracja vhost Nginx
  hosts: webservers
  become: yes

  vars:
    domain: "mojastrona.pl"
    webroot: "/var/www/{{ domain }}"
    php_socket: "/run/php/php8.2-fpm-{{ domain | replace('.', '_') }}.sock"

  tasks:
    - name: Stwórz katalog strony
      file:
        path: "{{ webroot }}"
        state: directory
        mode: '0755'

    - name: Skopiuj szablon konfiguracji Nginx
      template:
        src: templates/nginx-vhost.conf.j2
        dest: "/etc/nginx/sites-available/{{ domain }}"
      notify: Reload Nginx

  handlers:
    - name: Reload Nginx
      service:
        name: nginx
        state: reloaded
```

```
# templates/nginx-vhost.conf.j2
server {
    listen 80;
    server_name {{ domain }} www.{{ domain }};
    root {{ webroot }}/public;

    location ~ \.php$ {
        fastcgi_pass unix:{{ php_socket }};
        fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
        include fastcgi_params;
    }
}
```

## Roles — reużywalne moduły

Ansible roles to standardowa struktura katalogów dla złożonej konfiguracji:

```
roles/
└── nginx/
    ├── tasks/
    │   └── main.yml      # Lista tasków
    ├── handlers/
    │   └── main.yml      # Handlery (np. reload nginx)
    ├── templates/
    │   └── nginx.conf.j2 # Szablony Jinja2
    ├── files/
    │   └── ssl.conf      # Statyczne pliki
    ├── vars/
    │   └── main.yml      # Zmienne roli
    └── defaults/
        └── main.yml      # Domyślne wartości zmiennych
```

```
# playbooks/site.yml — użycie roli
---
- name: Pełna konfiguracja serwera
  hosts: webservers
  become: yes
  roles:
    - nginx
    - php-fpm
    - certbot
```

```
# Pobierz gotowe role z Ansible Galaxy
ansible-galaxy install geerlingguy.nginx
ansible-galaxy install geerlingguy.php
ansible-galaxy install geerlingguy.certbot
```

## Przydatne komendy Ansible

Komenda

Co robi

`ansible all -m ping`

Test połączenia ze wszystkimi hostami

`ansible web1 -m shell -a "df -h"`

Uruchom polecenie na konkretnym hoście

`ansible-playbook site.yml --limit web1`

Uruchom playbook tylko na web1

`ansible-playbook site.yml --tags nginx`

Uruchom tylko taski z tagiem nginx

`ansible-playbook site.yml --check`

Dry run — bez zmian

`ansible-playbook site.yml -v`

Verbose — szczegółowe logi

`ansible-vault encrypt secrets.yml`

Zaszyfruj plik z hasłami

## Powiązane strony

-   [SSH keys — konfiguracja na VPS](/baza-wiedzy/ssh-keys-konfiguracja-vps)
-   [Docker na VPS](/baza-wiedzy/docker-na-vps)
-   [Nginx vhost — konfiguracja](/baza-wiedzy/nginx-vhost-konfiguracja)
-   [UFW firewall na VPS](/baza-wiedzy/ufw-firewall-konfiguracja-vps)
-   [Porównanie serwerów VPS](/vps)