Все началось с задачи создать некоторое количество vlan на пачке коммутаторов, а делать это вручуню совсем не хотелось. Знающие люди посоветовали использовать Ansible. На мануал не претендует, так как опыта использования пока не много, но тем, что получилось, хочу поделиться. Конструктивная критика, замечания и пожелания приветствуются.
Подробности под катом.
Установка
Установка на Centos довольно простая.
yun install ansible
Дальше нужно установить модули от Juniper для Ansible, тут команде Juniper отдельное спасибо.
ansible-galaxy install Juniper.junos
Проверить установленные модули можно командой.
ansible-galaxy list
После установки можно проверить версию
ansible --version
ansible 2.3.1.0
config file = /etc/ansible/ansible.cfg
configured module search path = Default w/o overrides
python version = 2.7.5 (default, Nov 6 2016, 00:28:07) [GCC 4.8.5 20150623 (Red Hat 4.8.5-11)]
В файле конфигурации ansible.cfg определены путь к файлу логов и списку устройств, а также опция, отключающая проверку SSH ключей в локальном хранилище при подключении к коммутатору:
[defaults]
inventory = /etc/ansible/hosts
host_key_checking = False
log_path = /var/log/ansible.log
Список устройств лежит в файле hosts. Хосты можно группировать, группы могут быть членами других групп:
[testswitches]
#SWTEST
192.168.8.192
#SWAC_0901
192.168.8.218
[prodswitches]
#SWAC_1301
192.168.8.81
#SWAC_1302
192.168.8.82
[allswitches:children]
testswitches
prodswitches
Внесение изменений в конфигурацию коммутатора
Нужно создать ansible playbook — сценарий, по которому Ansible будет выполнять определенные действия. Первый playbook для внесения изменений в конфигурацию коммутаторов — changeconfig.yml. Просто создаем пустой файл с расширением yml:
#playbook начинается с ---
---
#задаем имя
- name: Juniper Config Changes
#группа хостов, к которым будет применяться playbook
hosts: testswitches
#роль, которая будет использоватья - это библиотека от Juniper, которую установили ранее
roles:
- Juniper.junos
connection: local
gather_facts: no
#тут даем ссылку на интерпретатор Python, если в системе было установлено несколько версий
vars:
ansible_python_interpreter: /usr/bin/python
#чтобы не хранить креденшелс в файле, их можно вводить при запуске playbook
vars_prompt:
- name: USERNAME
prompt: Username
private: no
- name: PASSWORD
prompt: Password
private: yes
#дальше описываем задачу, которую нужно сделать
#timeout увеличен до 120 сек, потому что после commit старые EX2200 некоторое время думают, за это время сессия отваливалась
tasks:
- name: Retrieve information from devices running Junos OS
junos_config:
host: "{{ inventory_hostname }}"
username: "{{ USERNAME }}"
password: "{{ PASSWORD }}"
timeout: 120
port: 22
#перечисляем команды так, как бы мы их вносили на самом коммутаторе
lines:
- delete interfaces vme unit 0 family inet dhcp
- set vlans vlan10 description "TestVlan"
- set vlans vlan10 vlan-id 10
Запускаем playbook командой ansible-playbook changeconfig.yml
Username: admin
Password:
PLAY [Juniper Config Changes] **********************************************
TASK [Retrieve information from devices running Junos OS]
ok: [192.168.8.218]
changed: [192.168.8.192]
PLAY RECAP ******************************************************
192.168.8.192 : ok=1 changed=1 unreachable=0 failed=0
192.168.8.218 : ok=1 changed=0 unreachable=0 failed=0
Я немного почистил вывод, но в целом, ok показывает, что подключение прошло успешно, changed=1 — что изменения внесены на коммутатор. На 192.168.8.218 нужный влан уже был
Сбор информации с коммутаторов
Еще один Playbook показывает, как собрать нужные данные с коммутаторов и сохранить результаты в локальный файл. Меня интересовала версия Junos. Ниже я приведу только часть tasks, все, что выше, аналогично предыдущему playbook
tasks:
- name: Retrieve information from devices running Junos OS
junos_command:
host: "{{ inventory_hostname }}"
username: "{{ USERNAME }}"
password: "{{ PASSWORD }}"
timeout: 120
port: 22
commands:
- show version
#тут мы регистрируем переменную, в которую будет все выводиться, в дебаге можно посмотреть ее структуру и сохранить в файл интересующее поле
register: printout
- name: Save Output
#debug: msg="{{printout.stdout_lines}}"
lineinfile:
path: versions.log
create: yes
line: "{{printout.stdout_lines}}"
Для отладки можно запускать playbook командой ansible-playbook -vvv getversion.yml
Также все логи будут лежать в указанном в конфиге /var/log/ansible.log
В целом Ansible мне понравился, буду осваивать дальше, благодарю за внимание.
Автор: Коваленко Александр