Ansible – Das Modul yum_repository

Das Ansible Modul yum_repositoryist 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.

4 Gedanken zu „Ansible – Das Modul yum_repository

  1. tomboy

    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?

    Antworten
    1. Jörg Kastning Beitragsautor

      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

      Antworten
  2. Alex

    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.

    Antworten
    1. Tronde

      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?

      Antworten

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert