====== Ansible ======
===== 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
==== Ohne Inventory und zusätzliche Dateien ====
Beachte das Komma nach dem Hostnamen. Es ist wichtig, da es Ansible signalisiert, dass dies eine Liste von Hosts ist, auch wenn es nur einer ist. Mit dem Schalter ''-e'' werden extra Variablen mit übergeben.
ansible-playbook -i 'servername.example.com,' -e "ansible_user=admin ansible_password=secretpass" playbook.yml
==== 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