Ich habe kürzlich Angefangen meine ersten Gehversuche mit Ansible zu machen. Ziel ist unteranderem meine Linux Maschinen zu managen als auch Cisco Geräte. Hier meine ersten Erfahrungen mit Ansible.
Was ist der Vorteil von Ansible?
- Opensource
- reichhaltiges Plugin Angebot (Ansible Galaxy)
- viele Artikel & Tipps im Internet, kein Nischenprodukt
- es ist in Python geschrieben 😉
- Ansible nutzt die jinja2 Template Engine
- Nutzt YAML & JSON
- und das wichtigste -> es wird auf dem Zielgerät kein Client oder Agent benötigt, benötigt wird nur SSH und bei Linux Hosts Python
Installation von Ansible auf einem Ubuntu System
Es ist empfehlenswert die letzte Version aus den PPA Repositories zu verwenden, die Version in 16.04 LTS ist 2.x, aktuell ist 2.4.2.0. Ich habe bei meinen Versuchen festgestellt das viele Plugins z.B. ansible-hardening (https://github.com/openstack/ansible-hardening) nicht funktionieren.
Kurzanleitung aktuelle Version auf Ubuntu
sudo apt update sudo apt install software-properties-common sudo apt-add-repository ppa:ansible/ansible sudo apt update sudo apt install ansible
Erste Gehversuche in Ansible
Ein Ansible Setup besteht aus 2 Bestandteilen, ein Inventory und YAML Files (Playbooks, etc.).
Beispiel meines Inventorys
[switches] switch1 [switches:vars] ansible_user=admin ansible_ssh_pass=admin ansible_ssh_common_args='-o StrictHostKeyChecking=no'
In den eckigen Klammern kann man Gruppen erzeugen, darunter sind die Mitglieder der Gruppe. Ein Host kann in mehreren Gruppen sein. Mit [gruppenname:vars] können gruppenspezifische Parameter mit übergeben werden. Der Host switch1 ist in meinem DNS auflösbar, sollte das nicht der Fall sein kann man hinter den Hostnamen die IP-Adresse statisch übergeben wie folgt:
[switches] switch1 ansible_host=192.168.1.44
Das Inventory lässt sich alternativ zum INI Format auch als YAML definieren.
--- all: hosts: switches: hosts: switch1: ansible_host: 192.168.1.44 switch2: switch3: switch4: vars: ansible_user: admin ansible_ssh_pass: admin ansible_ssh_common_args: -o StrictHostKeyChecking=no
Erster Test: IOS_Facts vom Switch laden
test.yaml
--- - hosts: switch1 connection: local gather_facts: False vars: cli: host: "{{ inventory_hostname }}" username: "{{ ansible_user }}" password: "{{ ansible_ssh_pass }}" tasks: - name: Get IOS facts ios_facts: gather_subset: all provider: "{{ cli }}" register: iosfacts_out tags: foobar - name: print iosfacts_out debug: var=iosfacts_out
Im YAML File sind folgende Dinge definiert:
- hosts: switch1
- Hier können Gruppen oder einzelne Hosts angegeben werden, wird mehr als ein Host oder Gruppe angegeben ist eine Liste mit Spiegelstrichen zu erstellen
z.B.
- hosts: - switch1 - switch2
- connection: local
- Da auf dem Cisco Switch kein Python vorhanden ist wird das von Ansible erzeuge Python File lokal ausgeführt.
- gather_facts: False
- Das Sammeln von Fakten (Informationen) über den Hosts ist deaktiviert
- vars:
- Hier können Variablen definiert werden die für das Playbook gelten
- tasks:
- Hier können die einzelnen Tasks definiert werden
- – name: <Beschreibung des Task>
- register: <variablename>
- Ausgaben die durch ein Plugin erzeugt werden in der genannten Variable gespeichert
- tags: <tagname>
- Für einen Task können ein oder mehrere Tags definiert werden, so lassen sich aus einem Playbook ein oder mehrere Tasks aus dem kompletten Playbook ausführen, dazu muss man ansible-playbook mit dem Parameter –tags=<tagname> aufrufen.
- register: <variablename>
Das Playbook ausführen
ansible-playbook -i hosts.yaml test.yaml PLAY [switch1] ************************************************************************************** TASK [Get IOS facts] ******************************************************************************* ok: [switch1] TASK [print iosfacts_out] ************************************************************************** ok: [switch1] => { "iosfacts_out": { "ansible_facts": { "ansible_net_all_ipv4_addresses": [ "192.168.1.44" ], ... gekürzt ... PLAY RECAP ***************************************************************************************** switch1 : ok=2 changed=0 unreachable=0 failed=0
Der erste Test war erfolgreich, alle weiteren Beispiele kommen in kleineren Beiträgen.
Viel Spaß 🙂
Wie ist es den mögliche mehre Switche wo verschiedene Logins haben zu Automatisieren mit diesem Script.
So das ich von mehren Switchen die Konfiguration sichern kann am besten mit Datum.
Hallo Joachim,
in dem Inventory kannst du Parameter mitgeben die nur für einen Host gelten sollen.
Beispiel:
hosts:
switch2:
ansible_host: 192.168.1.45
ansible_user: other_admin
ansible_ssh_pass: other_admin_pass
Gruß
Max
Danke für deine Hilfe ich kann nun mehre Switche aulesen und die Konfig sichern.
Das Problem was ich habe, ich möchte nun meine Switche automatisieren.
Das heisst ich steck den Switch an einen spezielles Vlan an und er muss sich die Konfig ziehen,
IP ziehen,
Tacacs einrichten
SSH einrichten
daas wäre doch mit deinem Script möglich oder.
Beste Grüße
Joachim