Wie installiere ich Ansible Galaxy-Rollen automatisch?

129

Alle meine Ansible-Playbooks / -Rollen werden in mein Git-Repo eingecheckt.

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

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, dass sie entweder zusammen mit dem Rest meines Ansible-Codes in mein Git-Repo eingecheckt werden oder dass sie automatisch identifiziert und heruntergeladen werden, wenn ich Ansible auf einem neuen Computer ausführe.

pdeva
quelle
galaxy.ansible.com/docs/using/index.html Hier finden Sie alles, was Sie zur Verwendung von ansible-galaxy benötigen. Es ist ein gut gemachtes Dokument! Auch wenn Sie Anfänger sind :)
Ayra
@pdeva Könnten Sie eine der folgenden gültigen Antworten akzeptieren?
GG.

Antworten:

148

Sie sollten eine requirements.ymlDatei für diesen Anwendungsfall verwenden. Beschreiben Sie die von Ihnen benötigten Rollen mithilfe einer Vielzahl von 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 installieren Sie sie:

ansible-galaxy install -r requirements.yml

Hier ist ein funktionierendes Beispiel (Installation von OpenDaylight mit Ansible als Vagrant-Provisioner). Weitere Informationen finden Sie in den entsprechenden Ansible-Dokumenten .

dfarrell07
quelle
Siehe auch @Kieran Andrews Antwort unten. Es erweitert dieses.
Marco Ferrari
1
Dabei werden die Rollenabhängigkeiten eines Playbooks nicht automatisch installiert, sondern explizit eine Liste von Abhängigkeiten installiert, die von dem Benutzer, der das Playbook erstellt hat, manuell aufgelistet wurden.
Neil
53

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

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

Zum Beispiel (require.yml):

- src: yatesr.timezone

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

Wenn Sie es dann 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 
Kieran Andrews
quelle
1
Gerade getestet, zeigt es eine Meldung an, dass Rollen bereits heruntergeladen wurden, kein Fehler. Version2.2.1
Igonato
Wenn das Playbook die von Ihnen installierten Galaxienrollen verwendet, werden sie beim ersten Aufruf des Playbooks nicht ausgeführt, da ihre Anwesenheit vor dem Herunterladen überprüft wird. Wenn Sie das Playbook ein zweites Mal aufrufen, werden die neu installierten Rollen übernommen.
Ben
Ich habe aktualisiert, wie ich es jetzt gemacht habe, mit einem Wrapper-Skript, um Befehle zu reduzieren.
Kieran Andrews
19

Ich stelle oft fest, dass ich ein Java JDK installiere. Die Verwendung einer Rolle erleichtert diese Berührung. Ich habe verschiedene Möglichkeiten ausprobiert (einschließlich vieler Git-Module und Submodule ... Ich muss mehrere Git-Systeme für die Arbeit verwenden und alles wird hässlich). 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 Datei 'require.yml':

- 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-role.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 Spielbuch aus, dann führe ich meine Rollen in jedem Spielbuch normal aus. Für mich besteht das Geheimnis darin, sicherzustellen, dass es von git ignoriert wird, damit ich die Rollen nicht versehentlich einchecke. Da ich den Ordner jedes Mal lösche, stelle ich sicher, dass ich keine Fehler erzwingen oder ignorieren muss.

Staylorx
quelle
Es schlägt mit "Rolle nicht gefunden" fehl, bevor Sie den lokalen Befehl ausführen.
Daniel Andrei Mincă
1
@ Mincă Daniel Andrei Sie müssen dynamische Weise verwenden, ex include_role. Überprüfen Sie dies
user1686407
4

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, zgit clone ... --recursive

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

Außerdem müssen Sie sich nicht zusätzlich darum kümmern, Galaxienrollen in Ihrer Liste auf die schwarze Liste .gitignorezu setzen, um zu verhindern, dass deren Code in Ihr Repository übernommen wird.

Udondan
quelle
5
Dies ist meiner Meinung nach eine schlechte Praxis. Es ist normalerweise einfacher, Tools für das Abhängigkeitsmanagement zu verwenden, als SCM-Repos zusammenzukleben, insbesondere wenn es sich um Git-Submodule für SCM handelt.
David Resnick
1
Einverstanden. Tatsächlich benutze ich das nicht mehr. Trotzdem ist es ein gültiger Ansatz, da die Ansible-Galaxie alles andere als perfekt ist. Galaxy sucht nicht nach Updates, selbst wenn eine Version in Ihrer Anforderungsdatei gestoßen ist. Wenn Sie sie zwingen, alle Rollen mit dem undokumentierten --forceFlag erneut herunterzuladen , wird nicht angezeigt, ob oder was sich tatsächlich geändert hat. Es ist eine Black Box, die Sie nur steuern können, wenn Sie die heruntergeladenen Galaxienrollen in SCM behalten. Aus anderen Gründen ist das trotzdem eine gute Idee. Beim Ziehen von Submodulen sehen Sie zumindest, welche Rollen sich geändert haben.
Udondan
Übrigens, alle Probleme, die Submodule haben, AFAIK sind in dieser Situation vernachlässigbar, weil sie mit der Änderung ihres Inhalts zusammenhängen.
Nach
4

Sie können eine Ansible-Rolle verwenden, um die erforderlichen Rollen mithilfe des Befehlsmoduls zu installieren .

Hier ist ein sehr einfaches Beispiel, das ausgeführt wird ansible-galaxy install:

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

Das ansible_roles_listkann als Variable oder als Rollenparameter angegeben werden.

Wenn Sie dies in einer Rolle tun, muss es vorher angewendet werden allen anderen Rollen, die Sie damit installieren möchten, in einem separaten Playbook . Dies liegt daran, dass Ansible prüft, ob alle Rollen verfügbar sind, bevor das Playbook ausgeführt wird, auf das Sie verweisen.

Marco Ferrari
quelle
Ei und Huhn :)
Bazeusz
2

Zu diesem Zeitpunkt gibt es meines Wissens keine automatische Möglichkeit, Rollen zur Laufzeit herunterzuladen. Am besten binden Sie sie entweder in Ihr eigenes Repo ein oder verfügen über eine ordnungsgemäße Dokumentation, in der alle Anforderungen aufgeführt sind. Sie können sogar ein Playbook vor dem Flug erstellen, in dem Ihre Rollen installiert sind. :) :)

Mxx
quelle
3
Sie können hierfür eine Datei require.txt verwenden. Siehe: docs.ansible.com/…
toast38coza
0

Hier sind meine Anforderungen an die Rolle und werden in install.yml verwendet

main.yml

 # tasks file for MY_ROLE
- name: Install requirements
  local_action: command ansible-galaxy install -r {{ role_path }}/requirements.yml -p /etc/ansible/roles

- include_tasks: install.yml 
.  
├── playbook.yml  
├── inventory  
├── roles  
│    └── My_Role   
│        ├── tasks  
│        │   └── main.yml  
│        │   └── install.yml  
│        └── requirements.yml
TJVerne
quelle