Как подключаться к устройствам RouterOS с помощью RouterOS API
Для подключения к устройству RouterOS с помощью RouterOS API можно использовать модуль community.routeros.api. Для изменения определённых записей предназначены более специализированные модули community.routeros.api_modify и community.routeros.api_find_and_modify. Модуль community.routeros.api_info позволяет получать информацию по определённым предопределённым путям, которую можно использовать в качестве входных данных для модуля community.routeros.api_modify, а модуль community.routeros.api_facts позволяет получать факты Ansible с помощью RouterOS API.
Специальная настройка не требуется; модуль нужно запускать на узле, который может подключаться к API устройства. В наиболее распространённом случае модуль запускается на localhost — либо с помощью hosts: localhost в сценарии, либо с помощью delegate_to: localhost для задачи. В следующем примере показано, как выполнить эквивалент /ip address print:
---
- name: RouterOS test with API
hosts: localhost
gather_facts: false
vars:
hostname: 192.168.1.1
username: admin
password: test1234
tasks:
- name: Get "ip address print"
community.routeros.api:
hostname: "{{ hostname }}"
password: "{{ password }}"
username: "{{ username }}"
path: "ip address"
# The following options configure TLS/SSL.
# Depending on your setup, these options need different values:
tls: true
validate_certs: true
validate_cert_hostname: true
# If you are using your own PKI, specify the path to your CA certificate here:
# ca_path: /path/to/ca-certificate.pem
register: print_path
- name: Show IP address of first interface
ansible.builtin.debug:
msg: "{{ print_path.msg[0].address }}"
В результате будет получен следующий вывод:
PLAY [RouterOS test] *********************************************************************************************
TASK [Get "ip address print"] ************************************************************************************
ok: [localhost]
TASK [Show IP address of first interface] ************************************************************************
ok: [localhost] => {
"msg": "192.168.2.1/24"
}
PLAY RECAP *******************************************************************************************************
localhost : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
Подробные сведения о параметрах см. в документации к модулю community.routeros.api.
Использование группы параметров по умолчанию для модуля community.routeros.api
Чтобы не указывать общие параметры для всех модулей, использующих API, в каждой задаче, можно использовать community.routeros.api группу параметров по умолчанию для модуля:
---
- name: RouterOS test with API
hosts: localhost
gather_facts: false
module_defaults:
group/community.routeros.api:
hostname: 192.168.1.1
password: admin
username: test1234
# The following options configure TLS/SSL.
# Depending on your setup, these options need different values:
tls: true
validate_certs: true
validate_cert_hostname: true
# If you are using your own PKI, specify the path to your CA certificate here:
# ca_path: /path/to/ca-certificate.pem
tasks:
- name: Gather facts
community.routeros.api_facts:
- name: Get "ip address print"
community.routeros.api:
path: "ip address"
- name: Change IP address to 192.168.1.1 for interface bridge
community.routeros.api_find_and_modify:
path: ip address
find:
interface: bridge
values:
address: "192.168.1.1/24"
В этом случае для всех трёх задач будут использоваться параметры, заданные для группы параметров по умолчанию.
Настройка шифрования
Рекомендуется всегда использовать tls=true при подключении через API, даже если вы подключаетесь к устройству только через доверенную сеть. Следующие параметры управляют использованием TLS/SSL:
- force_no_cert:
-
Если задать значение
true, подключение к устройству будет выполняться без сертификата. Не рекомендуется использовать этот вариант в рабочей среде, поскольку он уязвим для атак типа «человек посередине», однако он может быть полезен при первоначальной настройке устройства. Значение по умолчанию —false. - validate_certs:
-
Если задать значение
false, проверка сертификатов будет отключена. Не рекомендуется использовать этот вариант в рабочей среде, однако он необходим при первоначальной настройке устройства. Значение по умолчанию —true. - validate_cert_hostname:
-
Если задать значение
false(по умолчанию), проверка имени узла при проверке сертификата будет отключена. Это необходимо, если имена узлов, указанные в сертификате, не совпадают с именем узла, используемым для подключения (обычно это IP-адрес устройства). Рекомендуется правильно настроить сертификат и задать для этого параметра значениеtrue; значение по умолчаниюfalseвыбрано для обратной совместимости с предыдущей версией модуля. - ca_path:
-
Если сертификат устройства подписан сертификатом центра сертификации (CA), которому нет коммерческого доверия, или сертификат CA не добавлен в хранилище доверенных сертификатов Python, укажите для этого параметра путь к сертификату CA.
Рекомендуется создать сертификат CA, который будет использоваться для подписания сертификатов устройств RouterOS, и включить в сертификаты правильные имена узлов, в том числе IP-адрес устройства. Так вы сможете полностью включить TLS и быть уверенными, что всегда подключаетесь к нужному устройству.
Настройка инфраструктуры открытых ключей (PKI)
Следуйте инструкциям из руководства community.crypto Как создать небольшой центр сертификации, чтобы настроить сертификат CA и подписать сертификат для маршрутизатора. В сертификат следует добавить альтернативное имя субъекта для IP-адреса (например, IP:192.168.1.1) и, если возможно, для DNS-имени (например, DNS:router.local).
Установка сертификата на маршрутизатор MikroTik
Сертификат лучше всего установить через SSH-подключение. (Дополнительные сведения см. в руководстве Как подключаться к устройствам RouterOS по SSH.) После установки сертификата и включения HTTPS API работать с API становится проще: у него гораздо меньше проблем, и он возвращает данные в виде объектов JSON, а не текста, который сначала нужно анализировать.
Сначала необходимо преобразовать сертификат и его закрытый ключ в пакет PKCS #12. Это можно сделать с помощью модуля community.crypto.openssl_pkcs12. В следующем сценарии предполагается, что сертификат доступен как keys/{{ inventory_hostname }}.pem, а его закрытый ключ — как keys/{{ inventory_hostname }}.key. Для защиты файла PKCS#12 сценарий генерирует случайную парольную фразу.
---
- name: Install certificates on devices
hosts: routers
gather_facts: false
tasks:
- block:
- set_fact:
random_password: "{{ lookup('community.general.random_string', length=32, override_all='0123456789abcdefghijklmnopqrstuvwxyz') }}"
- name: Create PKCS#12 bundle
openssl_pkcs12:
path: keys/{{ inventory_hostname }}.p12
certificate_path: keys/{{ inventory_hostname }}.pem
privatekey_path: keys/{{ inventory_hostname }}.key
friendly_name: '{{ inventory_hostname }}'
passphrase: "{{ random_password }}"
mode: "0600"
changed_when: false
delegate_to: localhost
- name: Copy router certificate onto router
ansible.netcommon.net_put:
src: 'keys/{{ inventory_hostname }}.p12'
dest: '{{ inventory_hostname }}.p12'
- name: Install router certificate and clean up
community.routeros.command:
commands:
# Import certificate:
- /certificate import name={{ inventory_hostname }} file-name={{ inventory_hostname }}.p12 passphrase="{{ random_password }}"
# Remove PKCS12 bundle:
- /file remove {{ inventory_hostname }}.p12
# Show certificates
- /certificate print
register: output
- name: Show result of certificate import
debug:
var: output.stdout_lines[0]
- name: Show certificates
debug:
var: output.stdout_lines[2]
always:
- name: Wipe PKCS12 bundle
command: wipe keys/{{ inventory_hostname }}.p12
changed_when: false
delegate_to: localhost
- name: Use certificate
community.routeros.command:
commands:
- /ip service set www-ssl address={{ admin_network }} certificate={{ inventory_hostname }} disabled=no tls-version=only-1.2
- /ip service set api-ssl address={{ admin_network }} certificate={{ inventory_hostname }} tls-version=only-1.2
Также в сценарии предполагается, что admin_network описывает сеть, из которой доступны интерфейсы HTTPS и API. Например, это может быть 192.168.1.0/24.
После успешного выполнения этого сценария вы сможете использовать административный интерфейс HTTPS (доступный в браузере по адресу https://192.168.1.1/ с подставленным правильным IP-адресом), а также модуль community.routeros.api с включёнными TLS и проверкой сертификатов:
- community.routeros.api:
# ...
tls: true
validate_certs: true
validate_cert_hostname: true
ca_path: /path/to/ca-certificate.pem
© 2012–2018 Michael DeHaan
© 2018–2025 Red Hat, Inc.
Licensed under the GNU General Public License version 3.
https://docs.ansible.com/projects/ansible/latest/collections/community/routeros/docsite/api-guide.html