Руководство по Cisco ACI
Что такое Cisco ACI?
Инфраструктура, ориентированная на приложения (ACI)
Cisco Application Centric Infrastructure (ACI) позволяет определять сеть исходя из требований приложений. Эта архитектура упрощает, оптимизирует и ускоряет весь жизненный цикл развертывания приложений.
Контроллер инфраструктуры политик приложений (APIC)
APIC управляет масштабируемой многоарендной сетью ACI. APIC предоставляет единую точку автоматизации и управления, программирования политик, развертывания приложений и мониторинга состояния сети. APIC, реализованный как кластеризованный контроллер с реплицированной синхронизацией, оптимизирует производительность, поддерживает любые приложения в любом месте и обеспечивает унифицированную работу физической и виртуальной инфраструктуры.
APIC позволяет администраторам сети легко определять оптимальную сеть для приложений. Операторы дата-центров могут четко видеть, как приложения используют сетевые ресурсы, легко изолировать и устранять проблемы с приложениями и инфраструктурой, а также отслеживать и анализировать модели использования ресурсов.
API Cisco Application Policy Infrastructure Controller (APIC) позволяет приложениям напрямую подключаться к защищенному, общему и высокопроизводительному пулу ресурсов, включающему сетевые, вычислительные и хранилищные возможности.
ACI Fabric
Cisco Application Centric Infrastructure (ACI) Fabric включает коммутаторы Cisco Nexus 9000 серии с APIC для работы в режиме сети ACI «лист/спина». Эти коммутаторы образуют сеть типа «жирное дерево», соединяя каждый узел «лист» с каждым узлом «спина»; все другие устройства подключаются к узлам «лист». APIC управляет сетью ACI.
ACI fabric обеспечивает согласованную низкую задержку пересылки по высокоскоростным каналам связи (40 Гбит/с, с будущими возможностями 100 Гбит/с). Трафик с источником и пунктом назначения на одном коммутаторе «лист» обрабатывается локально, а весь другой трафик проходит от входящего узла «лист» к исходящему узлу «лист» через коммутатор «спина». Хотя с физической точки зрения эта архитектура кажется двухходовой, на самом деле это один маршрут третьего уровня, так как fabric работает как единый коммутатор третьего уровня.
Объектно-ориентированная операционная система (ОС) ACI fabric работает на каждом узле Cisco Nexus 9000 серии. Она позволяет программировать объекты для каждого настраиваемого элемента системы. ОС ACI fabric преобразует политики из APIC в конкретную модель, которая выполняется в физической инфраструктуре. Конкретная модель аналогична скомпилированному программному обеспечению; это форма модели, которую может выполнить операционная система коммутатора.
Все узлы коммутатора содержат полную копию конкретной модели. Когда администратор создает политику в APIC, которая представляет конфигурацию, APIC обновляет логическую модель. Затем APIC выполняет промежуточный шаг по созданию полностью детализированной политики, которую он распространяет на все узлы коммутатора, где обновляется конкретная модель.
APIC отвечает за активацию fabric, управление прошивкой коммутаторов, конфигурацию и создание сетевых политик. Хотя APIC действует как центральный движок управления политиками и сетью для fabric, он полностью удален из траектории данных, включая топологию пересылки. Следовательно, fabric по-прежнему может пересылать трафик даже при потере связи с APIC.
Дополнительная информация
Существует множество ресурсов для начала изучения ACI, вот список интересных статей из сообщества.
Использование модулей ACI
Модули Ansible ACI предоставляют удобный интерфейс для управления вашей средой ACI с помощью playbooks Ansible.
Например, для обеспечения существования определенного арендатора используется следующая задача Ansible с модулем aci_tenant <aci_tenant_module>:
- name: Ensure tenant customer-xyz exists
aci_tenant:
host: my-apic-1
username: admin
password: my-password
tenant: customer-xyz
description: Customer XYZ
state: present
Полный список существующих модулей ACI доступен для последней стабильной версии на списке сетевых модулей. Вы также можете просмотреть текущую версию разработки.
Запрос конфигурации ACI
Модуль также может использоваться для запроса конкретного объекта.
- name: Query tenant customer-xyz
aci_tenant:
host: my-apic-1
username: admin
password: my-password
tenant: customer-xyz
state: query
Или запроса всех объектов.
- name: Query all tenants
aci_tenant:
host: my-apic-1
username: admin
password: my-password
state: query
register: all_tenants
После регистрации возвращаемых значений задачи aci_tenant <aci_tenant_module>, как показано выше, вы можете получить доступ ко всей информации об арендаторах из переменной all_tenants.
Общие параметры
Каждый модуль Ansible ACI принимает следующие параметры, которые влияют на взаимодействие модуля с API REST APIC:
- host
- Имя хоста или IP-адрес APIC.
- port
- Порт для связи. (По умолчанию
443для HTTPS и80для HTTP) - username
- Имя пользователя для входа в APIC. (По умолчанию
admin) - password
- Пароль для
usernameвхода в APIC с использованием аутентификации на основе пароля. - private_key
- Закрытый ключ для
usernameвхода в APIC с использованием аутентификации на основе подписи. Новое в версии 2.5 - certificate_name
- Имя сертификата в веб-интерфейсе ACI. (По умолчанию имя файла
private_key) Новое в версии 2.5 - timeout
- Значение таймаута для связи на уровне сокетов.
- use_proxy
- Использовать системные настройки прокси. (По умолчанию
yes) - use_ssl
- Использовать HTTPS или HTTP для связи REST APIC. (По умолчанию
yes) - validate_certs
- Проверять сертификат при использовании HTTPS-связи. (По умолчанию
yes) - output_level
- Влияет на уровень детализации, возвращаемый модулями ACI пользователю. (Один из
normal,infoилиdebug) Новое в версии 2.5
Поддержка прокси
По умолчанию, если на целевом хосте установлена переменная окружения <protocol>_proxy, запросы будут отправляться через этот прокси-сервер. Это поведение можно переопределить, задав переменную для этой задачи (см. Установка окружения (и работа с прокси)), или используя параметр модуля use_proxy.
HTTP-редиректы могут перенаправлять трафик с HTTP на HTTPS, поэтому необходимо убедиться, что настройки прокси для обоих протоколов корректны.
Если вам не нужна поддержка прокси, но система может быть настроена на использование прокси, вы можете добавить этот параметр: use_proxy: no, чтобы избежать случайного использования прокси.
Подсказка
Также поддерживается выборочная поддержка прокси с использованием переменной среды no_proxy.
Возвращаемые значения
Новое в версии 2.5.
Следующие значения всегда возвращаются:
- current
- Результирующее состояние управляемого объекта или результаты вашего запроса.
Следующие значения возвращаются, когда output_level: info:
- previous
- Исходное состояние управляемого объекта (до внесения изменений).
- proposed
- Предлагаемое содержимое конфигурации, основанное на значениях, предоставленных пользователем.
- sent
- Отправленное содержимое конфигурации, основанное на значениях, предоставленных пользователем, и существующей конфигурации.
Следующие значения возвращаются, когда output_level: debug или ANSIBLE_DEBUG=1:
- filter_string
- Фильтр, используемый для конкретных запросов APIC.
- method
- HTTP-метод, используемый для отправляемого содержимого. (Либо
GETдля запросов,DELETEилиPOSTдля изменений) - response
- HTTP-ответ от APIC.
- status
- Код HTTP-статуса для запроса.
- url
- URL, используемый для запроса.
Примечание
Возвращаемые значения модуля подробно описаны в документации каждого модуля.
Дополнительная информация
Существует множество ресурсов для углубленного изучения программируемости ACI. Мы рекомендуем следующие ссылки:
Аутентификация ACI
Аутентификация на основе пароля
Если вы хотите войти с именем пользователя и паролем, вы можете использовать следующие параметры с модулями ACI:
username: admin password: my-password
Аутентификация на основе пароля очень проста в использовании, но она не является наиболее эффективной формой аутентификации с точки зрения ACI, так как требует отдельного запроса на вход и открытой сессии. Чтобы избежать истечения срока действия сессии и необходимости повторного входа, вы можете использовать более эффективную аутентификацию на основе подписи.
Примечание
Аутентификация на основе пароля также может инициировать меры предотвращения DoS в ACI v3.1+, что приводит к ограничению сессий и результатам ошибок HTTP 503 и сбоям входа.
Предупреждение
Никогда не храните пароли в открытом виде.
Функция «Vault» Ansible позволяет хранить такие конфиденциальные данные, как пароли или ключи, в зашифрованных файлах вместо открытого текста в ваших playbooks или ролях. Эти файлы vault можно затем распространять или размещать в системе управления версиями. Для получения дополнительной информации см. Использование Vault в playbooks.
Аутентификация на основе подписи с использованием сертификатов
Новое в версии 2.5.
Использование аутентификации на основе подписи более эффективно и надежно, чем аутентификация на основе пароля.
Генерация сертификата и закрытого ключа
Для аутентификации на основе подписи требуется (самозаверенный) сертификат X.509 с закрытым ключом и шаг конфигурации для вашего пользователя AAA в ACI. Для генерации действующего сертификата X.509 и закрытого ключа выполните следующую процедуру:
$ openssl req -new -newkey rsa:1024 -days 36500 -nodes -x509 -keyout admin.key -out admin.crt -subj '/CN=Admin/O=Your Company/C=US'
Настройка локального пользователя
Выполните следующие шаги:
- Добавьте сертификат X.509 в локального пользователя AAA ACI по адресу ADMIN » AAA
- Нажмите AAA Authentication
- Проверьте, что в поле Authentication поле Realm отображает значение Local
- Разверните Security Management » Local Users
- Щелкните имя пользователя, которому нужно добавить сертификат, в области User Certificates
- Нажмите знак + и введите имя сертификата в поле Name в разделе Create X509 Certificate
- Если вы используете базовое имя вашего закрытого ключа здесь, вам не нужно вводить
certificate_nameв Ansible
- Если вы используете базовое имя вашего закрытого ключа здесь, вам не нужно вводить
- Скопируйте и вставьте свой сертификат X.509 в поле Data.
Вы можете автоматизировать это с помощью следующей задачи Ansible:
- name: Ensure we have a certificate installed
aci_aaa_user_certificate:
host: my-apic-1
username: admin
password: my-password
aaa_user: admin
certificate_name: admin
certificate: "{{ lookup('file', 'pki/admin.crt') }}" # This wil read the certificate data from a local file
Примечание
Аутентификация на основе подписи работает только с локальными пользователями.
Использование аутентификации на основе подписи с Ansible
Для работы вам потребуются следующие параметры с вашими модулями ACI:
username: admin private_key: pki/admin.key certificate_name: admin # This could be left out !
Подсказка
Если вы используете имя сертификата в ACI, которое совпадает с базовым именем закрытого ключа, вы можете опустить параметр certificate_name , как в примере выше.
Дополнительная информация
Подробная информация об аутентификации на основе подписи доступна на странице Cisco APIC Signature-Based Transactions.
Использование ACI REST с Ansible
Хотя в дистрибутиве Ansible уже существует множество модулей ACI, и наиболее распространенные действия можно выполнить с помощью этих существующих модулей, всегда может быть что-то, что нельзя сделать с готовыми модулями.
Модуль aci_rest предоставляет прямой доступ к API REST APIC и позволяет выполнять любые задачи, не покрытые существующими модулями. Это может показаться сложной задачей, но вы можете легко сгенерировать необходимую нагрузку REST для любого действия, выполненного в веб-интерфейсе ACI.
Встроенная идемпотентность
Поскольку API REST APIC по своей природе идемпотентен и может сообщать, было ли внесено изменение, модуль aci_rest автоматически наследует обе возможности и является первоклассным решением для автоматизации вашей инфраструктуры ACI. В результате пользователи, которым требуется более мощный доступ на низком уровне к своей инфраструктуре ACI, не должны отказываться от идемпотентности и не должны угадывать, было ли выполнено изменение при использовании модуля aci_rest.
Использование модуля aci_rest
Модуль aci_rest принимает собственные XML и JSON данные, но также принимает данные в формате YAML (структурированные как JSON). Для XML данных требуется использование пути, заканчивающегося на .xml, а для JSON или YAML – пути, заканчивающегося на .json.
При выполнении изменений можно использовать методы POST или DELETE, а при выполнении запросов – метод GET.
Например, если вы хотите убедиться, что определенный арендатор существует в ACI, эти четыре примера функционально идентичны:
XML (Нативный ACI REST)
- aci_rest:
host: my-apic-1
private_key: pki/admin.key
method: post
path: /api/mo/uni.xml
content: |
<fvTenant name="customer-xyz" descr="Customer XYZ"/>
JSON (Нативный ACI REST)
- aci_rest:
host: my-apic-1
private_key: pki/admin.key
method: post
path: /api/mo/uni.json
content:
{
"fvTenant": {
"attributes": {
"name": "customer-xyz",
"descr": "Customer XYZ"
}
}
}
YAML (REST в стиле Ansible)
- aci_rest:
host: my-apic-1
private_key: pki/admin.key
method: post
path: /api/mo/uni.json
content:
fvTenant:
attributes:
name: customer-xyz
descr: Customer XYZ
Задача Ansible (Специализированный модуль)
- aci_tenant:
host: my-apic-1
private_key: pki/admin.key
tenant: customer-xyz
description: Customer XYZ
state: present
Подсказка
Формат XML более удобен, когда необходимо шаблонизировать данные REST-загрузки (встроеный), но формат YAML удобнее для поддержания вашей инфраструктуры в формате кода и лучше интегрирован с исполняемыми файлами Ansible. Специализированные модули предлагают более простой и абстрагированный, но также более ограниченный опыт. Используйте то, что лучше подходит для вашего случая.
Дополнительная информация
Существует множество ресурсов для изучения интерфейса APIC REST API ACI, мы рекомендуем следующие ссылки:
- Документация модуля aci_rest
- APIC REST API Configuration Guide – Подробное руководство по разработке и использованию API REST APIC, включая многочисленные примеры
- APIC Management Information Model reference – Полное описание модели объектов APIC
- Cisco DevNet Learning Labs о ACI и REST
Примеры использования
Вот краткий обзор полезных задач для повторного использования в ваших исполняемых файлах.
Не стесняйтесь добавлять больше полезных фрагментов.
Ожидание готовности всех контроллеров
Вы можете использовать приведенную ниже задачу после начала создания APIC и настройки кластера, чтобы подождать, пока все APIC-ы войдут в онлайн-режим. Она будет ждать, пока количество контроллеров не сравняется с количеством, указанным в группе инвентаризации apic.
- name: Waiting for all controllers to be ready
aci_rest:
host: '{{ apic_ip }}'
private_key: pki/admin.key
method: get
path: /api/node/class/topSystem.json?query-target-filter=eq(topSystem.role,"controller")
register: topsystem
until: topsystem|success and topsystem.totalCount|int >= groups['apic']|count >= 3
retries: 20
delay: 30
Ожидание полного соответствия кластера
Нижеприведенный пример ожидает полного соответствия кластера. В этом примере вы знаете количество APIC-ов в кластере и проверяете, что каждый APIC сообщает статус «полного соответствия».
- name: Waiting for cluster to be fully-fit
aci_rest:
host: '{{ apic_ip }}'
private_key: pki/admin.key
method: get
path: /api/node/class/infraWiNode.json?query-target-filter=wcard(infraWiNode.dn,"topology/pod-1/node-1/av")
register: infrawinode
until: >
infrawinode|success and
infrawinode.totalCount|int >= groups['apic']|count >= 3 and
infrawinode.imdata[0].infraWiNode.attributes.health == 'fully-fit' and
infrawinode.imdata[1].infraWiNode.attributes.health == 'fully-fit' and
infrawinode.imdata[2].infraWiNode.attributes.health == 'fully-fit'
# all(apic.infraWiNode.attributes.health == 'fully-fit' for apic in infrawinode.imdata)
retries: 30
delay: 30
Сообщения об ошибках APIC
Могут возникнуть следующие сообщения об ошибках, и этот раздел поможет вам понять, что происходит, и как их исправить/избежать.
- Ошибка APIC 122: неизвестный класс управляемого объекта ‘polUni’
- В случае, если вы получаете эту ошибку, будучи уверенным в правильности своей загрузки aci_rest и классах объектов, проблема может заключаться в том, что данные, по факту, не являются корректным JSON (например, в отправляемых данных используются одинарные кавычки вместо двойных), и в результате APIC не правильно анализирует ваши классы объектов из загруженных данных. Один из способов избежать этого – использовать формат YAML или XML, которые легче правильно составить и изменить в дальнейшем.
- Ошибка APIC 400: некорректные данные в строке ‘1’. Отсутствуют атрибуты, тег ‘attributes’ должен быть указан первым, перед любым другим тегом
- Хотя спецификация JSON допускает неупорядоченные элементы, API REST APIC требует, чтобы элемент JSON
attributesпредшествовал массивуchildrenили другим элементам. Таким образом, необходимо убедиться, что ваши данные соответствуют этому требованию. Сортировка ключей словаря поможет. - Ошибка APIC 801: свойство descr uni/tn-TENANT/ap-AP не прошло проверку на валидность для значения ‘A “legacy” network’
- Некоторые значения в APIC имеют строгие правила формата, и встроенная проверка APIC на валидность предоставленного значения не прошла. В приведенном выше случае, параметр
description(внутренне известный какdescr) принимает только значения, соответствующие Regex: [a-zA-Z0-9\!#$%()*,-./:;@ _{|}~?&+]+, как правило, он не должен содержать кавычки или квадратные скобки.
Известные проблемы
Модуль aci_rest является обёрткой вокруг APIC REST API. В результате любые проблемы, связанные с APIC, будут отражаться при использовании этого модуля.
Все проблемы, перечисленные ниже, либо были сообщены поставщику, либо их можно просто избежать.
- Слишком много последовательных вызовов API может привести к ограничению соединения
-
Начиная с ACI v3.1, APIC будет активно ограничивать скорость подключения с аутентификацией по паролю, превышающую определенный порог. Это делается в рамках мер защиты от DDoS-атак, но может создавать проблемы при использовании Ansible с ACI при аутентификации по паролю. В настоящее время одним из решений является увеличение этого порога в конфигурации nginx, но рекомендуется использовать аутентификацию на основе подписи.
ПРИМЕЧАНИЕ: Рекомендуется использовать аутентификацию на основе подписи с ACI, так как она не только предотвращает ограничение подключения, но также улучшает общую производительность при использовании модулей ACI.
- Некоторые запросы могут не отражать изменения должным образом (#35401)
-
Существует известная проблема, когда некоторые запросы к APIC не правильно отражают внесенные изменения в результирующем выводе, даже если мы явно запрашиваем эти изменения у APIC. В одном случае с использованием пути
api/node/mo/uni/infra.xmlпроисходит ошибка, тогда какapi/node/mo/uni/infra/.xmlработает корректно.ПРИМЕЧАНИЕ: Обходным решением является регистрация значений возвращаемых задачей (например,
register: this) и управление тем, когда задача должна сообщить о изменении, добавив:changed_when: this.imdata != []. - Некоторые запросы, как известно, не являются идемпотентными (#35050)
-
Поведение APIC несогласованно с использованием
status="created"иstatus="deleted". В результате, когда вы используетеstatus="created"в своей полезной нагрузке, результирующие задачи не являются идемпотентными и создание объекта завершится неудачей, если объект уже существует. Однако это не относится кstatus="deleted", где подобный вызов несуществующего объекта не вызывает никаких ошибок.ПРИМЕЧАНИЕ: Для обеспечения идемпотентности в вашем рабочем процессе следует избегать использования
status="created"и использоватьstatus="modified". - Установка пароля пользователя не является идемпотентной (#35544)
-
Из-за несоответствия в REST API APIC, задача, которая устанавливает пароль локально аутентифицированного пользователя, не является идемпотентной. APIC выведет сообщение
Password history check: user dag should not use previous 5 passwords.ПРИМЕЧАНИЕ: Для этой проблемы нет обходного решения.
ACI Ansible сообщество
Если у вас есть конкретные проблемы с модулями ACI, заявки на новые функции или вы хотите внести свой вклад в проект ACI, предложив изменения или обновления документации, обратитесь к странице вики Ansible Community ACI по адресу: https://github.com/ansible/community/wiki/Network:-ACI
Вы найдете наш план, обзор открытых проблем и запросов на включение в ACI, а также дополнительную информацию о нас. Если вы заинтересованы в использовании ACI с Ansible, присоединяйтесь! Мы время от времени проводим онлайн-встречи, чтобы отслеживать прогресс и готовиться к новым выпускам Ansible.
См. также
- Ansible для автоматизации сети
- Подробное руководство по использованию Ansible для автоматизации сетевой инфраструктуры.
- Список модулей ACI
- Полный список поддерживаемых модулей ACI.
- Сообщество ACI
- Страница вики-проекта Ansible ACI community, содержит план, идеи и документацию по разработке.
- Рабочая группа сети
- Страница Ansible сообщества по сети, включает контактную информацию и информацию о встречах.
- #ansible-network
- IRC-чат-канал #ansible-network на Freenode.net.
- Список рассылки пользователей
- Есть вопрос? Задавайте его в группе!
© 2012–2018 Michael DeHaan
© 2018–2019 Red Hat, Inc.
Licensed under the GNU General Public License version 3.
https://docs.ansible.com/ansible/2.5/scenario_guides/guide_aci.html