V minulém díle jsme si rozjeli Lead-Spine OpenSwitch topologii s využitím Dockeru a skript nám vygeneroval také hosts file pro Ansible. Dnes se vyzkoušíme napojení na Ansible 2.1.
Příprava Ansible a vašeho VM
První co potřebujeme udělat je nainstalovat Ansible minimálně ve verzi 2.1. Postup najdete zde: http://docs.ansible.com/ansible/intro_installation.html
Dále vyřešíme nastavení SSH klienta v naší VM. Výchozí Linux chování je, že se pro každou IP ukládá veřejný klíč připojeného systému. To má pro nás dvě nevýhody. Jednak se Linux při prvním připojení ptá, zda je to v pořádku (což nás docela zdržuje). Druhá věc je, že pokud prostředí zrušíte a vytvoříte znovu, klíče se změní a je potřeba je ručně vymazat. Pro naše testovací prostředí tedy budeme chtít otázky vypnout a klíče neukládat. Uděláme to tak, že vytvoříme soubor ~/.ssh/config s tímto obsahem:
Host * StrictHostKeyChecking no UserKnownHostsFile /dev/null
Na mém systému bylo také nutné udělat drobou rekonfiguraci Ansible – vyexportujte tuto proměnnou:
export ANSIBLE_SCP_IF_SSH=y
Vyzkoušíme Ansible
Ansible potřebuje informace a tom, co má spravovat. Jde o tzv. hosts file a ten vám automaticky vytvořil skript create.sh popsaný v minulém díle. Podívejme se do něj:
[leafs] leaf1 ansible_host=172.18.0.2 ansible_port=22 leaf2 ansible_host=172.18.0.3 ansible_port=22 leaf3 ansible_host=172.18.0.4 ansible_port=22 leaf4 ansible_host=172.18.0.5 ansible_port=22 [spines] spine1 ansible_host=172.18.0.6 ansible_port=22 spine2 ansible_host=172.18.0.7 ansible_port=22
Systémy jsme sdružili do dvou skupin – leaf switche a spine switche.
Abychom se ujistili, že Ansible je shopen se připojit k prvkům a komunikovat s OpenSwitch, máme připraven Playbook, který konektivitu otestuje. Najdete ho v souboru test-connection.yml. Podívejme se dovnitř:
--- - hosts: all remote_user: root gather_facts: no vars: ansible_user: root tasks: - name: Ping my switches ping: - name: Collect device information ops_facts: host: localhost transport: rest validate_certs: False config: No username: root password: - name: Print OpenSwitch version debug: var=version
Co se tam děje? Jako hosts jsme použili all, chceme tedy operace provést na všech nodech, které Ansiblu předhodíme. v sekci tasks najdeme tři úlohy.
První nemá nic společného s OpenSwitch a jde pouze o „Andible ping“. Nejedná se o ICMP, ale Ansible se pokusí připojit do cílového zařízení přes SSH, uploadnout tam Python skript a ten spustit – tím tedy ověřit, že Ansible má k dispozici všechno potřebné ke svému běhu.
Druhý úkol už je specifický pro OpenSwitch a je to úloha, která načte informace o zařízeních a tyto jsou pak dostupné pro další úlohy v Playbooku.
Třetí úloha jednoduše vytiskne na obrazovku fakta načtená v kroku dva, konkrétně načtenou informaci o verzi OpenSwitch.
Spusťte teď testovací skript a prohlédněte si výsledek:
$ ansible-playbook -i hosts test-connection.yml PLAY [all] ********************************************************************* TASK [Ping my switches] ******************************************************** ok: [spine2] ok: [spine1] ok: [leaf2] ok: [leaf1] ok: [leaf3] ok: [leaf4] TASK [Collect device information] ********************************************** ok: [leaf2] ok: [leaf3] ok: [spine2] ok: [spine1] ok: [leaf1] ok: [leaf4] TASK [Print OpenSwitch version] ************************************************ ok: [leaf3] => { "version": "0.4.0 (Build: genericx86-64-ops-0.4.0-master-20160601060155-dev)" } ok: [spine1] => { "version": "0.4.0 (Build: genericx86-64-ops-0.4.0-master-20160601060155-dev)" } ok: [spine2] => { "version": "0.4.0 (Build: genericx86-64-ops-0.4.0-master-20160601060155-dev)" } ok: [leaf2] => { "version": "0.4.0 (Build: genericx86-64-ops-0.4.0-master-20160601060155-dev)" } ok: [leaf1] => { "version": "0.4.0 (Build: genericx86-64-ops-0.4.0-master-20160601060155-dev)" } ok: [leaf4] => { "version": "0.4.0 (Build: genericx86-64-ops-0.4.0-master-20160601060155-dev)" } PLAY RECAP ********************************************************************* leaf1 : ok=3 changed=0 unreachable=0 failed=0 leaf2 : ok=3 changed=0 unreachable=0 failed=0 leaf3 : ok=3 changed=0 unreachable=0 failed=0 leaf4 : ok=3 changed=0 unreachable=0 failed=0 spine1 : ok=3 changed=0 unreachable=0 failed=0 spine2 : ok=3 changed=0 unreachable=0 failed=0
Funguje 🙂
Vyzkoušejme si také přepínač limit, kterým můžeme omezit, na jaké nody chceme Playbook aplikovat. Můžete použít například jen jednu skupinu:
$ ansible-playbook -i hosts test-connection.yml --limit spines PLAY [all] ********************************************************************* TASK [Ping my switches] ******************************************************** ok: [spine1] ok: [spine2] TASK [Collect device information] ********************************************** ok: [spine1] ok: [spine2] TASK [Print OpenSwitch version] ************************************************ ok: [spine1] => { "version": "0.4.0 (Build: genericx86-64-ops-0.4.0-master-20160601060155-dev)" } ok: [spine2] => { "version": "0.4.0 (Build: genericx86-64-ops-0.4.0-master-20160601060155-dev)" } PLAY RECAP ********************************************************************* spine1 : ok=3 changed=0 unreachable=0 failed=0 spine2 : ok=3 changed=0 unreachable=0 failed=0
Nebo jen konkrétní node:
$ ansible-playbook -i hosts test-connection.yml --limit spine1 PLAY [all] ********************************************************************* TASK [Ping my switches] ******************************************************** ok: [spine1] TASK [Collect device information] ********************************************** ok: [spine1] TASK [Print OpenSwitch version] ************************************************ ok: [spine1] => { "version": "0.4.0 (Build: genericx86-64-ops-0.4.0-master-20160601060155-dev)" } PLAY RECAP ********************************************************************* spine1 : ok=3 changed=0 unreachable=0 failed=0