wake-up-neo.net

Wie installiere ich Ansible Galaxy-Rollen automatisch?

Alle meine Ansible Playbooks/Rollen sind in meinem Git Repo eingecheckt.

Für Ansible Galaxy-Rollen muss ich sie jedoch auf jedem Computer, auf dem ich Ansible ausführen möchte, explizit einzeln herunterladen.

Es ist sogar schwierig, im Voraus genau zu wissen, welche Ansible Galaxy-Rollen benötigt werden, bis sich Ansible zur Laufzeit über eine fehlende Rolle beschwert.

Wie soll man die Rollenabhängigkeiten von Ansible Galaxy verwalten? Ich möchte sie entweder zusammen mit dem Rest meines Ansible-Codes in mein Git-Repo einchecken lassen oder sie automatisch identifizieren und herunterladen lassen, wenn ich Ansible auf einem neuen Computer ausführe.

103
pdeva

Sie sollten ein requirements.yml Datei für diesen Anwendungsfall. Beschreiben Sie die von Ihnen benötigten Rollen mithilfe verschiedener Installationsmethoden:

# Install a role from the Ansible Galaxy
- src: dfarrell07.opendaylight

# Install a role from GitHub
- name: opendaylight
  src: https://github.com/dfarrell07/ansible-opendaylight

# Install a role from a specific git branch
- name: opendaylight
  src: https://github.com/dfarrell07/ansible-opendaylight
  version: Origin/master

# Install a role at a specific tag from GitHub
- name: opendaylight
  src: https://github.com/dfarrell07/ansible-opendaylight
  version: 1.0.0

# Install a role at a specific commit from GitHub
- name: opendaylight
  src: https://github.com/dfarrell07/ansible-opendaylight
  version: <commit hash>

Dann installiere sie:

ansible-galaxy install -r requirements.yml

Hier ist ein Arbeitsbeispiel (Installieren von OpenDaylight mit Ansible als Vagrant-Provisioner). Weitere Informationen finden Sie in den relevanten Ansible-Dokumenten .

129
dfarrell07

Wie vorgeschlagen, können Sie für diesen Bedarf ansible Galaxie verwenden.

Ansible verfügt über eine Funktion, mit der Sie eine requirements.yml - Datei erstellen können, in der alle Ihre Rollen aufgelistet sind. Das können Sie hier herausfinden: http://docs.ansible.com/ansible/latest/galaxy.html#installing-multiple-roles-from-a-file

Zum Beispiel (requirements.yml):

- src: yatesr.timezone

Anschließend führen Sie ansible-galaxy install -r requirements.yml Für diese Datei aus, um alle dort aufgeführten Rollen herunterzuladen.

Wenn Sie es weiter automatisieren möchten, können Sie ein einfaches Shell-Skript erstellen, das die beiden Befehle ausführt.

Zum Beispiel (ansible.sh):

./ansible.sh

ansible-galaxy install -r requirements.yml
ansible-playbook playbook.yml -i inventory 
44
Kieran Andrews

Ich finde mich oft dabei, ein Java JDK zu installieren. Die Verwendung einer Rolle erleichtert diese Berührung. Ich habe verschiedene Möglichkeiten ausprobiert (einschließlich vieler .gitmodules und submodules ... muss ich Verwenden Sie mehrere Git-Systeme für die Arbeit und alles, was hässlich wird.) Meine größte Anforderung ist, dass ich keinen Rollencode in mein Playbook-Projekt einchecke, meistens, damit ich alles an einem Ort aufbewahren kann.

Der Inhalt meiner 'requirements.yml' Datei:

- src: https://github.com/staylorx/ansible-role-wls-prep.git
  version: master
  name: staylorx.wls-prep

- src: https://my-work-git-extravaganza.com
  version: 2.x
  name: coolplace.niftyrole

#From Ansible Galaxy
- src: staylorx.Oracle-jdk

