Playbook ohne relativen Pfad zu Vars

8

Ich hatte bereits ein paar Spielbücher, also fing ich an, sie im Spielbuchverzeichnis zu organisieren . Es muss relative Pfade zu VAR-Dateien geben.

Aktuelles Spielbuch:

---
- hosts:  aws_instance.jenkins-agents
  user:   ec2-user
  vars_files:
    - ../../../vars/main.yaml
    - ../../../vars/vault.yaml
  ...

Gibt es eine Möglichkeit, die dir-Struktur beizubehalten, aber die Lochness-Familie ( ../../../) zu vermeiden ?

Ich weiß für Rollen Sie können den Pfad zu ihnen angeben, aber ich habe für vars_files nichts Ähnliches gefunden

Projektbedingungen:

  1. Wir müssen die Playbooks vom Stamm des Projekts aus ausführen
  2. Sowohl vars als auch playbooks dir befinden sich im Stammverzeichnis des Projekts
  3. Dieses Projekt verfügt nicht über statisches Inventar / Hosts, wird jedoch im laufenden Betrieb generiert, wenn Sie ein Playbook ausführen
Mailo Světel
quelle
1
Vielleicht können Sie eine Variable für Ihren relativen Teil verwenden ../../../vars?
Tensibai

Antworten:

6

Sie werden feststellen, dass die offiziellen Empfehlungen für das Verzeichnislayout alle Playbooks auf die Stammebene stellen. Dies ist beabsichtigt, da Ansible andere Schemata nicht gut handhabt.

Sie können Playbooks wie begonnen in ein Unterverzeichnis einfügen. Dies erfordert jedoch (wie Sie bereits festgestellt haben) die Verwendung relativer Pfade von den Playbooks zu anderen von ihnen verwendeten Ressourcen. Ansible verwendet den Playbook-Pfad, um die Suche zu starten. So wird es geschrieben. Zum größten Teil ist dies genau das, womit Sie sich befassen müssen, wenn Sie sich entscheiden, dorthin zu ziehen, wo Playbooks leben.

Sie scheinen jedoch mehr Verschachtelung zu haben, als Sie sollten:

---
- hosts:  aws_instance.jenkins-agents
  user:   ec2-user
  vars_files:
    - ../../../vars/main.yaml
    - ../../../vars/vault.yaml
  ...

Warum navigieren Sie in drei Verzeichnissen? Ich würde ein Layout erwarten, das dem offiziellen ähnelt, aber einen Unterordner für Playbooks enthält. dann würden Sie mit nur enden

---
- hosts:  aws_instance.jenkins-agents
  user:   ec2-user
  vars_files:
    - ../vars/main.yaml
    - ../vars/vault.yaml
  ...

Das ist eine viel kleinere Änderung.


Zweitens ist es ziemlich selten, dass Sie tatsächlich verwenden möchten vars_files. Die meisten in Ansible verwendeten Variablen variieren entweder je nach Host (und sollten daher in group_vars/ host_varsim Projektstamm gespeichert werden) oder sind rollenspezifisch (und sollten daher in vars/ defaultsim Rollenverzeichnis gespeichert werden). Einige Dokumentationslinks:

Persönlich denke ich, dass es am besten ist, so wenig wie möglich in Ihren Spielbüchern zu haben, aber alles an Rollen zu delegieren. Hier ist ein Beispiel für das gesamte Spielbuch in Ihrem Setup:

- hosts: aws_instance.jenkins-agents
  roles:
    - ../roles/jenkins_agent

Dies gibt Ihnen viel mehr Flexibilität bei der Wiederverwendung.

Wenn Sie keine relativen Pfade für Rollen verwenden möchten, können Sie diese im Stammverzeichnis überschreiben, roles_pathin ansible.cfgdem Sie Ihre Ansible-Befehle ausführen.

Xiong Chiamiov
quelle
2

Da ich die Antwort von 030 noch nicht kommentieren kann (habe gerade ein Konto eröffnet), werde ich hier antworten.

Gruppen-Vars-Verzeichnisse sind relativ zum Ansible-Pfad.

Sie müssen Ansible nicht über / etc / ansible ausführen. Sie können es von ~ / .hidden / directory / stuff ausführen, wenn Sie möchten. Stellen Sie einfach sicher, dass Sie eine Verzeichnisstruktur beibehalten. Dh:

/pipeline/   # ansible playbooks are here
/pipeline/roles
/pipeline/group_vars

Dann können Sie so etwas ausführen

cd /pipeline
ansible-playbook deploy_app.yml

Hiermit werden Gruppenvariablen aus dem Ordner pipeline / group_vars gelesen. Es ist besser, zuerst in Ihren ansible-Stammordner zu cd, da er nach Pfaden aus dem aktuellen Ordner sucht, in dem Sie sich befinden, wenn er sie nicht am Standardspeicherort (/ etc / ansible) findet, sodass Sie Ihre ansible.cfg in / ablegen können Pipeline, ohne andere Befehlszeilenargumente angeben zu müssen. Optional können Sie auch bestimmte Pfade in ansible.cfg definieren.

Sie können noch einen Schritt weiter gehen und separate Gruppenvariablen für jede Umgebung / jeden Standort / etc einrichten:

/pipeline/prod/group_vars/all.yml
/pipeline/dev/group_vars/all.yml

Führen Sie die folgenden Schritte mit include-vars aus.

ansible-playbook deploy_app.yml -i prod

Maplebird
quelle
Ich würde empfehlen, die Variablen nach Gruppen zu sortieren. Wenn Sie Ihre Inventare in ein Unterverzeichnis stellen, sollten Sie einen Symlink zu group_vars und hosts_vars in das Inventar-Unterverzeichnis einfügen.
Jiri Klouda
1

Um solche Probleme zu vermeiden, gibt es in Ansible Hosts und Gruppen .

/etc/ansible/group_vars/raleigh # can optionally end in '.yml', '.yaml', or '.json'
/etc/ansible/group_vars/webservers
/etc/ansible/host_vars/foosball
030
quelle
Dies beantwortet meine Frage nicht, aber es ist eine interessante Idee, die Werte pro Gruppe zu haben. Die Variablen, die wir haben, beziehen sich hauptsächlich auf bestimmte Gruppen. Nur die /etcVariante würde bei uns nicht funktionieren. Ich hoffe, dass es sie vom Projekt abholen kann.
Mailo Světel
Es muss sich nicht im Ordner etc befinden. Wenn sich die Hosts und Gruppen-Vars-Verzeichnisse im ansible-Verzeichnis befinden, funktioniert es
030