Zeile 1: |
Zeile 1: |
− | Ansible ist ein so genanntes Orchestrierungswerkzeug, mit dem man Computer automatisch konfigurieren kann. Dazu verwendet Ansible so genannte Playbooks. | + | [https://docs.ansible.com/ansible/latest/index.html Ansible] ist ein so genanntes Orchestrierungswerkzeug, mit dem man Computer automatisch konfigurieren kann. Dazu verwendet Ansible so genannte Playbooks. |
| | | |
| | | |
| | | |
− | Siehe
| |
− | * [https://www.informatik-aktuell.de/entwicklung/programmiersprachen/einfuehrung-in-ansible.html Einführung in Ansible]
| |
| | | |
| == Vorbereitung == | | == Vorbereitung == |
Zeile 11: |
Zeile 9: |
| | | |
| * Installation eines Minimalsystems | | * Installation eines Minimalsystems |
| + | * Einrichten eines Benutzers speziell für Ansible (Beispiel, das bereits Ansible nutzt, siehe unten) |
| * Installation der Pakete | | * Installation der Pakete |
| ** openssh-server | | ** openssh-server |
| ** sudo | | ** sudo |
− | *** Der sudo-Gruppe das passwortlose Ausführen erlauben (siehe [[Sudo]]) | + | *** Der ansible-Benutzer das passwortlose Ausführen erlauben (siehe [[Sudo]]) |
| ** python3 | | ** python3 |
− | *** Verlinke python3: | + | *** Verlinke python3: <code>sudo ln -s /usr/bin/python3 /usr/bin/python</code> oder |
− | sudo ln -s /usr/bin/python3 /usr/bin/python
| + | *** Deklarieren der entsprechenden Variable für die Rechnergruppe. Beispiel einer inventory.yaml: |
| + | all: |
| + | hosts: |
| + | blacky: |
| + | ansible_host: blacky.fritz.box |
| + | children: |
| + | home: |
| + | hosts: |
| + | blacky: |
| + | python3: # All hosts that only have python3 |
| + | hosts: |
| + | blacky: |
| + | vars: |
| + | ansible_python_interpreter: /usr/bin/python3 |
| + | |
| + | ==== Einrichten eines Ansible-Benutzers ==== |
| + | |
| + | Das folgende Skript <code>setupAnsible.yaml</code> geht davon aus, dass auf dem Zielrechner ein frisches [[Ubuntu]] 18.04 installiert ist, auf das man sich mit [[SSH]] als normaler Nutzer einwählen kann. Dieser Nutzer ist auch in der sudo-Gruppe und kann mittels Eingabe eines sudo-Passworts root-Rechte bekommen. |
| + | |
| + | <pre> |
| + | # Call this file with |
| + | # ansible-playbook -l YOURRECHNER -K -v setupAnsible.yaml |
| + | |
| + | - hosts: |
| + | - all |
| + | |
| + | tasks: |
| + | - name: create group ansible |
| + | become: true |
| + | group: |
| + | name: ansible |
| + | gid: 425 |
| + | |
| + | - name: create user ansible |
| + | become: true |
| + | user: |
| + | name: ansible |
| + | group: ansible |
| + | uid: 425 |
| + | password: "$6$rXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXh." |
| + | # encrypted password created with |
| + | # mkpasswd --method=sha-512 |
| + | # You can make it really complicated, since you do not need it again. |
| + | state: present |
| + | |
| + | - name: add user ansible to sudoers with no passwd |
| + | become: true |
| + | copy: |
| + | src: etc/sudoers.d/ansible |
| + | dest: /etc/sudoers.d/ansible |
| + | mode: "0440" |
| + | validate: "visudo -cf %s" |
| + | |
| + | - name: set my authorized key for user ansible |
| + | become: true |
| + | authorized_key: |
| + | key: "{{ lookup('file', lookup('env','HOME') + '/.ssh/id_rsa.pub') }}" |
| + | user: ansible |
| + | state: present |
| + | </pre> |
| + | |
| + | Nach Ausführung dieses Playbooks mittels |
| + | ansible-playbook -i inventory.yaml -l YOURRECHNER -K -v setupAnsible.yaml |
| + | |
| + | wird der Nutzer <code>ansible</code> in die <code>inventory.yaml</code> als Standard-Ansible-Nutzer eingetragen: |
| + | all: |
| + | hosts: |
| + | blacky: |
| + | ansible_host: blacky.fritz.box |
| + | '''ansible_ssh_user: ansible''' |
| | | |
| === Vorbereitung des Kontrollrechners === | | === Vorbereitung des Kontrollrechners === |
Zeile 23: |
Zeile 91: |
| sudo aptitude install ansible | | sudo aptitude install ansible |
| | | |
| + | == Nutzen von Ansible == |
| | | |
| + | === Konfiguration === |
| | | |
| + | Die Konfiguration kann durch verschiedene Dateien erfolgen, z.B.: |
| + | * ansible.cfg |
| + | * ~/.ansible.cfg |
| + | |
| + | Der Inhalt einer ansible.cfg könnte z.B. lauten: |
| + | |
| + | [defaults] |
| + | inventory=inventory.yaml |
| + | |
| + | === Inventory === |
| + | |
| + | Die Inventory-Datei wird in YAML geschrieben, z.B.: |
| + | all: |
| + | hosts: |
| + | blacky: |
| + | ansible_host: blacky.fritz.box |
| + | ansible_user: ansible |
| + | |
| + | In YAML werden die Zeilen mit Leerzeichen, nicht mit Tabs eingerückt. |
| + | |
| + | Siehe |
| + | * https://docs.ansible.com/ansible/latest/user_guide/intro_inventory.html |
| + | |
| + | === Einfache Kommandos === |
| + | ==== Ping-Test ==== |
| + | |
| + | ansible all -m ping |
| + | |
| + | ==== Ausführen eines Shell-Kommandos ==== |
| + | |
| + | Mit Ansible lässt sich auch jedes beliebige [[Shell]]-Kommando ausführen: |
| + | |
| + | ansible zielrechner -m command -a "whoami" |
| + | |
| + | Will man das Kommando als root ausführen, setzt man <code>--become</code> hinzu: |
| + | ansible pia2016 --become -m command -a "whoami" |
| + | |
| + | Das hier verwendete Modul command nutzt jedoch nicht die Shell-Erweiterungen. Dafür müsste man das Modul <code>shell</code> nennen. |
| + | |
| + | ==== Debug-Hilfe ==== |
| + | |
| + | Das Modul "Debug" kann Hilfsausgaben erzeugen. Beispiel: |
| + | ansible blacky -m debug -a <nowiki>'msg="{{ ansible_ssh_user }}"'</nowiki> |
| + | |
| + | === Playbooks === |
| + | |
| + | Mit Playbooks kann man automatisieren, welcher Rechner welchen Zustand erreichen soll. |
| + | |
| + | Dazu nutzt man Tasks in Form von Modulaufrufen (deklarative Ansible-Form von Befehlen), Rechnergruppen und Rollen. |
| + | |
| + | ==== Package-Updates ==== |
| + | |
| + | Folgender Auszug aus den Tasks eines Playbooks sollte das Paket-Updaten auf einem [[Debian]]- oder [[Ubuntu]]-System ermöglichen: |
| + | |
| + | - name: update and upgrade apt packages |
| + | become: true |
| + | apt: |
| + | name: "*" |
| + | state: latest |
| + | install_recommends: false |
| + | update_cache: true |
| + | |
| + | === Roles === |
| + | |
| + | Roles ist ein Konzept, um bestimmte Funktionalitäten zu bündeln; diese können dann auf verschiedenen Rechnern wiederverwendet werden. |
| + | |
| + | Mit ansible-galaxy können diese Rollen auch leicht an andere Benutzer weitergegeben werden. |
| + | |
| + | ==== Nginx Ansible Role ==== |
| + | |
| + | Die offizielle Rolle für den [[Nginx]]-Server nennt sich [https://galaxy.ansible.com/nginxinc/nginx nginxinc.nginx]. Sie lässt sich folgendermaßen installieren: |
| + | |
| + | ansible-galaxy install nginxinc.nginx |
| + | |
| + | Die Rolle lässt sich dann folgendermaßen ins Playbook integrieren: |
| + | <pre> |
| + | |
| + | - hosts: NGINXRECHNER |
| + | roles: |
| + | - role: galaxy/nginxinc.nginx |
| + | vars: |
| + | nginx_debug_output: true |
| + | nginx_install_from: os_repository |
| + | </pre> |
| + | |
| + | === Ansible und Container === |
| + | |
| + | Im Zusammenspiel mit podman bietet ansible-bender eine Möglichkeit Container-Images zu erstellen und zu betreiben. |
| + | |
| + | Auch das reine Ansible bietet im Zusammenspiel mit Docker vielfältige Möglichkeiten Docker-Container-Images zu erstellen und laufen zu lassen. Siehe |
| + | * https://tech.labs.oliverwyman.com/blog/2019/08/30/docker-without-dockerfiles/ |
| + | |
| + | === Ansible und Hetzner Cloud === |
| + | Siehe |
| + | * https://www.unixwitch.de/de/sysadmin/tools/hcloud-ansible |
| + | * https://community.hetzner.com/tutorials/howto-hcloud-ansible |
| + | |
| + | == Fehlerbehebung == |
| + | |
| + | Ansible hat Probleme, wenn die kontrollierende Maschine auf Python2 und die kontrollierte auf Python3 läuft. Das äußert sich z.B. mit folgender Warnung:<cite> |
| + | [WARNING]: Module invocation had junk after the JSON data: AttributeError("module 'platform' |
| + | has no attribute 'dist'") |
| + | </cite> |
| + | |
| + | Daher lässt man auf dem Zielrechner (hier: <code>TARGET</code>) auch Python2 laufen, indem man die <code>inventory.yaml</code> ändert: |
| + | |
| + | TARGET: |
| + | ansible_python_interpreter: "/usr/bin/python2" |
| + | |
| + | == Weiterführendes == |
| + | |
| + | Siehe |
| + | * [https://www.informatik-aktuell.de/entwicklung/programmiersprachen/einfuehrung-in-ansible.html Einführung in Ansible] |
| + | * [https://www.grund-wissen.de/linux/shell/ansible.html Aktualisieren von Knoten mit Hilfe von Ansible] |
| | | |
| ------- | | ------- |
| [[Category:Linux]] | | [[Category:Linux]] |