Ansible: автоматизация сервера с первого плейбука
Ansible: автоматизация сервера с первого плейбука
Раньше я настраивал каждый новый сервер руками. Установка пакетов, правка конфигов, создание пользователей — всё через SSH. Когда серверов стало два, я задумался. Когда дошло до трёх — понял, что так больше нельзя.
Ansible пришёл как решение, о котором я жалею, что не узнал раньше.
Что такое Ansible и почему он лучше shell-скриптов
Ansible — это инструмент управления конфигурацией. Ты описываешь желаемое состояние сервера в YAML-файлах (плейбуках), а Ansible сам приводит сервер к этому состоянию.
Почему не bash-скрипты? Потому что скрипты — это процедурный код: делай шаг 1, шаг 2, шаг 3. Если шаг 2 упал — скрипт остановится. Ansible же идемпотентен: он проверяет текущее состояние и меняет только то, что нужно. Поставил пакет? В следующий раз он не будет переустанавливаться. Хочешь обновить конфиг Nginx? Ansible применит только изменения и перезагрузит сервер.
Ставлю Ansible на свою машину
На Windows через WSL2:
sudo apt update && sudo apt install ansible -y
На сервере ничего ставить не надо — Ansible работает по SSH. Это его главное преимущество. Никаких агентов, никаких демонов.
Создаю первый плейбук
Структура директории:
ansible/
inventory.yml
playbooks/
init.yml
docker.yml
wordpress.yml
Инвентарь (inventory.yml) — список серверов:
all:
hosts:
webserver:
ansible_host: 192.168.1.100
ansible_user: deploy
ansible_become: yes
Первый плейбук — базовая инициализация сервера:
— name: Init server
hosts: webserver
tasks:
— name: Update apt cache
apt:
update_cache: yes
cache_valid_time: 3600
— name: Install essential packages
apt:
name:
— htop
— ncdu
— git
— ufw
— fail2ban
state: present
— name: Setup UFW
ufw:
rule: allow
port: ‘{{ item }}’
proto: tcp
loop:
— 22
— 80
— 443
— name: Enable UFW
ufw:
state: enabled
policy: deny
Запускаю:
ansible-playbook -i inventory.yml playbooks/init.yml
Ansible подключается по SSH, выполняет задачи. Если где-то упало — видно сразу, какая задача и почему. Красиво и предсказуемо.
Плейбук для Docker
Следом написал плейбук для установки Docker на сервер:
— name: Install Docker
hosts: webserver
tasks:
— name: Install dependencies
apt:
name:
— ca-certificates
— curl
— gnupg
state: present
— name: Add Docker GPG key
apt_key:
url: https://download.docker.com/linux/ubuntu/gpg
state: present
— name: Add Docker repository
apt_repository:
repo: deb [arch=amd64] https://download.docker.com/linux/ubuntu {{ ansible_distribution_release }} stable
state: present
— name: Install Docker
apt:
name:
— docker-ce
— docker-ce-cli
— containerd.io
— docker-compose-plugin
state: present
— name: Add user to docker group
user:
name: deploy
groups: docker
append: yes
Этот плейбук можно прогнать на любом новом сервере — и через 2 минуты на нём будет Docker. Руками я бы потратил 10-15 минут и мог ошибиться.
Переменные и шаблоны
Самая крутая фича Ansible — шаблоны Jinja2. Я сделал шаблон конфига Nginx с переменными:
server {
listen 80;
server_name {{ domain_name }};
root /var/www/{{ domain_name }}/;
index index.php index.html;
}
И в плейбуке:
— name: Deploy Nginx config
template:
src: templates/site.conf.j2
dest: /etc/nginx/sites-available/{{ domain_name }}.conf
vars:
domain_name: example.com
notify: reload nginx
Ansible — это не сложно. Это просто по-другому. Вместо того чтобы лезть на сервер и что-то править вручную, ты описываешь желаемый результат в файле. Сервер становится воспроизводимым, а конфигурация — версионируемой в git.
Теперь любой новый сервер у меня поднимается за 10 минут. Запустил playbook — и готово. Руками я больше не настраиваю ничего.