Verwenden Sie die Variable nur, wenn sie in Ansible definiert ist

Verwenden Sie die Variable nur, wenn sie in Ansible definiert ist

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).

verwandte Informationen