2026-09-16
Ansible logo

Автоматизация серверов 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.

Добавить комментарий

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