Автоматизация серверов Ansible: плейбуки для Ubuntu и Mikrotik
Ansible — агентless-инструмент автоматизации: управляет серверами по SSH, без установки агентов. Один и тот же скрипт настраивает Ubuntu-серверы и даже Mikrotik (через модуль community.routeros). В статье: базовый playbook для Ubuntu, шаблонизация, управление конфигом Mikrotik через RouterOS API.
Установка Ansible
Управляющая машина (ваш ПК или сервер):
# Ubuntu / WSL
sudo apt update && sudo apt install -y ansible
# Или через pip (свежие версии)
python3 -m pip install --user ansible
Проверка:
ansible --version
Базовая структура инвентаря
inventory/hosts.ini:
[linux]
web01 ansible_host=192.168.10.101 ansible_user=ubuntu
db01 ansible_host=192.168.10.102 ansible_user=ubuntu
[mikrotik]
router1 ansible_host=192.168.10.1 ansible_connection=network_cli
[linux:vars]
ansible_become=yes
ansible_python_interpreter=/usr/bin/python3
[mikrotik:vars]
ansible_network_os=community.routeros
ansible_user=admin
ansible_ssh_pass=adminpass
Для Mikrotik нужен модуль:
ansible-galaxy collection install community.routeros
Для Linux обычно достаточноansible_user+ SSH-ключ илиansible_become_pass.
Первый playbook: базовое состояние Ubuntu
playbooks/ubuntu-baseline.yml:
- name: Ubuntu baseline
hosts: linux
become: yes
vars:
ts:
- { name: "Docker", serv: "docker", en: yes }
- { name: "SSH", serv: "ssh", en: yes }
- { name: "Cron", serv: "cron", en: yes }
tasks:
- name: Обновление apt index и пакетов
apt:
update_cache: yes
upgrade: safe
cache_valid_time: 3600
- name: Установка базовых пакетов
apt:
name: [htop, curl, wget, git, htop, iotop, net-tools, ca-certificates]
state: present
- name: Включить автозапуск служб
service:
name: "{{ item.serv }}"
enabled: "{{ item.en }}"
state: started
loop: "{{ ts }}"
- name: Настройка SSH (запрет root по паролю)
lineinfile:
path: /etc/ssh/sshd_config
regexp: "^PermitRootLogin"
line: "PermitRootLogin prohibit-password"
notify: restart ssh
tags: ssh
handlers:
- name: restart ssh
service:
name: ssh
state: restarted
Запуск:
ansible-playbook -i inventory/hosts.ini playbooks/ubuntu-baseline.yml
Шаблонизация: nginx-конфиг по шаблону
Шаблоны Ansible (Jinja2) генерируют конфиги из переменных. Пример roles/nginx/templates/vhost.conf.j2:
server {
listen 80;
server_name {{ vhost_server_name }};
root {{ vhost_root }};
location / {
proxy_pass http://127.0.0.1:{{ vhost_port }};
}
}
Тогда в playbook:
- name: Nginx site
template:
src: vhost.conf.j2
dest: /etc/nginx/sites-available/nextcloud.conf
register: nconf
- name: Symlink в enabled
file:
src: /etc/nginx/sites-available/nextcloud.conf
dest: /etc/nginx/sites-enabled/nextcloud.conf
state: link
- name: reload nginx при изменении
service:
name: nginx
state: reloaded
when: nconf.changed
Переменные можно задать в инвентаре, group_vars/ или прямо в playbook под vars:. Для нескольких сайтов — словарь-массив.
Управление Mikrotik через Ansible
Модуль community.routeros позволяет выполнять команды RouterOS прямо из playbook. Важное отличие: без ansible_command_timeout некоторые команды «висят».
- name: RouterOS: базовые настройки
hosts: mikrotik
gather_facts: no
tasks:
- name: Обновление identity
community.routeros.command:
commands:
- "/system identity set name=office-router"
require_ansible_network_os: true
- name: Создание пользователя (если нет)
community.routeros.command:
commands:
- '/user add name=ansible group=full password=Ansible!Pass permissions=full'
require_ansible_network_os: true
- name: Проверка версии RouterOS
community.routeros.command:
commands: "/system resource print"
register: r_res
ignore_errors: yes
- name: Показать версию
debug:
msg: "{{ r_res.stdout }}"
Важно: модуль
community.routeros.commandиспользует API/SSH. На роутере должна быть включена служба API или SSH:
/ip service enable ssh,api
Ограничение влияния (когда менять только то, что надо)
Правило хорошего тона — таги и check_mode:
# Проверка без изменений
ansible-playbook -i inventory/hosts.ini playbooks/ubuntu-baseline.yml --check
# Только SSH задачи
ansible-playbook -i inventory/hosts.ini playbooks/ubuntu-baseline.yml --tags ssh
# Уровень подробности
ansible-playbook ... -vvv
Валидация и безопасность
Ansible Lint
pip install ansible-lint
ansible-lint playbooks/ubuntu-baseline.yml
Хранение секретов (ansible-vault)
ansible-vault encrypt inventory/hosts.ini
ansible-vault view inventory/hosts.ini
ansible-playbook ... --ask-vault-password
Помещайте пароли от Mikrotik, SSH-pass и ключи в vault, а не в открытым текстом.
Тонкости и подводные камни
ansible_become_passоткрытым текстом — не храните в репозитории. Используйте vault или SSH-ключи.- Mikrotik без
require_ansible_network_os: true— модуль может вернуть «unreachable» в новых версиях. Или используйтеansible_connection=community.routeros. - Модуль
community.routeros.commandне дружит с FastTrack — не тот случай, но учтите, что команды могут исполняться в течение секунды и не блокировать очередь. - Windows-хосты — для RDS/1c серверов используйте
ansible_connection=winrmи профильansible_userдоменного пользователя. Остальная логика та же. - SSH-key bis — убедитесь, что
ansible_userимеет SSH-ключ иPermitRootLogin prohibit-password(иначе ansible зависнет на запросе пароля). - Одномашинный корм —
limit: web01для действий над одним сервером, не всем роутером.
Шпаргалка
# Установка
sudo apt install ansible
ansible-galaxy collection install community.routeros
# Инвентарь
# inventory/hosts.ini (см. выше)
# Playbook
ansible-playbook -i inventory/hosts.ini playbooks/ubuntu-baseline.yml
# Полезные флаги: --check, --tags, -vvv, --ask-vault-password
Проверено на: Ubuntu 22.04/24.04 + RouterOS 7.
Дата: Сентябрь 2026.