Spec-Zone.ru › Ansible

Использование сетевых ролей Ansible

Роли — это наборы значений Ansible по умолчанию, файлов, задач, шаблонов, переменных и других компонентов Ansible, которые работают вместе. Как вы видели в разделе Выполнение первой команды и плейбука, переход от команды к плейбуку упрощает выполнение нескольких задач и повторение одних и тех же задач в том же порядке. Переход от плейбука к роли упрощает повторное использование и совместное использование упорядоченных задач. Вы можете ознакомиться с Ansible Galaxy, которая позволяет делиться ролями и использовать роли других пользователей — напрямую или в качестве источника вдохновения.

  • Пример плейбука для DNS
  • Преобразование плейбука в роль
  • Приоритет переменных

    • Самый низкий приоритет
    • Самый высокий приоритет
  • Обновление установленной роли

Что такое роли

Что же такое роль и почему она должна вас интересовать? По сути, роли Ansible — это плейбуки, разбитые на файлы в определенной структуре. Переход от плейбука к ролям упрощает совместное использование, чтение и обновление рабочего процесса Ansible. Пользователи могут создавать собственные роли. Например, вам не нужно писать собственный плейбук для DNS. Вместо этого вы указываете DNS-сервер и роль, которая настроит его за вас.

Чтобы еще больше упростить ваш рабочий процесс, команда Ansible Network создала ряд ролей для распространенных сценариев использования сетей. Используя эти роли, вам не придется изобретать велосипед. Вместо того чтобы писать и поддерживать собственные плейбуки или роли 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. Возможно, потребуется вручную обновить и все зависимые роли, чтобы они поддерживали эту версию. Минимальные требования к версиям зависимых ролей см. на вкладке Read Me роли в Galaxy.

[user@ansible]$ ansible-galaxy install mynamespace.my_role,v2.7.1 --force

См. также

Документация Ansible Galaxy

Руководство пользователя Ansible Galaxy

© 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/network/getting_started/network_roles.html

Spec-Zone.ru

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