Ansible podstawy — automatyzacja konfiguracji VPS
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, Docker na VPS, Nginx vhost konfiguracja oraz UFW firewall. Porównaj serwery VPS na stronie 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 |