- Infrastrukturní DevOps s HPE OneView (1) – Infrastructure as Code
- Infrastrukturní DevOps s HPE OneView (2) – API
- Infrastrukturní DevOps s HPE OneView (3) – Message bus
- Infrastrukturní DevOps s HPE OneView (4) – PowerShell
- Infrastrukturní DevOps s HPE OneView (5) – PowerShell skripty
- Infrastrukturní DevOps s HPE OneView (6) – Python
- Infrastrukturní DevOps s HPE OneView (7) – Python skripty
- Infrastrukturní DevOps s HPE OneView (8) – vaše vlastní aplikace s Grommet
- Infrastrukturní DevOps s HPE OneView (9) – Ansible a infrastruktura
- Infrastrukturní DevOps s HPE OneView (10) – Ansible a Blade networking
- Infrastrukturní DevOps s HPE OneView (11) – Ansible a síťový fabric
- Infrastrukturní DevOps s HPE OneView (12) – Ansible a servery
Pokračujme ve zkoumání příkladového Ansible playbooku pro automatizace vaší infrastruktury způsobem Infrastructure as code a Desired State. V minulém díle jsme si připravili networking z hlediska konektivity – připojení serverových žiletek do LAN a SAN, definice VLAN, odchozích portů a tak podobně. Dnes si do automatizace přidáme i externí síťový svět, konkrétně top-of-rack prvek.
Síťařina a Ansible
Následující příklad využívá Ansible modulů pro HPE prvky pro datová centra s operačním systémem Comware. Stejným způsobem ale můžete využít module pro Arista networks, které má od listopadu HPE ve svém portfoliu. Pokud sázíte na open source, můžete nasadit Ansible nad OpenSwitch. Všechny tyto varianty má HPE ve svém portfoliu. Podobných výsledků ale dostanete i s řešeními jiných výrobců. Ansible moduly existují třeba pro Dell, Juniper JunOS, Cisco IOS i NXOS.
Praktický příklad
Připomeňme si část hlavního playbooku (main.yaml), která se týká dnešního tématu:
- name: Top-of-rack networking hosts: switches gather_facts: no connection: local vars: state: present vars_files: - config.yaml roles: - tor-networking
Podívejme se také na kousek z našeho config.yaml. V něm jsme definovali VLANy a externí konektivitu. V minulém díle jsme to využívali pro konfiguraci blade switche, dnes totéž provedeme na druhé straně, tedy na top-of-rack prvku (pro jednoduchost jsou všechny blade skříně napojeny na jeden logický ToR prvek, ale samozřejmě není problém příklad rozšířit na podstatně komplexnější prostředí).
vlans: - id: 101 name: Prod-101 - id: 102 name: Prod-102 - id: 103 name: Dev-103 logical_interconnect_group: FlexFabric connectivity_enclosures: - logical_interconnects: - module: Encl1, interconnect 1 ports: - X2 - X4 switchports: - GigabitEthernet 1/0/2 - GigabitEthernet 1/0/3 switch_link_aggregation_group: 1 - module: Encl1, interconnect 2 ports: - X2 - X4 switchports: - GigabitEthernet 1/0/4 - GigabitEthernet 1/0/5 switch_link_aggregation_group: 2
Všimněte si, že máme popsanou vazbu mezi externími porty blade šasí a porty v ToR prvku s tím, že v některých případech definujeme ještě číslo agregační skupiny, tedy požadujeme vytvoření LACP linkové agregace.
Pojďme tedy nahlédnout do tasků v roli, která nastavuje síťové prostředí. Pokud byste místo Comware použili Arista, OpenSwitch nebo Cisco Nexus, bude to velmi podobné co do konceptu.
Nejlprve se ujistíme, že máme vytvořeny všechny potřebné VLANy. Koncept Desired state znamená, že pokud nějaká chybí (například jsme přidali novou do config.yaml), Ansible uvede náš prvek do požadovaného stavu (tedy chybějící VLAN vytvoří).
- name: Ensure that VLANs exist comware_vlan: state: "{{ state }}" vlanid: "{{ item.id }}" name: "{{ item.name }}" username: "{{ switch_username }}" password: "{{ switch_password }}" hostname: "{{ inventory_hostname }}" with_items: "{{ vlans }}"
V případě Comware potřebujeme vytvořit permitted vlan string. To je to, co je nastaveno na portech ve smyslu výčet VLAN, která portem mohou procházet. Je to textový zápis (např. 1,10,20,300), tak si ho tímto způsobem připravíme (pozn.: jiné moduly pro jiné typy zařízení mohou používat jiný přístup, například výčet VLAN ve formě pole – na principu se ale mnoho nemění).
- name: Create permited VLANs string set_fact: permitted_vlans: "{{ vlans | map(attribute='id') | join(',') }}"
Teď už pojďme port a za portem a nastavujme. Pro zjednodušení tohle děláme zavoláním jiného vnořeného playbooku vždy pro každý propojovací prvek blade šasí.
- name: Ensure ports are configured include: ports.yaml with_items: "{{ connectivity_enclosures }}"
Co tedy playbook ports.yaml dělá?
Nejprve se ujistíme, že máme vytvořenou linovou agregaci, tedy virtuální porty (BAGG či chcete-li port-channel). Nicméně to provedeme pouze v případě, že je to v config.yaml požadováno.
- name: Ensure link aggregation is configured comware_portchannel: state: "{{ state }}" group: "{{ item.switch_link_aggregation_group }}" members: "{{ item.switchports }}" mode: dynamic type: bridged username: "{{ switch_username }}" password: "{{ switch_password }}" hostname: "{{ inventory_hostname }}" with_items: "{{ item.logical_interconnects }}" when: item.switch_link_aggregation_group is defined
Pak nastavíme povolené VLAN na potřebných portech. Uděláme to zvlášť pro porty, které nejsou v linkové agregaci – tam použijeme cyklus a port nastavíme jeden po druhém. V případě linkové agregace už máme porty seskupené pod virtuální channel port, takže ten můžeme nastavit přímo bez cyklu.
- name: Ensure that VLANs are configured on standalone ports comware_switchport: state: "{{ state }}" name: "{{ item[1] }}" link_type: trunk permitted_vlans: "{{ permitted_vlans }}" username: "{{ switch_username }}" password: "{{ switch_password }}" hostname: "{{ inventory_hostname }}" with_subelements: - "{{ item.logical_interconnects }}" - switchports when: item[0].switch_link_aggregation_group is not defined - name: Ensure that VLANs are configured on link aggregattion interfaces comware_switchport: state: "{{ state }}" name: "Bridge-Aggregation {{ item.switch_link_aggregation_group }}" link_type: trunk permitted_vlans: "{{ permitted_vlans }}" username: "{{ switch_username }}" password: "{{ switch_password }}" hostname: "{{ inventory_hostname }}" with_items: "{{ item.logical_interconnects }}" when: item.switch_link_aggregation_group is defined
Na závěr se vrátíme do hlavního tasku role uložíme konfiguraci prvku (aby si ji pamatoval i po restartu).
- name: Save switch configuration comware_save: username: "{{ switch_username }}" password: "{{ switch_password }}" hostname: "{{ inventory_hostname }}"