3. Что представляет собой ACI?
ACI фабрика
Неблокируемая фабрика на базе оверлеев
App DBWeb
Внешняя сеть
передачи данных
(Tenant VRF)
QoS
Filter
QoSQoS
Filter
Application Policy
Infrastructure
Controller
APIC
1. Профиль
приложения
2. Кластер
контроллеров
3. Cеть на базе
Nexus 9000
Service
Filter
ServiceСеть ЦОД на базе коммутаторов
Nexus 9000 с централизованным
управлением при помощи
контроллера на основе политик
5. API на уровне устройства
• NETCONF
• REST
• JSON-RPC
Высокоуровневые абстракции и DevOps
• Puppet
• Chef
• Openstack
Новые инструменты для настройки сетевых устройств
6. REST использует знакомую модель
HTTP GET
HTML
Описывает как
данные
отображаются
пользователю
HTTP GET
JSON/XML
Описывают данные в
формате, который
понятен приложению
{"ids":[303776224, 19449911, 607032789,
86544242, 2506725913, 17631389],
"next_cursor":0, "next_cursor_str":"0",
"previous_cursor":0,
"previous_cursor_str":"0"}
Web серфинг REST API Twitter: IDs of last five followers
12. Объектная модель ACI
• В модели находятся все объекты о
которых знает APIC контроллер
§ Network, Compute, Application, и т.д.
• Management Information Tree (MIT):
объекты сгруппированы в виде
дерева
• MIT имеет разные ветки (distinct
branches) для разных
функциональных областей
• Каждый узел (node) это
управляемый объект:
§ имеет class & distinguished name
12
topRoot
polUni compUni
13. Конфигурация сети как набор объектов
Конфигурация представляет собой
упорядоченный набор объектов
… которые имеют ссылки друг на друга
Root
Policy
Universe
Tenants
Application
s
Infra
VLANs
Fabric
Nodes
Virtual
Network
Hypervisors
13
Tenant
VRF VRF
Bridge
Domain 1
10.1.0.1/24
Bridge
Domain 2
10.2.0.1/24
Bridge
Domain 1
14. Уникальное имя (distinguished name = dn)
• DN используется как глобальный уникальный идентификатор для каждого объекта
в дереве MIT
• Представляет собой relative name (RN) к которому приставляется слева
родительское RN (parent RN)
• Правила именования RN зависят от объекта управления
§ детали в документации
14
topRoot
polUni fvTenant
fvAp fvAEPg
vzFilter vzEntry
vzBrCP vzSubj
fabricTopology fabricPod
fabricPathEpCont fabricPathEp
fabricNode
vmmProvP vmmDomP vmmCtrlrP
Пример:
uni/tn-tenant/ap-app1/epg-epg1
Пример:
topology/pod-1/paths-101/pathep-[eth1/1]
15. Программные интерфейсы ACI
• Northbound API дают возможность
управлять контроллером из
внешних систем
• Northbound API
§ Native REST API
§ Python SDK (“Cobra”)
• Southbound API применяются для
управления устройствами
подключаемыми к фабрике
• Southbound API
§ L4-7 Device Packages
§ OpFlex
15
Системы
управления
Скрипты
APIC
REST
МСЭ Коммутатор
OpFlex
APIC
Dev Pkg
16. REST – единственный интерфейс
16
GUI
CLI
Web
браузер
API Tools
Object
Browser
(visore)
APIC кластер +
Leaves & Spines
R
E
S
T
Python
SDK
18. REST API: поддерживаемые методы
• Поддерживаются стандартные
методы
• Stateless
§ No state for requests or
sessions
• HTTP1.1 / HTTPS (default)
• Обрабатываются любым
APIC в кластере
• Доступ к коммутаторам
через APIC
18
Метод Действие
GET Read
POST Create / Update
DELETE Delete
• Формат XML или JSON
– определяется расширением в URI
– Content-Type и Accept header игнорируются
19. REST API: операции чтения
19
/api
API
Operator
/{mo|class}
Определение
объекта или
класса
/{dn|classname}
Distinguished
name или
Object Class
.{xml|json}
Тип ответа xml
или json
?[options]
Фильтры,
селекторы или
модификаторы
запроса
host:port
APIC хост
и порт
http(s)://
http или
https
20. Получение информации об объекте по его имени (DN)
• Чтение свойств EPG
20
<imdata totalCount="1">
<fvAEPg childAction="" configIssues="" configSt="applied" descr=""
dn="uni/tn-Cisco/ap-Software/epg-Download" lcOwn="local"
matchT="AtleastOne" modTs="2015-05-23T22:19:21.173+00:00" monPolDn="uni/
tn-common/monepg-default" name="Download" pcTag="49189"
prio="unspecified" scope="2293760" status="" triggerSt="triggerable"
uid="0"/>
</imdata>
http://apic/api/mo/uni/tn-Cisco/ap-Software/epg-Download.xml
21. Поиск информации по имени класса
• Получение L1 свойств всех физических интерфейсов
21
<imdata totalCount="1134">
<l1PhysIf adminSt="up" autoNeg="on" bw="0" childAction="" delay="1" descr=""
dn="topology/pod-1/node-102/sys/phys-[eth1/32]" dot1qEtherType="0x8100"
ethpmCfgFailedBmp="" ethpmCfgFailedTs="00:00:00:00.000" ethpmCfgState="0"
id="eth1/32" inhBw="unspecified" layer="Layer2" lcOwn="local" linkDebounce="100"
linkLog="default" mdix="auto" medium="broadcast"
modTs="2015-06-03T22:07:10.513+00:00" mode="trunk" monPolDn="uni/infra/moninfra-
default" mtu="9000" name="" portT="leaf" routerMac="not-applicable"
snmpTrapSt="enable" spanMode="not-a-span-dest" speed="10G" status=""
switchingSt="disabled" trunkLog="default" usage="discovery"/>
…
</imdata>
http://apic/api/class/l1PhysIf.xml?query-target-filter=eq(l1PhysIf.speed,"10G")
22. Получение всех свойств объекта
• Чтение всех свойств объекта (subtree=агдд)
22
<imdata totalCount="1">
<compVm cfgdOs="Ubuntu Linux (32-bit)" childAction="" descr="" dn="comp/prov-
VMware/ctrlr-[vc-1]-vCenter_1/vm-vm-1001" guid="5024a300-1fde-aa80-72d4-7c33ef63a688"
id="0" lcOwn="local" modTs="2015-06-05T17:04:04.471+00:00" monPolDn=""
name="32bit_Ubuntu" oid="vm-1001" os="" state="poweredOn" status="" type="virt">
<compVNic adapterType="Vmxnet3" addressType="assigned" childAction="" descr=""
guid="" id="0" ip="0.0.0.0" lcOwn="local" mac="00:50:56:A4:D0:D0"
modTs="2015-06-05T17:04:04.471+00:00" monPolDn="" name="Network adapter 1" oid="4000"
operSt="up" rn="vnic-00:50:56:A4:D0:D0" status="" type="virt"/>
<compRsHv childAction="" forceResolve="no" lcOwn="local"
modTs="2015-06-04T22:39:08.435+00:00" rType="mo" rn="rshv-[comp/prov-VMware/ctrlr-
[vc-1]-vCenter_1/hv-host-12]" state="formed" stateQual="none" status="" tCl="compHv"
tDn="comp/prov-VMware/ctrlr-[vc-1]-vCenter_1/hv-host-12" tType="mo"/>
</compVm>
</imdata>
http://apic/api/mo/comp/prov-VMware/ctrlr-[vc-1]-vCenter_1/vm-vm-1001.xml?rsp-subtree=full
Атрибут subtree query установлен в значение
"full" для получения всех связанных объектов
target Dn содержит ссылку на другой объект –
в этом примере – гипервизор чтобы получить
больше информации об объекте
23. REST API: операции Create/Update
/api /mo /dn .{xml|json} ?[options]host:porthttp(s)://
<fvTenant name="NewTenant">
<fvAp name="NewApplication">
<fvAEPg name="WebTier">
<fvRsPathAtt encap="vlan-1" mode="regular"
tDn="topology/pod-1/paths-17/pathep-[eth1/1]"/>
</fvAEPg>
</fvAp>
</fvTenant>
В теле запроса (payload) в виде XML/JSON на APIС передается команда
23
24. Object Browser: Visore
• Встроенный в APIC браузер для
поиска объектов и проверки их
состояния и свойств
• Ссылка на Visore: http://<apic>/
visore.html
• Поиск объекта по его dn
(fvTenant, topSystem, topology/
pod-1/node-101)
24
25. Sniffer: API Inspector
• API вызовы, которые
выполняются при действиях в
GUI мониторятся
§ GET, POST
• Команды навигации и GET-
вызовы которые выполняются в
фоновом режиме
• При изменении конфигурации
можно увидеть POST вызовы
которые выполняются в
фоновом режиме
25
26. Результат работы API инспектора
26
POST
url: http://172.23.3.215/api/node/mo/uni/tn-Cisco.json
{
"fvTenant": {
"attributes": {
"name": "Cisco",
"status": "created"
},
"children": []
}
}
28. SDK и документация
• Доступен на APIC*:
§ https://<apic>/cobra
• Доступен на DevNet
§ https://developer.cisco.com/site/apic-
dc/
§ Downloads -> Python Egg Files
• Потребуется использовать
Management Information Model
§ https://developer.cisco.com/media/
mim-ref/ или https://<apic>/doc/html
• Python SDK документация
§ https://developer.cisco.com/site/apic-
dc/documents/pythonapi or
§ https://<apic>/cobra
• APIC REST API User Guide
§ http://www.cisco.com/c/en/us/td/docs/
switches/datacenter/aci/apic/sw/1-x/
api/rest/
b_APIC_RESTful_API_User_Guide.ht
ml
28
*http://cs.co/9006xDw6
29. Установка сессии
• REST
• Login с использованием username
и password в payload
§ POST /api/mo/aaaLogin.xml
§ <aaaUser name='admin' pwd='insieme'/>
• В заголовке ответа находится
“APIC-cookie”
§ Сохранить и использовать в
последующих запросах
Cobra
import cobra.mit.access
import cobra.mit.session
ls = cobra.mit.session.LoginSession(
'https://apic', 'admin', 'insieme')
md = cobra.mit.access.MoDirectory(ls)
md.login()
md содержит ссылку на сессию на
APIC контроллер
29
30. Примеры простых запросов
REST
Запрос информации обо всех endpoint
(подключенные к фабрике физические
и виртуальные сущности)
GET /api/class/fvCEp.xml
<?xml?><imdata><fvCEp dn="uni/tn-Cisco/ap-
Blog/epg-MySQL/cep-00:50:56:82:D2:FE"
encap="vlan-501" id="0" ip="0.0.0.0"
lcC="vmm" lcOwn="local"
mac="00:50:56:82:D2:FE" mcastAddr="not-
applicable" name="00:50:56:82:D2:FE” uid="0"/
></imdata>
Парсинг результата в виде XML и
последующая обработка
Cobra
Использование метода “lookupByClass”
для поиска всех endpoints (fvCEp)
endpoints = md.lookupByClass('fvCEp')
print([str(ep.dn) for ep in endpoints])
['uni/tn-Cisco/ap-Blog/epg-MySQL/
cep-00:50:56:82:D2:FE', 'uni/tn-Cisco/ap-Blog/
epg-MySQL/cep-00:50:56:82:C3:D0']
30
Tip: To inspect http requests use debuglevel on
httplib:
import httplib
httplib.HTTPConnection.debuglevel = 1
31. Query Filters in Cobra
Built in helpers .lookupByClass and .lookupByDn use .query under the covers
For advanced queries, you can use .query directly
In this example, we recursively print a full subtree for all endpoints
def printtree(mos, indent=0):
for mo in mos:
print ' ' * indent, str(mo.meta.className)
printtree(mo.children, indent=indent+2)
cq = cobra.mit.access.ClassQuery('fvCEp')
cq.subtree = 'full'
endpoints = md.query(cq)
printtree(endpoints)
>>> printtree(endpoints)
cobra.model.fv.CEp
cobra.model.fv.RsNic
cobra.model.fv.RsVm
cobra.model.fv.RsCEpToPathEp
cobra.model.fv.RsHyper
cobra.model.fv.ReportingNode
31
32. Фильтры для запросов
32
• Более эффективно, возвращается меньшее число объектов
• Фильтрация ответа, по определенным критериям condition(s):
§ Синтаксис: http://URI?condition[&condition[&...]]
Тип фильтра Синтаксис Cobra Query Property Описание
query-target {self | children | subtree} AbstractQuery.queryTarget Define the scope of query
target-subtree-class <class name> AbstractQuery.classFilter Respond only elements including specified class
query-target-filter <filter expressions> AbstractQuery.propFilter Respond only elements matching conditions
rsp-subtree {no | children | full} AbstractQuery.subtree specifies child object level included in the response
rsp-subtree-class <class name> AbstractQuery.subtreeClassFilter Respond only specified classes
rsp-subtree-filter <filter expressions> AbstractQuery.subtreePropFilter (>1.0.2m) Respond only classes matching conditions
rsp-subtree-include {faults | health :stats : …} AbstractQuery.subtreeInclude Request additional objects
order-by <classname.property>| {asc | desc} NotImplemented Sort the response based on the property values
33. Подтверждение изменений в конфигурации
REST
Создание нового тенанта
POST /api/mo/uni.xml
<fvTenant name="Cisco"/>
Cobra
Создать объект и подтвердить
внесение изменений
33
Совет: To get the configured XML body for the object
you've created/modified, add the rsp-include query
parameter:
POST /api/mo/uni.xml?rsp-subtree=modified
topMo = cobra.model.pol.Uni('')
fvTenant = cobra.model.fv.Tenant(topMo, name='Cisco')
c = cobra.mit.request.ConfigRequest()
c.addMo(fvTenant)
md.commit(c)
Еще один совет: Disable the annoying Requests Insecure
Warning. Put this at the top of your script:
import requests.packages.urllib3
requests.packages.urllib3.disable_warnings()
36. Использование arya (1/2)
Получение конфигурации,
которую нужно превратить в
код
1. Right-click –> save XML
2. Использовать API
inspector
3. Запрос конфигурации из
APIC при помощи REST
36
Выберите "only configuration" и
"subtree"
37. Использование arya (2/2)
# arya.py -f accportprof-vm-vpc10.xml
37
#!/usr/bin/env python
'''
Autogenerated code using arya.py
Original Object Document Input:
<?xml version="1.0" encoding="UTF-8"?><imdata totalCount="1"><infraAccPortP descr="" dn="uni/infra/accportprof-vm-vpc10" name="vm-vpc10" ownerKey="" ownerTag=""><infraHPortS descr="" name="vm-vpc10" ownerKey=""
ownerTag="" type="range"><infraRsAccBaseGrp fexId="101" tDn="uni/infra/funcprof/accbundle-vm-vpc10"/><infraPortBlk descr="" fromCard="1" fromPort="10" name="block1" toCard="1" toPort="10"/></infraHPortS></
infraAccPortP></imdata>
'''
raise RuntimeError('Please review the auto generated code before ' +
'executing the output. Some placeholders will ' +
'need to be changed')
# list of packages that should be imported for this code to work
import cobra.mit.access
import cobra.mit.request
import cobra.mit.session
import cobra.model.infra
import cobra.model.pol
from cobra.internal.codec.xmlcodec import toXMLStr
# log into an APIC and create a directory object
ls = cobra.mit.session.LoginSession('https://1.1.1.1', 'admin', 'password')
md = cobra.mit.access.MoDirectory(ls)
md.login()
# the top level object on which operations will be made
polUni = cobra.model.pol.Uni('')
infraInfra = cobra.model.infra.Infra(polUni)
# build the request using cobra syntax
infraAccPortP = cobra.model.infra.AccPortP(infraInfra, ownerKey='', name='vm-vpc10', descr='', ownerTag='')
infraHPortS = cobra.model.infra.HPortS(infraAccPortP, ownerKey='', type='range', name='vm-vpc10', descr='', ownerTag='')
infraRsAccBaseGrp = cobra.model.infra.RsAccBaseGrp(infraHPortS, fexId='101', tDn='uni/infra/funcprof/accbundle-vm-vpc10')
infraPortBlk = cobra.model.infra.PortBlk(infraHPortS, name='block1', descr='', fromPort='10', fromCard='1', toPort='10', toCard='1')
# commit the generated code to APIC
print toXMLStr(infraInfra)
c = cobra.mit.request.ConfigRequest()
c.addMo(infraInfra)
md.commit(c)
Готовый Cobra script
для создания
профиля vPC
Остается добавить APIC IP и
credentials а так же удалить
предупреждение о том что
код без проверки запускать
нельзя
39. Программируемость и ACI
39
ACI предоставляет:
REST API
Полностью открытая модель объектов
Доступ при помощи JSON или XML
Python SDK для доступа к объектам
Но….
Существенные затраты на обучение
§ 5000+ классов
§ Новые концепции
40.
41. Почему появился ACI Toolkit?
41
Снижение входного барьера
Адресовать 80% сценариев использования
Дать примеры скриптов конечным
Заказчикам
Ускорить процесс перехода на ACI
43. ACI Toolkit
CLI интерфейс: network, security, cloud, application
APIC
ACI Toolkit
NX-OS like
CLI
Custom
Python Scripts
• Основан на открытых APIC API
• Скрипты, написаны при помощи
Toolkit просто создавать и
редактировать
• Пока нет полной функциональности,
наиболее часто используемые
операции
• Фокус в основном на конфигурацию
46. Приложение «CLI»
Эмуляция NX-OS CLI полностью
написаная на Python
Использует возможности toolkit
Знакомый интерфейс для сетевого
инженера
Фокус на задачах поддержки
§ show epg
§ shutdown / no shutdown на interface
47. Приложение «Cable Plan»
47
Дает возможность импортировать
существующий кабельный план :
§ XML файла
§ APIC
Выполнить экспорт и сравнение
загруженных ранее кабельных
планов
Advanced use can build cable plan
XML file, query, and modify cable plan
48. Приложение «ACI Endpoint Tracker»
Отслеживает подключение и историю
перемещений оконечных
Сохраняет данные в open source MySQL
Database, давая возможность выполнять
собственные запросы
Основа для средств визуализации
Помогает ответить на следующие вопросв:
§ Какие Endpoint подключены к сети?
§ Куда подключен определенный
Endpoint?
§ Кто был подключен в прошлый
Четверг между 3:30am и 4:00am?
§ История перемещения
определенного Endpoint?
48
54. Создание профиля приложения
Логическая модель: private network, как набор изолированных сетевых сегментов, или VRF
Tenant: Hello_Connect
VRF: VRF_INSIDE
56. Создание профиля приложения
Bridge Domain логическая конструкция обозначающая границы L2-сегмента
Bridge Domain: 10.0.0.1_255.255.255.0
Tenant: Hello_Connect
VRF: VRF_INSIDE
57. Новая концепция: Bridge Domain
Bridge Domain - логическая
конструкция
представляющая L2-сегмент
передачи данных внутри
фабрики
Один или несколько EPG
могут быть ассоциированы с
одним BD
Можно «превратить» в
аналог VLAN:
1. Влючить flood для L2
unknown unicast
2. Включить ARP Flooding
Название BD удобно сделать
«говорящим», например
использовать для этого адрес
и маску подсети
58. Создание профиля приложения
Знакомая концепция: подсети – primary/secondary IP адреса на SVI-интерфейсах
Bridge Domain: 10.0.0.1_255.255.255.0
Tenant: Hello_Connect
VRF: VRF_INSIDE
Secondary
10.1.1.x/24
Primary
10.0.0.x/24
interface vlan123
ip address 10.0.0.1 255.255.255.0
ip address 10.1.1.1 255.255.255.0 secondary
60. Новая концепция: профиль приложения
§ Сетевой профиль приложения представляет собой набор EPG и политик,
которые определяют правила взаимоотношений между группами
Inbound/Outbound политики
Сетевой Профиль Приложения
Inbound/Outbound политики
EPG A
Service A
Service A
Service A
Service A
Service B
Service B
Service B
Service B
EPG B
Service C
Service C
Service C
Service C
Service C Service C
EPG C
Service D
Service E
Service D
Service E
61. Создание профиля приложения
Сетевой профиль ANP содержит один или несколько EPG
Bridge Domain: 10.0.0.1_255.255.255.0
Tenant: Hello_Connect
VRF: VRF_INSIDE
vPC_to_UCS_a
vlan-10
vPC_to_UCS_b
vlan-10
EPG: db
Security Zone
vPC_to_UCS_a
vlan-20
vPC_to_UCS_b
vlan-20
EPG: app
Security Zone
ANP: Hello_world Нет контрактов = нет передачи данных
vPC_to_UCS_a
vlan-30
vPC_to_UCS_b
vlan-30
EPG: web
Security Zone
Secondary
10.1.1.x/24
Primary
10.0.0.x/24
63. Новая концепция: EPG
63
Ø Интерфейс, при помощи которого конечное
устройство подключается к сети
Ø Имеет адрес (identity), местоположения, атрибуты
(version, patch level)
Ø Может быть физическим или виртуальным
Примеры:
§ End Point Group (EPG) определяются при помощи:
— Физический портов (leaf или FEX)
— Логический порт (VM port group)
— VLAN ID
— VXLAN (VNID)
— IP адрес (применимо ко внешним подключениям external/border leaf)
— IP Prefix/Subnet (применимо ко внешним подключениям external/border leaf)
— Атрибуты виртуальных машин (план)
Сервер
Виртуальные машины
или контейнеры
СХД
Клиенты
67. Создание профиля приложения
Контракты необходимы для управления передачей данных между EPG
Bridge Domain: 10.0.0.1_255.255.255.0
Tenant: Hello_Connect
VRF: VRF_INSIDE
vPC_to_UCS_a
vlan-30
vPC_to_UCS_b
vlan-30
EPG: app
Контакт = передача данныхANP: Hello_world
vPC_to_UCS_a
vlan-10
vPC_to_UCS_b
vlan-10
EPG: db
192.168.10.13 192.168.10.12
Secondary
10.1.1.x/24
Primary
10.0.0.x/24
192.168.10.11 192.168.10.10
Нет контракта = нет передачи данных
Контакт = передача данных
vPC_to_UCS_a
vlan-30
vPC_to_UCS_b
vlan-30
EPG: web
Security Zone