Spec-Zone.ru › Ansible

Как подключаться к устройствам 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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API