Использование ролей Ansible для сети
Роли представляют собой наборы Ansible-значений по умолчанию, файлов, задач, шаблонов, переменных и других Ansible-компонентов, работающих вместе. Как вы видели на Выполнение вашей первой команды и книги задач, переход от команды к книге задач упрощает выполнение нескольких задач и повторяемость одних и тех же задач в том же порядке. Переход от книги задач к роли делает повторное использование и совместное использование упорядоченных задач еще проще. Вы можете посмотреть на Ansible Galaxy, который позволяет вам делиться своими ролями и использовать роли других, как напрямую, так и для вдохновения.
Понимание ролей
Итак, что такое роль и почему она важна? Роли Ansible — это по существу книги задач, разбитые на известную структуру файлов. Переход к ролям из книги задач упрощает совместное использование, чтение и обновление вашего Ansible-потока работы. Пользователи могут создавать свои собственные роли. Например, вам не нужно писать собственную книгу задач DNS. Вместо этого вы указываете DNS-сервер и роль для его настройки.
Для дальнейшего упрощения вашей рабочей среды команда Ansible по сетям написала серию ролей для распространенных сетевых сценариев использования. Использование этих ролей означает, что вам не нужно изобретать велосипед. Вместо написания и обслуживания собственных create_vlan книг задач или ролей, вы можете сосредоточиться на проектировании, кодировании и обслуживании шаблонов анализаторов, описывающих ваши сетевые топологии и инвентаризацию, и позвольте сетевым ролям Ansible выполнить работу. См. сетевые роли в Ansible Galaxy.
Пример книги задач DNS
Для демонстрации концепции роли ниже приведен playbook.yml пример — единственный YAML-файл, содержащий книгу задач с двумя задачами. Эта Ansible-книга задач настраивает имя хоста на устройстве Cisco IOS XE, а затем настраивает DNS-серверы (система доменных имен).
---
- name: configure cisco routers
hosts: routers
connection: ansible.netcommon.network_cli
gather_facts: no
vars:
dns: "8.8.8.8 8.8.4.4"
tasks:
- name: configure hostname
cisco.ios.ios_config:
lines: hostname {{ inventory_hostname }}
- name: configure DNS
cisco.ios.ios_config:
lines: ip name-server {{dns}}
Если вы запустите эту книгу задач с помощью ansible-playbook команды, вы увидите вывод ниже. В этом примере использовалась -l опция для ограничения книги задач выполнением только на узле rtr1.
[user@ansible ~]$ ansible-playbook playbook.yml -l rtr1 PLAY [configure cisco routers] ************************************************* TASK [configure hostname] ****************************************************** changed: [rtr1] TASK [configure DNS] *********************************************************** changed: [rtr1] PLAY RECAP ********************************************************************* rtr1 : ok=2 changed=2 unreachable=0 failed=0
Эта книга задач настроила имя хоста и DNS-серверы. Вы можете проверить эту конфигурацию на Cisco IOS XE-маршрутизаторе rtr1:
rtr1#sh run | i name hostname rtr1 ip name-server 8.8.8.8 8.8.4.4
Преобразование книги задач в роль
Следующим шагом является преобразование этой книги задач в многократно используемую роль. Вы можете вручную создать структуру каталогов или использовать ansible-galaxy init для создания стандартной структуры для роли.
[user@ansible ~]$ ansible-galaxy init system_demo [user@ansible ~]$ cd system_demo/ [user@ansible system_demo]$ tree . ├── defaults │ └── main.yml ├── files ├── handlers │ └── main.yml ├── meta │ └── main.yml ├── README.md ├── tasks │ └── main.yml ├── templates ├── tests │ ├── inventory │ └── test.yml └── vars └── main.yml
В этой первой демонстрации используются только каталоги tasks и vars. Структура каталогов будет выглядеть следующим образом:
[user@ansible system_demo]$ tree
.
├── tasks
│ └── main.yml
└── vars
└── main.yml
Далее, перенесите содержимое vars и tasks разделов из исходной Ansible-книги задач в роль. Сначала перенесите две задачи в файл tasks/main.yml.
[user@ansible system_demo]$ cat tasks/main.yml
---
- name: configure hostname
cisco.ios.ios_config:
lines: hostname {{ inventory_hostname }}
- name: configure DNS
cisco.ios.ios_config:
lines: ip name-server {{dns}}
Затем перенесите переменные в файл vars/main.yml.
[user@ansible system_demo]$ cat vars/main.yml --- dns: "8.8.8.8 8.8.4.4"
Наконец, измените исходную Ansible-книгу задач, чтобы удалить tasks и vars разделы и добавить ключевое слово roles с именем роли, в данном случае system_demo. У вас будет такая книга задач:
---
- name: configure cisco routers
hosts: routers
connection: ansible.netcommon.network_cli
gather_facts: false
roles:
- system_demo
Подводя итог, в этой демонстрации теперь есть три каталога и три YAML-файла. Существует каталог system_demo, который представляет роль. Этот system_demo содержит два каталога, tasks и vars. В каждом соответствующем каталоге есть файл main.yml. Каталог vars/main.yml содержит переменные из playbook.yml. Каталог tasks/main.yml содержит задачи из playbook.yml. Файл playbook.yml был изменен для вызова роли вместо непосредственного указания переменных и задач. Вот дерево текущей рабочей директории:
[user@ansible ~]$ tree
.
├── playbook.yml
└── system_demo
├── tasks
│ └── main.yml
└── vars
└── main.yml
Запуск книги задач приводит к идентичному поведению с немного отличающимся выводом:
[user@ansible ~]$ ansible-playbook playbook.yml -l rtr1 PLAY [configure cisco routers] ************************************************* TASK [system_demo : configure hostname] **************************************** ok: [rtr1] TASK [system_demo : configure DNS] ********************************************* ok: [rtr1] PLAY RECAP ********************************************************************* rtr1 : ok=2 changed=0 unreachable=0 failed=0
Как видно выше, каждая задача теперь предваряется именем роли, в данном случае system_demo. При запуске книги задач, содержащей несколько ролей, это поможет определить, откуда вызывается задача. Эта книга задач возвратила ok вместо changed, потому что она имеет идентичное поведение для книги задач из одного файла, с которой мы начали.
Как и прежде, книга задач сгенерирует следующую конфигурацию на маршрутизаторе Cisco IOS-XE:
rtr1#sh run | i name hostname rtr1 ip name-server 8.8.8.8 8.8.4.4
Вот почему роли Ansible можно просто рассматривать как деконструированные книги задач. Они просты, эффективны и многократно используемы. Теперь другой пользователь может просто включить роль system_demo вместо создания настраиваемой «жестко закодированной» книги задач.
Порядок приоритета переменных
Что, если вы хотите изменить DNS-серверы? От вас не ожидается изменение vars/main.yml в структуре роли. Ansible имеет множество мест, где вы можете указать переменные для определённого выполнения. Подробности о переменных и приоритете см. в Использование переменных. На самом деле существует 21 место для размещения переменных. Хотя этот список может показаться избыточным на первый взгляд, подавляющее большинство случаев использования предполагает только знание места размещения переменных с наименьшим приоритетом и как передавать переменные с наивысшим приоритетом. Более подробное руководство о том, где разместить переменные, см. в Порядок приоритета переменных: где мне разместить переменную?.
Наименьший приоритет
Наименьший приоритет имеет каталог defaults внутри роли. Это означает, что все остальные 20 мест, где вы потенциально можете указать переменную, будут иметь больший приоритет, чем defaults, независимо от чего. Чтобы немедленно придать переменным из роли system_demo наименьший приоритет, переименуйте каталог vars в defaults.
[user@ansible system_demo]$ mv vars defaults [user@ansible system_demo]$ tree . ├── defaults │ └── main.yml ├── tasks │ └── main.yml
Добавьте новый раздел vars в книгу задач, чтобы переопределить стандартное поведение (где переменная dns установлена в 8.8.8.8 и 8.8.4.4). В этой демонстрации установите dns в 1.1.1.1, таким образом playbook.yml станет:
---
- name: configure cisco routers
hosts: routers
connection: ansible.netcommon.network_cli
gather_facts: no
vars:
dns: 1.1.1.1
roles:
- system_demo
Запустите эту обновлённую книгу задач на rtr2:
[user@ansible ~]$ ansible-playbook playbook.yml -l rtr2
Конфигурация на маршрутизаторе Cisco rtr2 будет выглядеть следующим образом:
rtr2#sh run | i name-server ip name-server 1.1.1.1
Переменная, настроенная в книге задач, теперь имеет приоритет над каталогом defaults. Фактически, любая другая точка настройки переменных будет иметь приоритет над значениями в каталоге defaults.
Наивысший приоритет
Указание переменных в каталоге defaults внутри роли всегда будет иметь наименьший приоритет, в то время как указание vars как дополнительных переменных с -e или --extra-vars= всегда будет иметь наивысший приоритет, независимо от чего. Повторный запуск книги задач с -e опцией переопределяет и каталог defaults (8.8.4.4 и 8.8.8.8), а также недавно созданный vars в книге задач, содержащий DNS-сервер 1.1.1.1.
[user@ansible ~]$ ansible-playbook playbook.yml -e "dns=192.168.1.1" -l rtr3
Результат на маршрутизаторе Cisco IOS XE будет содержать только настройку с наивысшим приоритетом — 192.168.1.1:
rtr3#sh run | i name-server ip name-server 192.168.1.1
Как это полезно? Почему это важно? Дополнительные переменные обычно используются сетевыми операторами для переопределения значений по умолчанию. Яркий пример — функция «Опрос шаблонов заданий» в AWX или Red Hat Ansible Automation Platform. С помощью веб-интерфейса можно попросить сетевого оператора заполнить параметры с помощью веб-формы. Это может быть очень просто для нетехнических авторов книг задач для выполнения книги задач с помощью веб-браузера.
Обновление установленной роли
Страница Ansible Galaxy для роли содержит список всех доступных версий. Для обновления локально установленной роли до новой или другой версии используйте команду ansible-galaxy install с опцией версии и --force. Возможно, также потребуется вручную обновить любые зависимые роли, чтобы они поддерживали эту версию. См. вкладку «Читать» роли в Galaxy для требований к минимальной версии зависимых ролей.
[user@ansible]$ ansible-galaxy install mynamespace.my_role,v2.7.1 --force
См. также
- Документация Ansible Galaxy
-
Руководство пользователя Ansible Galaxy
© 2012–2018 Michael DeHaan
© 2018–2024 Red Hat, Inc.
Licensed under the GNU General Public License version 3.
https://docs.ansible.com/ansible/latest/network/getting_started/network_roles.html