====== Ansible ====== apt list "*ansible*" ansible-doc/stable 2.7.7+dfsg-1 all ansible-lint/stable 4.1.0+dfsg.1-1 all ansible-tower-cli-doc/stable 3.3.0-1 all ansible-tower-cli/stable 3.3.0-1 all ansible/stable,now 2.7.7+dfsg-1 all [installiert] ===== System Einrichtung ===== Auf dem Ansible Kommando Rechner ist das Paket ''ansible'' sowie ''sshpass'' zu installieren. Da Ansible default SSH keys verwendet, aber bei der Ersteinrichtung zunächst den Nutzer pi verwendet und hier SSH Passwort Authentifizierung genutzt wird. apt install ansible sshpass Zuvor wurde ein Passwort Hash z.B. mit Python erzeugt. Wie das funktioniert, ist auf der [[:systemadmin|systemadmin]] Seite beschrieben. Dieser Hash enthält das verschleierte Passwort für den neuen zu erstellenden backup Benutzer. :!: Dieser Hash ist im Start-playbook enthalten, daher muss dieser Schritt i.d.R. nicht mehr ausgeführt werden. :!: Mit ''-k'' kann das Passwort für dem im Playbook angegebenen Remote Benutzer eingegeben werden. Diesen Benutzer verwenden wir nur für die erst Einrichtung. Konfigurations Ordner aus Sicherung in das neue Ansible Master System rüber kopieren. Im Start-playbook sollten alle Pfade und Dateien(z.B. ssh-key) zum Konfigurations-Ordner verweisen. === Ansible Ersteinrichtung für ein entferntes System === Folgenden Kommando nur wenn Ansible Ersteinrichtung für ein entferntes System durchgeführt werden soll. Start-playbook auf dem Ansible Master System ausführen für das iglu Remote-System: ansible-playbook -k -i /home/pi/xy/Konfiguration/ --limit iglu Start-playbook.yml oder besser die ''-k'' Option ans Ende setzen. ansible-playbook --limit iglu Start_playbook.yml -k === Ansible Ersteinrichtung === Die Angabe des Hostnamen kann weglassen werden wenn im playbook der hostname, z.B. localhost schon bei hosts: drin steht. Da das Playbook aber nicht nur auf dem Ansible Kommando Rechner ausgeführt werden soll sondern für jeden Host eingesetzt wird, steht bei hosts: all. Hier kann man beim Ausführen des Playbooks mit --limit dann angeben auf welchen Host es aktuell ausgeführt werden soll. ansible-playbook -k --limit iglu start_sshlogin.yml --- - hosts: all vars: devops_password: '$6$OfKLYEUGj4tcy$6KJS3UQARnmXqasJaIvWsS1pwUbrpQBvxbxJ55PryPPI604TgsS31lnhKo8' gather_facts: no remote_user: pi become: true tasks: - name: Gruppe backup erstellen group: name: backup gid: 7500 state: present - name: Nutzer tux erstellen user: name: tux uid: 2121 groups: adm, sudo, audio, video, plugdev, users, input, netdev, backup, pi shell: /bin/bash password: "{{ devops_password }}" - name: Nutzer backup hinzufügen zu sudoers copy: dest: "/etc/sudoers.d/backup" content: "backup ALL=(ALL) NOPASSWD: ALL" - name: SSH public Key hinzufügen authorized_key: user=backup key="{{ lookup('file', '/home/backup/.ssh/id_rsa.pub') }}" state=present Nach der Ausführung des ''Start_playbook.yml'' ist der neue Backup Nutzer angelegt. Als diesen kann man sich nun anmelden und der ''/home/pi/xy/Konfiguration/'' sollte zum neuen Ansible Kontroll-Nutzer **verschoben** werden. Neu: In das Verzeichnis ''/home/tux/Dokumente/Konfiguration/Ansible/'' wechseln. Hier das ''ansible-playbook'' Kommando für das gewünschte Playbook ausführen. Da hier die ansible.cfg liegt und diese automatisch genutzt wird, wenn man sich im selben Pfad befindet: ansible-playbook hauptkonfig.yml Alt: Ausserdem ist die ''ansible.cfg'' und das Inventory(hosts) nach ''/etc/ansible/'' zu **kopieren**. Es ist darauf zu achten, dass die Berechtigungen für ''/etc/ansible/'' nur für den neuen Ansible Kontroll-Nutzer lesend und maximal schreibend sind. ===== Ansible Einzeiler ===== Ohne gleich ein Playbook oder eine komplette Role zu erstellen, kann man ansible direkt ausführen und die entsprechenden Parameter übergeben. ==== Updates für Suse ==== ansible localhost -m zypper -a "update_cache=yes state=latest name='*'" --become -K ==== Updates für alle Debian Systeme ==== Alle Rechner im Netzwerk gleichzeitig mit Updates versorgen. Dafür braucht man kein extra Playbook schreiben, hier reicht auch ein Ad-Hoc Kommando. Hier wird das Ansible ''shell'' Modul aufgerufen um die bekannten Kommandos von der Bash zu nutzen: ansible all -m shell -a "sudo apt update && sudo apt autoremove && sudo apt upgrade -y" Im nächsten Aufruf wird das Ansible ''apt'' Modul verwendet, dies ist der von Ansible empfohlene Weg: ansible all -m apt -a "update_cache=yes upgrade=yes autoremove=yes cache_valid_time=86400" --become Anzeigen der SCSI Harddisk ID und der dazugehörigen Mountpunkte, dann ein grep (Filtern) nach einem bestimmten Mountpunkt. ansible all -i inventories/produktion/ -m shell -a "lsblk --output HCTL,PATH,MOUNTPOINT,PARTLABEL|grep -iC2 oraexp" ==== Nur auf einer Gruppe ==== Kommando nur auf den Rechnern in einer bestimmten Inventory-Datei ''testing'' ausführen. ansible all -i inventory-Lager/testing -a "/root/agentinstall.sh --uninstall --clean" --become Playbook für eine sub-Gruppe(hier die Gruppe: jboss) innerhalb einer Inventory-Datei ''produktion'' ausführen. ansible-playbook -i produktion -l jboss playbooks/add_icinga-agent.yml --ask-vault-pass ==== Reboot und Poweroff ==== Nur den Rechner iglu neu-starten: ansible iglu -a "/sbin/reboot" --become Alle Maschinen ausschalten. Achtung! Auch den Host von wo aus der Kommando ausgeführt wird, wenn in all enthalten: ansible all -a "/sbin/poweroff" --become ===== Ansible Playbooks ===== --- # Playbook für die Ersteinrichtung des Systems # Es wird ein neuer Haupt-Nutzer angelegt und die benötigte Standard-Software installiert. - hosts: all vars: tux_password: '$6$yad.Pht99YEu9zsl$peArU8hOYVo/xzAsyWiF2ANIw5pLmkfOqRXNVospQr661' # Um den Abbruch mit "ansible_hostname' is undefined" zu verhindern, muss gather_facts: yes gesetzt sein. # Oder man entfernt die Zeile komplett, denn "gather_facts: yes" müsste als Standard eingestellt sein. gather_facts: yes # Mit -k kann das Passwort für dem im Playbook angegebenen Remote Benutzer eingegeben werden. remote_user: pi become: true tasks: - name: Nutzer tux - erstellen user: name: tux uid: 1111 groups: adm, sudo, audio, video, plugdev, users, input, netdev, gpio, i2c, spi, pi shell: /bin/bash password: "{{ tux_password }}" - name: NFS-Freigabe mount Verzeichnis - erstelle Mount-Punkt file: path: /home/pi/NFSFreigabe state: directory owner: pi group: users mode: '0775' - name: Installation - Desktop Standard Pakete apt: name: "{{ item }}" update_cache: yes cache_valid_time: 86400 #Cache nur Updaten wenn älter als 1 Tag when: 'iglu' in inventory_hostname loop: - marble - pidgin - wesnoth - name: De-Installation - Nicht benötigte Pakete werden entfernt apt: name: "{{ item }}" state: absent loop: - scratch* - minecraft-pi - cups-client - realvnc-vnc-server - samba-common - cifs-utils* --- # Playbook für Icinga2 - Installation aller Monitoring Plugins # Einrichten des icinga Benutzers # Einfügen des SSH-Keys - hosts: monitoring become: yes tasks: - name: installiere benötigte Pakete zypper: name: ['bind','bind-utils'] state: latest disable_recommends: no notify: enable named when: (ansible_hostname != 'zcm' and ansible_hostname != 'pdx2') - name: Sicher stellen das group "icinga" existiert group: name: icinga gid: 600 state: present - name: Erstelle Icinga Benutzer block: - user: name: icinga state: present home: /usr/local/icinga comment: System Monitoring shell: /bin/bash uid: 900 group: icinga when: ansible_hostname == 'zcm' - name: Set authorized key taken from file authorized_key: user: icinga state: present key: "{{ 'ssh-rsa AAAAB3NzaC1yc2EAAAADNAHXGAQAQDixsxXlraHdDJq91k/0XOiXMhKVrx+dkFrjKyO+gulxXc+OA+PiDw3BzFG347c1aO5eM+8lwVOlrrNeSw1evryWVef9J4NOReMbgNUSUHU637263x/V+J++NNYBmWR9 icinga@moni2' }}" ===== Module ===== Mit copy Modul eine leer Datei erstellen, wenn noch nicht existent. - name: sicherstellen das Log-Dateien existieren copy: content: "" dest: /var/adm/log/dhcpdns_sync.lg force: no group: hw owner: ansible mode: 0664