Ich führe ein separates Playbook aus, install-rollers.yml:

---

- hosts: localhost

  tasks:
    - file:
        path:  roles
        state: absent

    - local_action:
        command ansible-galaxy install -r requirements.yml --roles-path roles

    - lineinfile:
        dest:   .gitignore
        regexp: '^\/roles$'
        line:   '/roles'
        state:  present

Ich führe dieses erste Playbook aus, dann führe ich meine Rollen in einem beliebigen Playbook normal aus. Für mich besteht das Geheimnis darin, sicherzustellen, dass es von git ignoriert wird, damit ich nicht versehentlich die Rollen einchecke. Da ich den Ordner jedes Mal lösche, muss ich sicherstellen, dass keine Fehler erzwungen oder ignoriert werden.

17
staylorx

Eine andere Lösung ist die Verwendung von Git-Submodulen. Immerhin ist Ansible Galaxy nur ein Verzeichnis von Github-Repositories ...

Ich benutze diesen Befehl, um automatisch eine Galaxy-Rolle als Submodul hinzuzufügen:

ansible-galaxy info <package> | grep -A 1 github_repo | tr '\n' ' ' | sed -e "s/.*github_repo: \([^[:space:]]*\)[^\w]*github_user: \([^[:space:]]*\)[[:space:]]*/git submodule add git:\/\/github.com\/\2\/\1.git roles\/\2.\1/g" | sh

Übernehmen Sie die Änderungen dann in Ihr Git-Repo. Wenn Sie Ihr Repo in Zukunft klonen, stellen Sie sicher, dass Sie es mit Submodulen klonen, z. git clone ... --recursive

Dies hat den Vorteil, dass ein Git-Submodul immer auf eine bestimmte Version verweist (Git-Commit-Hash). Dadurch wird verhindert, dass Sie nicht getestete Updates in Ihrer Produktivumgebung ausführen. Eine neue Version einer Galaxy-Rolle kann Fehler aufweisen oder ganz anders funktionieren als zuvor. Mit einem Git-Modul entscheiden Sie, ob und wann Sie eine Rolle auf die neue Version aktualisieren.

Außerdem müssen Sie sich nicht zusätzlich um das Auflisten von Galaxienrollen auf der schwarzen Liste in Ihrem .gitignore, um zu verhindern, dass ihr Code in Ihr Repository geschrieben wird.

4
udondan

Zum gegenwärtigen Zeitpunkt gibt es meines Wissens keine automatische Möglichkeit, Rollen zur Laufzeit herunterzuladen. Ihre beste Wette ist, sie entweder in Ihr eigenes Repo zu verpflichten oder über eine ordnungsgemäße Dokumentation zu verfügen, in der alle Anforderungen aufgeführt sind. Sie können sogar ein vor dem Flug erstelltes Playbook erstellen, in dem Ihre Rollen installiert sind. :)

3
Mxx

Sie können eine Ansible-Rolle verwenden, um andere erforderliche Rollen mit dem Befehlsmodul zu installieren.

Hier ist ein sehr einfaches Beispiel, das ansible-galaxy install :

- name: Install roles from Ansible Galaxy
  command: ansible-galaxy install {{ item.item }}
  with_items:
    - "{{ ansible_roles_list }}"

Das ansible_roles_list kann als Variable oder als Rollenparameter angegeben werden.

Ich habe dafür eine Rolle implementiert, damit Sie Ansible auch zum Einrichten (eines Teils) der Steuerungsmaschine verwenden können: https://galaxy.ansible.com/ferrarimarco/install-roles/ .

Diese Rolle muss angewendet werden , bevor andere Rollen, die Sie mit ihr installieren möchten, in einem separaten Playbook. Dies liegt daran, dass Ansible überprüft, ob alle Rollen verfügbar sind, bevor das Playbook ausgeführt wird, auf das Sie verweisen.

3
Marco Ferrari