Ansible - Benutzererstellung, wenn die Serverklassenkriterien erfüllt sind

Ansible - Benutzererstellung, wenn die Serverklassenkriterien erfüllt sind

Ich bin ein neuer Ansible-Benutzer und wechsle von einer Sammlung von Shell-Skripten zu Ansible-Playbooks. Mein aktuelles Benutzerverwaltungssystem erlaubt das Hinzufügen eines Benutzers zu einem System nur, wenn diesem Benutzer Zugriff auf diese Serverklasse, diesen Standort und diese Umgebung gewährt wurde (oder wenn einer dieser Werte auf Platzhalter/beliebig eingestellt ist).

Die Serverklasse, der Standort und die Umgebung werden lokal auf dem Client-Server selbst in Form einer (nur vom Root-Server lesbaren/beschreibbaren) Datei gespeichert, die wie folgt aussieht:

LD_CLASS="app"
LD_LOC="dfw"
LD_ENV="prod"

Ich habe ein paar Beispiele gefunden, die dem ähneln, was ich möchte. Ich bin mir jedoch noch nicht sicher, wie ich die Variablen vom Ansible-Client abrufe und wie ich sicherstelle, dass alle drei Anforderungen an Klasse, Standort und Umgebung erfüllt sind, bevor ich den Benutzer hinzufüge. Ich stelle mir eine Variablendatei wie diese vor:

users:
 -name: user1
  uid: 60001
  gid: 60001
  class: app
  location: any
  env: dev
 -name: user2
  uid: 60002
  gid: 60002
  class: app
  location: dfw
  env: prod 

Mit einem Benutzermoduleintrag, der basierend auf den Variablen, die vom Ansible-Client gesammelt wurden, den ich konfiguriere, ungefähr so ​​aussieht (beachten Sie den Pseudocode, da ich nicht sicher bin, wie ich dies tatsächlich erreichen würde):

- user:
    name: '{{ item.name }}'
    state: '{ (If $LD_LOC matches location variable, or is set to any) & ($LD_ENV matches env variable, or is set to any) & ($LD_CLASS matches class variable, or is set to any) } present{% else %}absent{% endif %}'
    uid: '{{ item.uid }}'
   with_items: users

Ich würde mich lieber nicht auf Ansible-Rollen verlassen, sondern stattdessen die Klassen-, Standort- und Umgebungsdaten vom Ansible-Client selbst beziehen, zumindest teilweise, weil dies das System ist, das wir derzeit haben, und es uns hilft, problemlos auf Ansible umzusteigen und dabei einige vorhandene und vertraute Tools beizubehalten. Ist das, wonach ich suche, möglich?

Antwort1

Es gibt eine Funktion namensFakten vor Ortin Ansible:

  • Ändern Sie Ihre „Eigenschaften“-Datei so, dass sie wie folgt aussieht, speichern Sie sie in /etc/ansible/facts.d/server_meta.factund wenden Sie die Berechtigungen nach Wunsch an:

    [settings]
    ld_class=app
    ld_loc=dfw
    ld_env=prod
    
  • Führen Sie dann Ihr Playbook aus und verweisen Sie im stateParameter auf diese Fakten:

    state: "{{ (ansible_local.server_meta.settings.ld_loc == 'dfw' and ansible_local.server_meta.settings.ld_class == 'app' and ansible_local.server_meta.settings.ld_env == 'prod' ) | ternary('present', 'absent') }}"
    

verwandte Informationen