mysurik.ru

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 — и готово. Руками я больше не настраиваю ничего.

Ваш комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *