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.fact
und 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
state
Parameter 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') }}"