Das Ansible Modul yum_repository
ist dazu geeignet, Repositories zu RPM-basierten Linux-Distributionen hinzuzufügen bzw. zu entfernen. Es findet z.B. in unserer Umgebung Anwendung, um Repositories von unserem lokalen Spiegelserver anzubinden. Der folgende Text gibt ein Beispiel zur Anwendung dieses Ansible-Moduls.
Auf meiner Spielwiese verwende ich folgende Konfiguration, um zwei Repositories hinzuzufügen.
Hinweis: Die folgende Konfiguration ist nicht zur Nachahmung empfohlen. Es handelt sich dabei um meine ersten Schritte mit Ansible. Es ist daher wahrscheinlich, dass die Konfiguration noch Fehler enthält, nicht optimiert ist und ein großes Verbesserungspotenzial besitzt. Die Nachahmung erfolgt ausdrücklich auf eigene Gefahr. Über Hinweise, wie man es besser machen kann, freue ich mich jederzeit.
Verzeichnisstruktur
Abgeleitet aus den „Best Practices“ von Ansible, verwende ich auf meiner Spielwiese folgende Verzeichnisstruktur:
ansible/ |-- group_vars | `-- e-stage # variables for group e-stage |-- hosts # inventory file |-- host_vars # for system specific variables |-- roles | |-- common # this hierarchy represents a "role" | | |-- defaults | | |-- files | | |-- handlers | | | `-- main.yml # handlers file | | |-- meta | | |-- tasks | | | `-- main.yml # tasks file can include smaller files if wanted | | `-- vars | `-- std-repos | |-- defaults | |-- files | |-- handlers | |-- meta | |-- tasks | |-- templates | `-- vars |-- set_repos.yml # playbook which sets the repos |-- site.yml # master playbook file `-- staging # inventory file for staging environment
Das Playbook
Das Playbook ist sehr kurz gehalten und gibt im Wesentlichen nur an, welche Hosts auf welche Rolle gemapped werden sollen.
# set_repos.yml --- - hosts: all roles: - std-repos
Das obige Playbook definiert, dass die Tasks aus der Datei roles/e-stage/tasks/main.yml
ausgeführt werden sollen, welche wie folgt aufgebaut ist:
--- - name: Add rhel-e-stage-repository yum_repository: name: "{{ repo_name1 }}" description: "{{ repo_description1 }}" baseurl: "{{ repo_baseurl1 }}" gpgcheck: yes gpgkey: file:///etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release - name: Add my-own-repository yum_repository: name: "{{ repo_name2 }}" description: "{{ repo_description2 }}" baseurl: "{{ rebo_baseurl2 }}" gpgcheck: no
GroupVars
Nun existieren im Staging-Bereich häufig noch weitere Stages. So gibt es oftmals eine T-, E- und I-Stage. Dabei ist jeder Stage ein eigenes Stage-Repository zugeordnet. Um die Systeme in den unterschiedlichen Stages mit den dazugehörigen Stage-Repositories zu versorgen, werden diese mit Hilfe der group_vars
den entsprechenden Gruppen zugewiesen.
Für die Server der Gruppe e-stage
wird in der Datei group_vars/e-stage
definiert:
# file: group_vars/e-stage repo_name1: rhel-e-stage repo_description1: Local RHEL-Repo for E-Stage repo_baseurl1: http://repo.example.com/rhel-e-stage/ repo_name2: own-e-stage repo_description2: Local OWN-Repo for E-Stage repo_baseurl2: http://repo.example.com/own-e-stage/
Nach diesem Beispiel können nun weitere Variablen unter group_vars
für andere Stages erstellt werden. Den Hosts in den entsprechenden Hostgruppen, werden auf diesem Wege die passenden Repositories hinzugefügt.
Kurze Frage. Ich habe mir überlegt mit ansible die PC’s der Familie zu warten (alles mittlerweile Ubuntu 16.04). Die sind aber nicht immer alle gleichzeitig Online (via VPN verbunden). Kann ich irgendwie ansible dazu bewegen, dass wenn ein PC Online geht automatisch und einmalig bestimmte scripte gestartet werden?
Hallo tomboy,
prinzipiell ist dies mit Ansible möglich. Siehe dazu den kurzen Abschnitt in der Dokumentation.
Die Frage ist jedoch, ob Ansible für diesen Zweck das am besten geeignete Werkzeug ist. Zumal die Skripte wie du sagst nur einmalig ausgeführt werden sollen.
Um deine Zielstellung zu erreichen, benötigst du in jedem Fall ein zentrales Repository, von dem aus die Rechner deiner Familie die Scripts abrufen können. Damit sie dies dann auch automatisch tun muss auf jedem Rechner ein Skript vorhanden sein, welches die „Pull-Aufgabe“ ausführt. Dieses Skript wäre dann z.B. in die Datei /etc/rc.local einzutragen. Dies kann man prinzipiell auch ohne Ansible lösen, in dem man die benötigten Skripte selbst schreibt. Ansible bietet hier meiner Ansicht nach keinen großen Vorteil.
Falls du keine Anforderungen hast, die den Ad-Hoc-Modus erforderlich machen, wäre für deinen Anwendungsfall vielleicht eher Puppet das bessere Werkzeug der Wahl. Bei Puppet gehört der Pull-Mechanismus zum Konzept und ist daher integraler Bestandteil der Architektur. Ich denke damit fährst du im Zweifel, als die Architektur von Ansible auf den Kopf zu stellen.
MfG
Jörg
Danke für die Info, bei mir funktioniert yum_repository leider nicht. Ich verstehe nicht wo das Problem liegt. Ich finde zwar in /etc/yum.repos/ gewünschter .repo, doch der Inhalt ist falsch.
Der sieht so aus als ob yum_repository sich selbst in diesen File copiert hat:
name: [name]
description: description
baseurl: link zu repo.
Hi,
welche Ansible-Version verwendest du denn und wie sehen deine tasks/main.yml und group_vars aus? Hast du vielleicht irgendwo Anführungszeichen oder Klammern vergessen?