Mein Kollege und ich verwenden Ansible, um eine Gruppe von Servern zu verwalten.
Wir verwenden die Datei .ansible.cfg in unseren lokalen Home-Verzeichnissen, um unsere lokalen Umgebungen einzurichten und unsere Playbooks in einem Git-Repository zu speichern.
Bei der Authentifizierung gegenüber Servern verwende ich Benutzer1 und er verwendet Benutzer2. 95 % unserer Server verfügen über diese Konten, aus historischen Gründen haben jedoch einige Server nur ein „Benutzer“-Konto.
Wir verwenden host_vars, um die Remote_User-Variable für die Minderheit der betreffenden Server festzulegen.
In unseren Playbooks verwenden wir jedoch im Allgemeinen „alle“, um festzulegen, welche Server wir erreichen möchten, und verwenden den Parameter --limit in der Befehlszeile, um genau anzugeben, welche Server das Update erhalten sollen. Unsere Serverfarm ist eine Ansammlung schlecht konstruierter Server, die online gehalten werden müssen, bis sie in einigen Jahren außer Dienst gestellt werden. Wir haben festgestellt, dass dieser Ansatz unseren Anforderungen am besten entspricht.
Unser Problem besteht darin, dass unser remote_user-Parameter in unserer .ansible.cfg-Datei festgelegt ist, wo er als Umgebungsvariable und nicht als Skriptvariable angezeigt wird.
Das heißt, wenn unsere Aufgabe enthält:
remote_user: "{{ remote_user }}"
Es funktioniert nur für Hosts, für die diese Variable definiert ist
Für die 95 % der Hosts, für die wir diese Variable nicht definieren, schlägt die Aufgabe fehl.
Gibt es eine Möglichkeit, die Variable nur zu verwenden, wenn sie definiert ist?
z.B
Wenn remote_user definiert ist, verwenden Sie es. Wenn nicht, verwenden Sie die in .ansible.cfg festgelegte Umgebungsvariable.
Hinweis: Ich weiß, dass ich Folgendes verwenden kann:
- name: Do something
remote_user: "{{ remote_user }}"
when: remote_user is defined
In einer Aufgabendefinition, aber das gilt nur für diese Aufgabe, und ich möchte nicht alle Aufgaben aktualisieren müssen
Was ich wirklich brauche, ist, dass diese Bedingung in der Hostdefinition verfügbar ist, also:
---
- hosts: all
remote_user: "{{ remote_user }}"
when: remote_user is defined
Aber das ist in Ansible illegal
Antwort1
Wie üblich finde ich die Antwort 5 Minuten, nachdem ich die Frage gepostet habe, nachdem ich 2 Stunden damit verbracht habe, sie hier zu stellen!
Es ist ganz einfach. Um einen anderen Remote-Benutzer für einzelne Systeme festzulegen, ohne Unmengen an Hacks auf vorhandene Playbooks anwenden zu müssen, fügen Sie einfach die Variable zum Host in Ihrem Inventar hinzu:
[web_servers]
server1 ansible_ssh_user=user
server2
In diesem Fall wird jedes Mal, wenn ein Spiel Server1 einschließt, „user“ als SSH-Benutzer verwendet. Für Server2 wird der Wert von remote_user aus Ihrer ansible.cfg-Datei verwendet (z. B. user1, user2 usw., abhängig von der lokalen Umgebung).