=====Mit der Ansible Tower CLI das Tower Inventory pflegen===== **Aufgabe:** In einer Excel Liste stehen alle Server der Umgebung, diese Server sollen nun per Skript gepflegt werden. Eine Möglichkeit ist auch die Server aus der Password Datei der Umgebung auszulesen und zu importieren, allerdings fehlen dann die Beschreibungen der Maschinen, siehe dazu => [[python:python_read_keepass_file|Keepass Datei mit Python auslesen um Ansible Konfiguration zu erzeugen]] Die Ansible Tower Umgebung läßt sich aber auch über ein REST Interface konfigurieren, am einfachsten über das Kommando Zielen Tool "awx". ---- ==== Ansible Tower Cli installieren (Redhat Linux 7) ==== Um die RestAPI von Tower für das Skripting auch per Console zu verwenden, ist das CLI hilfreich. siehe => https://docs.ansible.com/ansible-tower/latest/html/towercli/usage.html#installation # als root yum-config-manager --add-repo https://releases.ansible.com/ansible-tower/cli/ansible-tower-cli-centos7.repo # install yum install ansible-tower-cli Erster Test mit: awx --conf.host https://10.10.10.10 --conf.username admin --conf.password Secret1 --conf.insecure inventory list ---- ==== Login to Tower ==== Um nicht jedesmal neu das Passwort hinterlegen zu müssen kann auch ein Personal Access Tocken erzeugt werden. export TOWER_HOST=https://awx.example.org $(TOWER_USERNAME=admin TOWER_PASSWORD=secret1 awx login -f human --conf.insecure ) awx config ==Problem --conf.insecure == Wurde nur ein SelfSign Zertifikat in Tower hinterlegt muss mit "--conf.insecure" der Python Check bzgl. dem Zertifikat abgeschaltet werden, sonst erhält man diese Fehlermeldung: HTTPSConnectionPool(host='127.0.0.1', port=443): Max retries exceeded with url: /api/ (Caused by SSLError(SSLError(1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:877)'),)) === Testen === Z.B. Inventory abfragen: awx inventory list --conf.insecure ---- ==== Hosts verwalten ==== Die REST Api von Tower funktoiniert leider meist über die ID's der verwendeten Elemente. Um einen Host zu pflegen muss daher zuvor die ID des Hosts und die ID des Inventory bekannt sein. Dazu kann direkt die Tower URL Verwendet werden wie https://localhost/#/inventories/inventory/4/hosts/edit/12, darau läßt sich erkennen das wir im Inventory 4 den Server 12 bearbieten. Um jetzt aber aus einer Liste von Servernamen und Beschreibungen einen Liste von Befehlen zu erzeugen um diese Beschreibung anzupassen benötigen wir zuvor die Server ID in Ansbile. Über den Namen können wir suchen. === Host Info filtern=== Um jetzt aber aus einer Liste von Servernamen und Beschreibungen einen Liste von Befehlen zu erzeugen um diese Beschreibung anzupassen benötigen wir zuvor die Server ID in Ansible. Über den Namen können wir suchen: awx hosts list --name apex01 -f human --conf.insecure id name == ======== 12 apex01 awx hosts list --name apex01 -f human --filter id --conf.insecure id == 12 awx hosts list --name apex01 -f human --filter inventory --conf.insecure inventory ========= 4 Damit kennen wir schon mal die ID 12 für den Host und 4 für das Inventory. Nun alle Server aus dem Inventory 4: awx hosts list -f human --filter name,id,inventory --inventory 4 --all --conf.insecure name id inventory ========= == ========= apex01 12 4 ansible01 13 4 gpirac01 14 4 gpirac02 15 4 ... ---- ==== Eine Host ändern ==== Da wir nun die Server ID 12 für den Host und 4 für das Inventory kennen können wir den Host anpassen. Kommentar hinzufügen: awx hosts modify --conf.insecure --inventory 4 --description "ENTW APEX" 12 In allen Servers in Inventory 4 die Host Vars zurücksetzen: ALL_IDS=`awx hosts list -f human --filter id --inventory 4 --all --conf.insecure | grep -o '[[:digit:]]*'` for ID in $ALL_IDS do echo Unset Host Vars for ID $ID awx hosts modify --conf.insecure --inventory 4 --variables '{}' $ID done (Hintergrund: Inital mit Root Passwort importiert, nach dem Einrichten des Ansible Users diese nun wieder löschen!) ---- ==== Eine Host anlegen ===== Eine Host Manuell mit Beschreibung anlegen: awx hosts create [-h] --name TEXT [--description TEXT] --inventory ID [--enabled BOOLEAN] [--instance_id TEXT] [--variables JSON/YAML ] Bespiel: awx host create --conf.insecure --name gpiRac02 --inventory 5 --description "Rac Dev Host" --variables '{ "ansible_connection":"ssh","ansible_ssh_user":"root","insible_ssh_pass":"mysecret1"}' **Problem: "awx hosts create: argument --variables is not valid JSON or YAML"** **Lösung auf die führenden "'" und abschließenden "'" Hochkomma achten!** ---- ==== Eine Host wieder löschen ==== usage: awx hosts delete [-h] id # welche ID awx hosts list -f human --name apex01 --filter name,id,inventory --all --conf.insecure # Löschen name id inventory ======== == ========= apex01 36 4 awx hosts delete 36 --conf.insecure === Mehrere Hosts auf einmal löschen === Skript mit den Servernamen anlegen: #! /bin/sh # Remove a list of servers from tower # # create server list SERVER_LIST=("gpi11" "gpi112" "gpi113" "gpi114" "gpi115" "gpi116" "gpi117" "gpi118" "gpi119" ) echo To remove this List of Servers from the inventory please enter YES echo ${SERVER_LIST[@]} read YES_NO_ANSWER if [ ! -n "${YES_NO_ANSWER}" ]; then YES_NO_ANSWER=NO fi if [ "${YES_NO_ANSWER}" == 'YES' ]; then for i in ${SERVER_LIST[*]}; do echo Get ID for Server $i for s in `awx hosts list -f human --name $i --filter id --all --conf.insecure | grep -E '[[:digit:]]+' ` ; do echo ID for Server $i is $s echo Remove $i from all inventories awx hosts delete $s --conf.insecure echo ========================== done done else echo Do nothing fi ---- ==== Quellen ==== Web: * https://medium.com/@claudio.domingos/ansible-awx-from-scratch-to-rest-api-part-3-of-8-3adcf539031f Doku: * https://docs.ansible.com/ansible-tower/latest/html/towercli/examples.html