AWX. Mikrotik. Управление устройствами Mikrotik RouterOS
Описание
Управление устройствами Mikrotik RouterOS
Требования
- Нельзя именовать микротик (/system identity) строкой более 31 символа! Будет ошибка при подключении через Job (а также при подключении через ansible)
- В версии RouterOS 6.49.x существует ограничение на кол-во строк или общий объем команд RouterOS, которые запускаются из каждого playbook. поэтому необходимо разделять playbook на несколько tasks. Пример playbook для RouterOS 6.49.x:
--- - hosts: all gather_facts: false tasks: - name: ip-list-trustedLan community.routeros.command: commands: /ip firewall address-list remove [find list=trustedLan]; /ip firewall address-list add list=trustedLan address=192.168.4.236/30 comment=blk; - name: ip-list-trustedUsersVnc community.routeros.command: commands: /ip firewall address-list remove [find list=trustedUsersVnc] ; /ip firewall address-list add list=trustedUsersVnc address=192.168.2.215 comment=sar-nesterov ; - name: ip-list-trustedWan community.routeros.command: commands: /ip firewall address-list remove [find list=trustedWan] ; /ip firewall address-list add list=trustedWan address=217.65.208.115 comment=sar ; - debug: msg: "host - {{ inventory_hostname }}" ...
- Установленный собственный сервер Gitlab, с репозитория которого будем динамически скачивать сценарии управления микротиком *.yml и запускать на AWX
- Созданная в AWX инвентаризация с именем "inv01" (динамическая или созданная статически вручную), в которой уже имеется тестовый хост "alef_mikrotik-test_199-177", принадлежащий группе "mikrotik-test"
Настройка
На сервере Gitlab
Создаем пустой репозиторий "awx"
На сервере AWX (CLI)
Генерируем ключ SSH на машине AWX и добавляем его в гитлаб через веб-интерфейс
Чтобы пользоваться git-репозиторием "awx" Gitlab на другом устройстве (AWX), необходимо на этом устройстве создать ключ ssh
Generate SSH key
You will get two keys in ~/.ssh/ directory.
- 'id_rsa' would be your private key
- 'id_rsa.pub' would be your public key.
ssh-keygen
- по-умолчанию ключи создадутся в /root/.ssh/
- добавляем содержимое /root/.ssh/id_rsa.pub в веб-интерфейсе Gitlab (в свойствах репозитория): User settings - SSH key
- далее можем клонировать репозиторий и работать с ним на этом устройстве без использования логина/пароля
Клонируем чистый проект на машину AWX
mkdir ~/git_projects
cd ~/git_projects
git clone git@192.168.199.160:gitlab-instance-8aac966e/awx.git
cd ~/awx
Подготавливаем дерево файлов и каталогов файл и пушим его на gitlab
Как пример будут использоваться два сценария:
- mikrotik_router_10_ip-list_set.yml
- mikrotik_router_20_firewall_critical-ports_set.yml
Сценарий mikrotik_router_ALL.yml будет запускать оба предыдущих сценария на AWX одновременно (об этом ниже)
nano ./mikrotik/RPK/firewall/mikrotik_router_10_ip-list_set.yml
---
- hosts: all
gather_facts: false
tasks:
- name: global VAR create
community.routeros.command:
commands:
/ip firewall address-list remove [find list=trustedLan];
/ip firewall address-list add list=trustedLan address=192.168.4.236/30 comment=blk;
/ip firewall address-list add list=trustedLan address=192.168.5.236/30 comment=blsh;
/ip firewall address-list add list=trustedLan address=192.168.6.236/30 comment=smr;
quit;
- debug:
msg: "System {{ inventory_hostname }}"
nano ./mikrotik/RPK/firewall/mikrotik_router_20_firewall_critical-ports_set.yml
---
- hosts: all
gather_facts: false
vars:
- fwFilterAddRuleComment: =critical-ports=
- fwFilterPlacebeforeRuleComment: =accept-all=
tasks:
- name: mikrotik router firewall critical ports add
community.routeros.command:
commands:
- # debug
:put "{{ fwFilterAddRuleComment }}";
:put "{{ fwFilterPlacebeforeRuleComment }}";
- # remove old rules
/ip firewall filter remove [find where comment~"{{ fwFilterAddRuleComment }}"];
- # add or update new rules
local "fwFilterRulesArray" [:toarray ""];
:foreach i in=[/ip firewall filter find where comment~"{{ fwFilterPlacebeforeRuleComment }}"] do={
:set "fwFilterRulesArray" ($"fwFilterRulesArray", $i)};
:foreach x in=$fwFilterRulesArray do={
:put $x;};
:put "---";
:put ($fwFilterRulesArray->0);
:local fwFilterFirstElement ($fwFilterRulesArray->0);
/ip firewall filter add action=accept chain=input comment="{{ fwFilterAddRuleComment }} input mgmt ports allow only for trustedSystem" dst-port=21,22,23,8291,8728,8729 protocol=tcp src-address-list=trustedSystem place-before=$fwFilterFirstElement;
/ip firewall filter add action=accept chain=input comment="{{ fwFilterAddRuleComment }} input mgmt ports allow only for trustedLan" dst-port=21,22,23,8291,8728,8729 protocol=tcp src-address-list=trustedLan place-before=$fwFilterFirstElement;
/ip firewall filter add action=accept chain=input comment="{{ fwFilterAddRuleComment }} input mgmt ports allow only for trustedWan" dst-port=21,22,23,8291,8728,8729 protocol=tcp src-address-list=trustedWan place-before=$fwFilterFirstElement;
/ip firewall filter add action=drop chain=input comment="{{ fwFilterAddRuleComment }} input mgmt ports drop for other" dst-port=21,22,23,8291,8728,8729 protocol=tcp place-before=$fwFilterFirstElement;
/ip firewall filter add action=accept chain=forward comment="{{ fwFilterAddRuleComment }} forward all-ppp-iface-in ports allow only for trustedUsersVnc"
dst-port=5900,4899 in-interface=all-ppp protocol=tcp src-address-list=trustedUsersVnc place-before=$fwFilterFirstElement;
/ip firewall filter add action=accept chain=forward comment="{{ fwFilterAddRuleComment }} forward all-ppp-iface-in ports allow only for trustedLan"
dst-port=21,22,23,4899,5060,5900,8291,8728,8729 in-interface=all-ppp protocol=tcp src-address-list=trustedLan place-before=$fwFilterFirstElement;
/ip firewall filter add action=accept chain=forward comment="{{ fwFilterAddRuleComment }} forward all-ppp-iface-in ports allow only for trustedLan"
dst-port=5060 in-interface=all-ppp protocol=udp src-address-list=trustedLan place-before=$fwFilterFirstElement;
/ip firewall filter add action=accept chain=forward comment="{{ fwFilterAddRuleComment }} forward all-ppp-iface-in ports allow only for trustedSystem"
dst-port=21,22,23,4899,5060,5900,8291,8728,8729 in-interface=all-ppp protocol=tcp src-address-list=trustedSystem place-before=$fwFilterFirstElement;
/ip firewall filter add action=accept chain=forward comment="{{ fwFilterAddRuleComment }} forward all-ppp-iface-in ports allow only for trustedSystem"
dst-port=5060 in-interface=all-ppp protocol=udp src-address-list=trustedSystem place-before=$fwFilterFirstElement;
/ip firewall filter add action=drop chain=forward comment="{{ fwFilterAddRuleComment }}t forward all-ppp-iface-in ports drop for other" dst-port=21,22,23,4899,5060,5900,8291,8728,8729 in-interface=all-ppp protocol=tcp place-before=$fwFilterFirstElement;
/ip firewall filter add action=drop chain=forward comment="{{ fwFilterAddRuleComment }} forward all-ppp-iface-in ports drop for other" dst-port=5060 in-interface=all-ppp protocol=udp place-before=$fwFilterFirstElement;
- quit;
- debug:
msg: "System {{ inventory_hostname }}"
nano ./mikrotik/RPK/firewall/mikrotik_router_ALL.yml
---
- import_playbook: mikrotik_router_10_ip-list_set.yml
- import_playbook: mikrotik_router_20_firewall_critical-ports_set.yml
Необходимые требования к сценарию:
- расширение *.yml
- бит исполнения "x" (-rwxr-xr-x)
Присвоим бит "x" файлам
chmod +x mikrotik/RPK/firewall/*
tree -p
├── [drwxr-xr-x] mikrotik │ └── [drwxr-xr-x] RPK │ └── [drwxr-xr-x] firewall │ ├── [-rwxr-xr-x] mikrotik_router_10_ip-list_set.yml │ ├── [-rwxr-xr-x] mikrotik_router_20_firewall_critical-ports_set.yml │ └── [-rwxr-xr-x] mikrotik_router_ALL.yml
Пушим всё на Gitlab
git add *
git commit -m "sync to gitlab"
git push origin
Теперь необходимо проверить что все файлы и папки отсинхронились в Gitlab
Установка модуля ansible для управления RouterOS
ansible-galaxy collection install community.routeros
На сервере AWX (веб-интерфейс)
Если инвентаризация динамическая и подтягивается из Gitlab (репозиторий "awx"), то предварительно необходимо ВЫКЛЮЧИТЬ галку "Overwrite variables" чтобы при обновлении инвентаризации переменные группы (лог/пас и т.д.) не удалялись.
Inventories - inv01 - Sources - awx
УБРАТЬ ГАЛКУ: Overwrite variables
Устанавливаем переменные для группы mikrotik-test в Inventory (лог, пас, настройки модуля подключения к mikrotik).
Да, именно здесь, а не в стандартном Credentials. При использовании модуля AWX community.routeros стандартный Credential для routeros не работает.
Все хосты в ней при запуске Job будут подтягивать эти переменные.
Inventories - inv01 - Groups - mikrotik-test
- Edit details
Variables (YAML):
ansible_connection: ansible.netcommon.network_cli
ansible_network_os: community.routeros.routeros
ansible_user: service
ansible_ssh_pass: PassWord
Создаем Credentials SCM (Gitlab) для подключения Project к репозиторию Gitlab
Credentials - Add
Name: gitlab
Credential Type: Source control
SCM Private Key: <...> # На этой машине (AWX) создаем SSH ключ (уже создали в предыдущем пункте): "ssh-keygen", содержимое /root/.ssh/id_rsa помещаем в это поле. На Gitlab в настройках профиля добавляем новый SSH-ключ, содержимое /root/.ssh/id_rsa.pub добавляем туда.
Создаем проект "inv01_control" для управления хостами
Projects - Add
Name: inv01_control
Organization: Default
Source Control Type: Git
Source Control Revision
Source Control URL: git@192.168.199.160:gitlab-instance-8aac966e/test-awx.git
Source Control Credential: Scm: gitlab
Default Execution Environment: awx-custom-ee # это доп образ для работы модуля python zabbix-api, скорее всего для нашей задачи не потребуется (если не настроена динамическая инва), поэтому можно выбрать стандартный AWX-EE
Enabled Options
v - Discard local changes before syncing
v - Delete the project before syncing
v - Update revision on job launch
Создаем шаблоны Job для запуска задания на mikrotik
Templates - Add
Name: mikrotik_router_10_ip-list_set
Job Type: run
Organization: Default
Inventory: inv01
Project: inv01_control
Execution Environment: awx-custom-ee # это доп образ для работы модуля python zabbix-api, скорее всего для нашей задачи не потребуется (если не настроена динамическая инва), поэтому можно выбрать стандартный AWX-EE
Playbook: mikrotik/RPK/firewall/mikrotik_router_10_ip-list_set.yml
Limit: mikrotik-test # ОЧЕНЬ ВАЖНАЯ ОПЦИЯ. так как мы запускаем Job для всей инвы inv01, то она ограничивает запуск заданий только для хостов, которые принадлежат группе "mikrotik-test", ИНАЧЕ ЗАДАНИЕ ЗАПУСТИТСЯ НА ВСЕХ ХОСТАХ ИНВЕНТАРИЗАЦИИ "inv01"
Templates - Add
Name: mikrotik_router_20_firewall_critical-ports_add
Job Type: run
Organization: Default
Inventory: inv01
Project: inv01_control
Execution Environment: awx-custom-ee # это доп образ для работы модуля python zabbix-api, скорее всего для нашей задачи не потребуется (если не настроена динамическая инва), поэтому можно выбрать стандартный AWX-EE
Playbook: mikrotik/RPK/firewall/mikrotik_router_20_firewall_critical-ports_add.yml
Limit: mikrotik-test # ОЧЕНЬ ВАЖНАЯ ОПЦИЯ. так как мы запускаем Job для всей инвы inv01, то она ограничивает запуск заданий только для хостов, которые принадлежат группе "mikrotik-test", ИНАЧЕ ЗАДАНИЕ ЗАПУСТИТСЯ НА ВСЕХ ХОСТАХ ИНВЕНТАРИЗАЦИИ "inv01"
Этот шаблон содержит ссылки на плэйбуки, которые лежат в той же директории, что и сам этот плэйбук и запускает их в порядке, указанном в нем:
---
- import_playbook: mikrotik_router_10_ip-list_set.yml
- import_playbook: mikrotik_router_20_firewall_critical-ports_set.yml
Templates - Add
Name: mikrotik_router_ALL
Job Type: run
Organization: Default
Inventory: inv01
Project: inv01_control
Execution Environment: awx-custom-ee # это доп образ для работы модуля python zabbix-api, скорее всего для нашей задачи не потребуется (если не настроена динамическая инва), поэтому можно выбрать стандартный AWX-EE
Playbook: mikrotik/RPK/firewall/mikrotik_router_ALL.yml
Limit: mikrotik-test # ОЧЕНЬ ВАЖНАЯ ОПЦИЯ. так как мы запускаем Job для всей инвы inv01, то она ограничивает запуск заданий только для хостов, которые принадлежат группе "mikrotik-test", ИНАЧЕ ЗАДАНИЕ ЗАПУСТИТСЯ НА ВСЕХ ХОСТАХ ИНВЕНТАРИЗАЦИИ "inv01"
На Mikrotik "alef_mikrotik-test_199-177", которым необходимо управлять
Создаем учетную запись
login: service
pass: PassWord
На сервере AWX (веб-интерфейс)
Запускаем Job:
- mikrotik_router_10_ip-list_set.yml
- mikrotik_router_20_firewall_critical-ports_set.yml
ИЛИ
- mikrotik_router_ALL.yml, который будет запускать оба предыдущих сценария на AWX одновременно