Налаштування комутаторів на базі Cisco IOS за допомогою ansible

💡 Усі статті, обговорення, новини про DevOps — в одному місці. Приєднуйтесь до DevOps спільноти!

Слава Україні! Я Андрій Б., працюю техніком-звʼязку (раніше DevOps Engineer), займаюсь автоматизацією інфрастуктури, моніторингом та підтримкою користувачів.

У нас є певна кількість комутаторів Cisco (типу 2960) і для того щоб додати новий комутатор чи замінити існуючий на інший — зазвичай просто копіюємо стару конфігурацію, та міняємо ті параметри які мають змінитись (ip, vlan, налаштування портів, тощо). Для автоматизації цього процесу пропоную використовувати такий інструмент як Ansible, на офіційній сторінці є детальний гайд як його встановити.

Наперед disclaimer — я не буду описувати та вдаватись у деталі чому саме таку конфігурацію ми використовуємо. Також для роботи з ansible ваш комутатор уже має бути попередньо налаштований, а саме: створений користувач з паролем та включений доступ по ssh (ми будемо прописувати його у конфігурації ansible). Це налаштування можна зробити через console port та спеціальний кабель, як поєднати доступ через console port та ansible я не знайшов.

Отож почнемо, вважаємо що ansible у вас вже становлено. Для робити з пристроями cisco встановлюємо Cisco IOS колекцію через команду ansible-galaxy collection install cisco.ios. На жаль вона не містить усіх модулів для налаштування, тому в деякій частині плейбуки будуть використовуватись спеціальні модулі, а частина налаштується просто через модуль ios_config.

Для того щоб ansible зміг підключитись до комутатора я використовую наступну конфігурацію в інвентарному файлі:

; hosts.ini
[ios]
SW_STAND ansible_host=10.10.1.10

[ios:vars]
ansible_connection=ansible.netcommon.network_cli
ansible_network_os=cisco.ios.ios
ansible_network_cli_ssh_type=libssh

ansible_libssh_user=ansible
ansible_libssh_password=cisco

ansible_user=ansible
ansible_password=cisco

ansible_become=yes
ansible_become_method=enable
ansible_become_password=cisco

тут для ansible_connection, ansible_network_os, та ansible_network_cli_ssh_type (замість libssh може бути paramiko, але у мене на одному комутаторі не відпрацьовує) вказуємо що будемо використовувати бібліотеку яка працює з ssh.

ansible_user, ansible_password — логін та пароль через якого ви будете підключатись до комутатора (ще раз наголошу що він має бути попередньо створений), параметри _libssh_ пропимуємо якщо використовуємо ssh_type=libssh, ansible_become_ параметри вказуємо що будемо в режимі конфігурації (enable mode). Пароль cisco я написав для прикладу, ви ж створюєте складний пароль та записуєте його у ansible vault.

По суті цього достатньо для запуску першої плейбуки, наприклад можемо витягнути версію комутатора та ПЗ:

# show-version.yaml
---
- name: Get Cisco IOS Version
  hosts: ios
  gather_facts: no
  tasks:
    - name: Run 'show version' command
      cisco.ios.ios_command:
        commands:
          - show version
      register: show_version_output
    - name: Display IOS version
      debug:
        var: show_version_output.stdout_lines[0]

Запускаємо через командуansible-playbook -i hosts.ini show-version.yaml та бачимо результат.

Повністю конфігурацію я виклав у себе в репозиторії, пройдемось по пунтках які дозволяють налаштувати cisco.ios модулі, а все що можна налаштувати через ios_config пропускаємо, елементарно кожну строку конфігурації можемо у ньому прописати, наприклад:

— name: Configure hard-coded general settings
 cisco.ios.ios_config:
 lines: «{{ cisco_ios_always_lines }}»

і у змінній cisco_ios_always_lines вказуємо те що нам потрібно. Проте є best practices, у яких вказано що варто використовувати готові модулі під задачу (якщо такі є), тому далі приклади що можна через них налаштувати, наприклад текст який буде показувати при логіні на комутатор:


- name: Configure the login banner
  cisco.ios.ios_banner:
    banner: login
    text: "You are logged into {{ inventory_hostname }}."
    state: present

Або створюємо користувача для доступу по ssh private key (та не використовуємо логін/пароль).

- name: Configure ansible management user
  cisco.ios.ios_user:
    name: ansible
    nopassword: true
    sshkey: "{{ lookup('file', '~/.ssh/id_rsa.pub') }}"
    state: present
- name: Set ansible user privilege level 15
  cisco.ios.ios_user:
    aggregate:
      - name: ansible
    privilege: 15
    state: present

Чи налаштовуємо SNMP v3 протокол для моніторингу комутаторів:

- name: Configure SNMP
  cisco.ios.ios_snmp_server:
    config:
      groups:
        - group: "{{ cisco_snmp_group }}"
          acl_v4: 1
          version: v3
          version_option: priv
      views:
        - name: "{{ cisco_snmp_group }}"
          family_name: iso
          included: true
      communities:
        - acl_v4: 1
          name: "{{ cisco_snmp_group }}"
          rw: false

Також в кінці запускається запис конфігурації після ваших змін (можна закоментувати якщо ви не хочете щоб конфігурація зберігалась після перезапуску, корисно якщо щось тестуєте і не впевнені чи буде комутатор працювати правильно):

- name: Save running-config after setup
  cisco.ios.ios_config:
    save_when: modified

З мінусів використання модуля ios_config зазначу, що при налаштуванні портів не зберігається «консистентність» команд (і в логах так і пише що деякі конфігураційні параметри йдуть не по черзі як у конфігурації при виводі команди sh run ) та будуть світитись як CHANGED, але на загальне налаштування не впливають.

Пишіть у коментарях як ви автоматизовуєте мережеві пристрої та що ще додати у конфігурацію.

👍ПодобаєтьсяСподобалось9
До обраногоВ обраному2
LinkedIn
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter

По snmp нп updown traps інтерфейсів з циско на тазік, і далі нп поштою-чи-мессаджінг що щось впало-піднялося (на рутерах чи світчах). Зі своєю скриптовкою працювати через snmp взагалі доволі зручно — як нп починаючи від отримання дата для звичайних графіків по трафіку так і нп бекап конфігів на сервер-хаб (з diff на пошту якщо відрізняються).

Підписатись на коментарі