AWX. Mikrotik. Управление устройствами Mikrotik RouterOS

Материал из Wiki
Перейти к навигации Перейти к поиску

Описание

Управление устройствами 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 одновременно