Сбор backup с сетевых устройств Cisco и Juniper, с помощью Ansible и GitLab

от автора

В жизни каждой развивающейся сети наступает момент, когда необходимо задуматься о её восстанавливаемости после различных видов сбоев, будь то аппаратные неисправности в оборудовании или ошибки админа. В таком случае, очень полезно иметь под рукой резервную конфигурацию устройства для быстрого восстановления работоспособности сети. В данной статье, мы рассмотрим как можно с помощью GitLab и Ansible, развернуть сервер для сбора и хранения резервных конфигураций сетевого оборудования, производства Cisco Systems и Juniper Networks.

Исходя из сложившихся обстоятельств, развертывание системы сбора резервных конфигураций осуществлялось на сервере с OC Astra Linux SE 1.7. Что особо не влияет порядок действий, за исключением пары моментов о которых я расскажу ниже.

Первым нюансом стало то, что после установки пакета ansible, необходимые модули и коллекции для взаимодействия с оборудованием Cisco и Juniper не загрузились, как это происходит при скачивании с репозиториев Ubuntu. После анализа недостающих компонентов, я установил всё необходимое с помощью следующих команд:

pip3 install xmltodict pip3 install jxmlease pip3 install junos-eznc pip install ncclient ansible-galaxy collection install juniper.device ansible-galaxy collection install -s https://old-galaxy.ansible.com cisco.ios pip install --user --break-system-packages ansible-pylibssh paramiko

После установки ansible и всех необходимых зависимостей, содаём docker-compose.yml с контейнерами GitLab:

version: '3.5' services:   gitlab:     image: gitlab/gitlab-ce:latest     hostname: 192.168.1.1     restart: unless-stopped     environment:       GITLAB_OMNIBUS_CONFIG: |         gitlab_rails['gitlab_shell_ssh_port'] = 8822     ports:       - "80:80"       - "8822:22"     volumes:       - ~/gitlab/etc:/etc/gitlab       - ~/gitlab/var/opt:/var/opt/gitlab       - ~/gitlab/var/log:/var/log/gitlab     networks:       - gitlab_net    gitlab-runner:     image: gitlab/gitlab-runner:alpine     restart: unless-stopped     depends_on:       - gitlab     volumes:       - ~/gitlab/etc/gitlab-runner:/etc/gitlab-runner       - ~/gitlab/var/run/docker.sock:/var/run/docker.sock     networks:       - gitlab_net  networks:   gitlab_net:

Подгрузка нового контейнера осуществляется командой:

docker-compose up -d --build

Теперь, можно приступить к основному этапу настройки: — конфигурация ansible.

Для начала необходимо составить inventory-файл, иными словами список хостов, с которыми будет взаимодействовать Ansible. Файл ивентаризации можно создать как в корневом каталоге Ansible, так и в домашней директории, главное указать путь до созданного файла в /etc/ansible/ansible.cfg. В моем случае, файл инвентаризации располагается в каталоге playbooks: ~/playbooks/myhost.ini. Также, для удобства, все узлы сети целесообразно разбить на группы по типу оборудования, например, ios и junos.

Пример inventory-файла, ~/playbooks/myhost.ini:

[ios] Cisco_3945 ansible_host=10.35.48.1 ansible_user=admin ansible_password=admin_password Cisco_3750 ansible_host=10.35.48.2 ansible_user=admin ansible_password=admin_password  [junos] Jun_mx5 ansible_host=10.35.49.1 ansible_user=admin ansible_password=admin_password Jun_ex4200 ansible_host=10.35.49.2 ansible_user=admin ansible_password=admin_password

После этого создаем playbook для сбора резервных конфигураций с сетевых устройств:

ios_backup.yml

--- - name: "Collect IOS facts"   hosts: ios   gather_facts: no   connection: network_cli   become: yes   become_method: enable   tasks: # сбор конфигов на сервер-ansible     - name: configs       ios_command:         commands: show running-config       register: ios_config     - name: Copy facts to files       copy:         content: "{{ ios_config.stdout[0] }}"         dest: "/home/qwerty/playbooks/cisco/{{inventory_hostname}}_config.cfg" # путь куда конфиги сохраняются локально  - name: "GIT"   hosts: localhost    tasks:      - name: "print time" # определение времени для gitlab       command: date       register: time       changed_when: false       delegate_to: localhost       run_once: yes          - name: "Configure Git user"       git_config:         name: "user.name"         value: "qwerty"         scope: "global"        - name: "Configure Git email"       git_config:         name: "user.email"         value: "qwerty@qwerty"         scope: "global"      - name: "git command" # отправка конфигов на сервер-gitlab       shell: |         git add .         git commit -m "Device Backup on {{time.stdout}} "          git push --set-upstream origin main       args:         chdir: /home/qwerty/playbooks/cisco       delegate_to: localhost       run_once: yes   

junos_backup.yml

--- - name: "test"   hosts: junos   connection: local   gather_facts: no   collections: juniper.device     tasks:       - name: "test2" # сбор конфигов на сервер-ansible         juniper.device.config:           retrieve: "committed"           dest: "/home/qwerty/playbooks/juniper/{{ inventory_hostname }}-system-config" # путь куда конфиги сохраняются локально  - name: "GIT"   hosts: localhost    tasks:        - name: "print time" # определение времени для gitlab       command: date       register: time       changed_when: false       delegate_to: localhost       run_once: yes      - name: "git command" # отправка конфигов на сервер-gitlab       shell: |         git add .         git commit -m "Device Backup on {{time.stdout}} "          git push --set-upstream origin main       args:         chdir: /home/qwerty/playbooks/juniper       delegate_to: localhost       run_once: yes 

Затем создаем каталог group_vars, с файлами ios.yml и junos.yml

ios.yml

ansible_python_interpreter: /usr/bin/python3 ansible_connection: ansible.netcommon.network_cli ansible_network_os: cisco.ios.ios ansible_become: yes ansible_become_method: enable ansible_become_password: admin_password ansible_host_key_checking: false

junos.yml

ansible_python_interpreter: /usr/bin/python3 ansible_host_key_checking: false ansible_network_os: junipernetworks.junos.junos ansible_connection: ansible.netcommon.netconf ansible_user: admin ansible_password: admin_password

На этом, подготовительная часть закончена, можно приступать к настройке взаимодействия GitLab и Ansible. Переходим в gitlab http://<ip-сервера>, username: root, пароль находится на сервере в файле ~/gitlab/etc/initial_root_password. После этого необходимо изменить пароль и создать нового пользователя.

1) Кликаем на иконку пользователя -> Edit profile -> SSH Keys -> Add new key -> вставляем публичный ключ сервера Ansible.

2) Создаем группу backup и новый проект:

После этого копируем созданные репозитории Git на сервер Ansible.

Пример команд для Git репозитория Cisco:

git clone ssh://git@<ip-gitlab>:8822/backup/cisco.git cd cisco git config --local user.name "qwerty" git config --local user.email "qwerty@mail.ru" git switch --create main touch README.md git add README.md git commit -m "add README" git push --set-upstream origin main cd ..

Теперь всё готово для запуска playbook:

ansible-playbook -i myhosts.ini ios_backup.yml

После успешного выполнения заходим в GitLab и проверяем backups устройств.


ссылка на оригинал статьи https://habr.com/ru/articles/881222/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *