Ansible (ab 1.4) zeigt bereits Umgebungsvariablen für den Benutzer unter der ansible_env
Variablen an.
- hosts: all
tasks:
- name: debug through ansible.env
debug: var=ansible_env.HOME
Leider können Sie dies anscheinend nur verwenden, um Umgebungsvariablen für den verbundenen Benutzer abzurufen, wie dieses Playbook und die Ausgabe zeigen:
- hosts: all
tasks:
- name: debug specified user's home dir through ansible.env
debug: var=ansible_env.HOME
become: true
become_user: "{{ user }}"
- name: debug specified user's home dir through lookup on env
debug: var=lookup('env','HOME')
become: true
become_user: "{{ user }}"
AUSGABE :
vagrant@Test-01:~$ ansible-playbook -i "inventory/vagrant" env_vars.yml -e "user=testuser"
PLAY [all] ********************************************************************
GATHERING FACTS ***************************************************************
ok: [192.168.0.30]
TASK: [debug specified user's home dir through ansible.env] *******************
ok: [192.168.0.30] => {
"var": {
"/home/vagrant": "/home/vagrant"
}
}
TASK: [debug specified user's home dir through lookup on env] *****************
ok: [192.168.0.30] => {
"var": {
"/home/vagrant": "/home/vagrant"
}
}
PLAY RECAP ********************************************************************
192.168.0.30 : ok=3 changed=0 unreachable=0 failed=0
Wie bei allem in ansible können , wenn Sie ein Modul , das Sie nicht bekommen, was Sie wollen , dann sind Sie immer frei Shell aus (obwohl dies sparsam verwendet werden sollte , da es zerbrechlich sein kann und wird weniger beschreibend) so etwas wie dies mit ::
- hosts: all
tasks:
- name: get user home directory
shell: >
getent passwd {{ user }} | awk -F: '{ print $6 }'
changed_when: false
register: user_home
- name: debug output
debug:
var: user_home.stdout
Möglicherweise gibt es einen saubereren Weg, dies zu tun, und ich bin ein wenig überrascht, dass die Verwendung become_user
zum Wechseln zu dem angegebenen Benutzer die env
Suche nicht zu beeinflussen scheint, aber dies sollte Ihnen das geben, was Sie wollen.
become_user
das nicht aktualisiert,env
also bin ich mir nicht sicher, ob es einen saubereren Ansatz gibt, als nur zugetent
stattdessen verwenden.sudo_user
undbecome_user
sind nicht so portabel über verschiedene Versionen von Ansible auch.getent
scheint mir hier immer noch die beste Lösung zu sein.ansible_env.HOME
Gibt das HOME des Remote-Benutzers zurück (ist jedoch nicht betroffen vonbecome
). Allerdingslookup('env','HOME')
gibt die HOME des Benutzers , das Textbuch am Controller ausgeführt wird .Ich denke, hier gibt es mehrere Antworten, die funktionieren würden, aber ich dachte, ich würde zeigen, dass Sie dies vom ansible-Benutzermodul erhalten können , indem Sie es als Variable registrieren.
Wir können also Debug verwenden, um die Werte dieser Variablen anzuzeigen, einschließlich des Pfads ...
Und Sie können diese Eigenschaften in anderen Modulen wie diesem verwenden.
quelle
getent
Die Lösung funktioniert auch mit dem ansible getent-Modul unter MacOS (zumindest High Sierra) nicht, da die Informationen des Nicht-Systembenutzers aus der passwd-Datenbank entfernt wurden. Und die Lösung in der akzeptierten Antwort funktioniert nur für Linux-verwaltete Hosts..name
und erhalten.home
.user
mache mir Sorgen, dass das Modul den Benutzer erstellt, wenn es nicht existiert, anstatt zu versagen. Das wäre ein ernsthaft seltsamer Fall, und ich denke, Sie könnten so etwas wie eine Fehleraufgabe mit awhen: user.changed
ausführen, aber die Erstellung des Benutzers wird dadurch nicht rückgängig gemacht. Ich denke, Sie könnten es in einen Block einwickeln und den Fehler mit einem Befehl beheben, der den Benutzer entfernt und dann einen weiteren Fehler im Rettungsblock hinzufügt.state
istpresent
, so wie geschrieben, wird der Benutzer erstellt, wenn er nicht vorhanden ist. Es macht jedoch keinen Sinn, das Home-Verzeichnis eines nicht vorhandenen Benutzers abzurufen. Wenn das Erstellen also Probleme verursachen würde, müssten Sie sich darum kümmern.Ansible 1.8 stellte das
getent
Modul vor . Es registriert das getent-Ergebnis als Host-Tatsache - in diesem Fall ist es dasgetent_passwd
.Beispiele:
Drucken Sie den Home-Ordner für eine bestimmte
user
:Sammeln Sie eine Nachschlagetabelle (
user_homes
), die Hebelwirkungset_fact
und den Jinja2-combine()
Filter :Wäre aber besser mit einem benutzerdefinierten Faktenmodul.
quelle
getent
wurde in Ansible 1.8Das Problem
Die
lookup()
oder ENV var-Methoden zum Auffinden des Hauses eines beliebigen Benutzers funktionieren mit Ansible leider nicht zuverlässig, da sie wie vom Benutzer angegeben--user=REMOTE_USER
und optional mitsudo
(wennsudo: yes
im Playbook oder--sudo
bestanden) ausgeführt werden. Diese beiden Ausführungsmodi (sudo oder kein sudo) ändern die Shell-Umgebung, in der Ansible ausgeführt wird, und selbst dann sind Sie auf den als-u REMOTE_USER
oder angegebenen Benutzer beschränktroot
.Sie könnten versuchen, es zu verwenden
sudo: yes
, undsudo_user: myarbitraryuser
zusammen ... Aufgrund eines Fehlers in bestimmten Versionen von Ansible können Sie jedoch feststellen , dass es sich nicht so verhält, wie es sollte. Wenn Sie auf ansible sind> =1.9
, können Sie verwendenbecome: true
, undbecome_user: myarbitraryuser
stattdessen. Dies bedeutet jedoch, dass die von Ihnen geschriebenen Playbooks und Rollen in früheren Versionen von Ansible nicht funktionieren.Wenn Sie nach einer tragbaren Methode suchen, um das Home-Verzeichnis eines Benutzers abzurufen, das auch mit LDAP oder einem anderen Verzeichnisdienst funktioniert, verwenden Sie
getent
.Ansible getent Beispiel
Erstellen Sie ein einfaches Spielbuch mit dem Namen:
playbooks/ad-hoc/get-user-homedir.yml
Führen Sie es aus mit:
quelle
10.12.6
dieses Dienstprogramm nicht hat. Alternativen sind `dscacheutil -q Benutzer -a Name {{Benutzer}},
sudo dscl. -ls / Users`, um Benutzer aufzulisten unddscl . -read /Users/{{ user }}
Informationen über einen Benutzer zu sichern . Für Benutzer und Gruppen im Einzelbenutzermodus gibt es auch immer/etc/passwd
und/etc/group
weil OSX zumindest Unix-kompatibel mit diesen Dateien ist, wenn es im Einzelbenutzermodus ausgeführt wird. Andere Benutzer befinden sich imopendirectoryd
Kommentar oben in diesen Dateien.getent
Befehlszeilenprogramm erstellt, das Sie hier unter OSX kompilieren und verwenden können .git clone https://github.com/petere/getent-osx.git && cd getent-osx
make ; make install
Sie können verwenden
expanduser
.Zum Beispiel beim Durchlaufen einer Benutzerliste:
quelle
Ich weiß, dass dies ein ziemlich alter Thread ist, aber ich denke, dies ist ein etwas einfacherer Weg, um das Home-Verzeichnis des Benutzers zu erhalten
Auf Linux- (oder Unix-) Systemen zeigt das Tilde-Zeichen auf das Home-Verzeichnis des Benutzers.
quelle
In jeder Antwort wird erwähnt, wie die Details des Basisverzeichnisses gedruckt werden, während das Playbook ausgeführt und mit Debug und Var auf dem Bildschirm angezeigt wird .
Anpassung an die Antwort von @TrinitronX
Zusätzliche Informationen zur Verwendung dieser Informationen für eine neue Aufgabe.
Ich habe eine Liste von Benutzern, deren Ausgangsverzeichnis extrahiert werden muss. Also habe ich die Benutzerdetails zu einer Liste hinzugefügt
Hier durchläuft dieser Schritt alle Benutzerlisten und registriert diese Details bei user_home. Und dies wird in Form eines Arrays sein.
Der nächste Schritt besteht darin, diese Informationen für eine neue Aufgabe zu verwenden, z. B. für die Beschaffung einer Datei in ein Bash-Profil. Dies ist nur ein Beispiel und kann ein beliebiges Szenario sein, die Methode bleibt jedoch gleich.
Ich habe eine Tatsache für java_dir auf / usr / java / latest im selben Playbook gesetzt.
Das Array user_home.results enthält die Details der Aufgabe "Home-Verzeichnis abrufen". Jetzt durchlaufen wir dieses Array und nehmen den Standardwert heraus, der den Pfad des Ausgangsverzeichnisses enthält.
Ich habe loop_control nur zum Drucken des Home-Verzeichnisses gesetzt, sonst wird das gesamte Array gedruckt.
Durch diesen Prozess können wir sicherstellen, dass wir, wenn n Benutzer vorhanden sind, diese Methode befolgen können und alle erledigt werden.
Hinweis: Ich habe begonnen, Ansible zu lernen. Falls eine von mir verwendete Terminologie falsch ist, entschuldigen Sie dies bitte. Ich habe einige Zeit damit verbracht, herauszufinden, wie das geht, und darüber nachgedacht, dasselbe zu teilen.
quelle
Ich bin zu diesem Thread gekommen, weil ich die PGDATA env-Variable vom postgres-Benutzer drucken musste. Ich habe nicht gefunden, wie ich es "ansuell" in ansible machen kann, aber ich habe damit aufgehört, dass dies funktioniert:
Dann kann ich das in einem anderen Job mit "{{pgdata_dir.stdout}}" referenzieren.
quelle
In Ansible gibt es derzeit keine einfache Möglichkeit, dies zu tun. Deshalb sollten Sie Ihre Stimmen zu diesem Thema hinzufügen
https://github.com/ansible/ansible/issues/15901
Während Sie diese Problemumgehung verwenden können: https://stackoverflow.com/a/33343455/99834 , sollten Sie nicht vergessen, das Feedback zu senden, dass dies einfach zu verwenden sein soll.
quelle