Comment obtenir un arbitraire à distance répertoire home de l'utilisateur dans Ansible?
Je peux le faire avec shell à l'aide de la combinaison de getent
et awk
comme ceci:
getent passwd $user | awk -F: '{ print $6 }'
Pour la référence, dans Marionnette je peux utiliser un custom fait, comme ceci:
require 'etc'
Etc.passwd { |user|
Facter.add("home_#{user.name}") do
setcode do
user.dir
end
end
}
qui rend le répertoire home de l'utilisateur disponible en home_<user name>
fait.
Comment puis-je obtenir le répertoire de base d'un arbitraire utilisateur distant?
Vous devez vous connecter pour publier un commentaire.
Ansible (de 1,4 à partir) révèle déjà les variables d'environnement de l'utilisateur en vertu de la
ansible_env
variable.Alternativement, vous pouvez accéder à des variables d'environnement à l'aide d'un recherche sur
env
:Malheureusement, vous ne pouvez apparemment seulement l'utiliser pour obtenir les variables d'environnement de l'utilisateur connecté, que ce playbook et de sortie de la montre:
SORTIE:
Comme tout ce qui est Ansible, si vous ne pouvez pas obtenir un module pour vous donner ce que vous voulez, alors vous êtes toujours libre de shell out (bien que cela doit être utilisée avec parcimonie, car il peut être fragile et moins descriptive) en utilisant quelque chose comme ceci:
Il pourrait bien y avoir une manière plus propre de faire cela et je suis un peu surpris que l'utilisation de
become_user
pour passer à l'utilisateur spécifié ne semble pas affecter laenv
de recherche, mais cela devrait vous donner ce que vous voulez.become_user
ne met pas à jour leenv
donc je ne sais pas si il y a de plus propre approche que juste sorti de mais qui devrait fonctionnergetent
à la place.sudo_user
etbecome_user
ne sont pas transférables entre les différentes versions de l'Ansible aussi.getent
encore me semble être la meilleure solution ici.mike
etmike2
ansible_env.HOME
ne retour au DOMICILE de l'utilisateur à distance (mais il n'est pas affecté parbecome
). Cependantlookup('env','HOME')
retourne le HOME de l'utilisateur qui exécute le playbook au niveau du contrôleur.Ansible 1.8 introduit la
getent
module. Il enregistre la getent résultat comme un hôte fait—dans ce cas, il estgetent_passwd
.exemples:
Imprimer le dossier d'accueil pour un
user
:Accumuler une table de recherche (
user_homes
), en tirant parti deset_fact
et de la Jinja2combine()
filtre:Serait mieux avec un custom fait de module si.
getent
a été introduit dans Ansible 1.8Le Problème
La
lookup()
ou ENV var méthodes pour trouver un arbitraire de l'utilisateur à la maison, malheureusement, ne fonctionne pas de manière fiable avec Ansible parce qu'il s'exécute en tant qu'utilisateur spécifié avec--user=REMOTE_USER
, et éventuellement avecsudo
(sisudo: yes
dans playbook ou--sudo
passé). Ces deux modes de fonctionnement (sudo ou pas de sudo) va changer l'environnement du shell que Ansible est en cours d'exécution à l'intérieur, et même alors, vous serez limité à l'utilisateur spécifié comme-u REMOTE_USER
ouroot
.Vous pouvez essayer d'utiliser
sudo: yes
, etsudo_user: myarbitraryuser
ensemble... cependant, en raison d'un bogue dans certaines versions de Ansible vous pouvez voir qu'il ne se comporte pas comme il le devrait. Si vous êtes sur Ansible >=1.9
, vous pouvez utiliserbecome: true
, etbecome_user: myarbitraryuser
à la place. Toutefois, cela signifie que les tablettes playbook et les rôles que vous écrivez ne fonctionne pas sur les versions précédentes de l'Ansible.Si vous êtes à la recherche pour un portable de façon à obtenir un home de l'utilisateur dir qui sera également travailler avec LDAP ou de quelque autre service d'annuaire, utilisez
getent
.Ansible getent Exemple
Créer un simple playbook nommé:
playbooks/ad-hoc/get-user-homedir.yml
L'exécuter avec:
10.12.6
n'a pas cet utilitaire.Des Alternatives sont " dscacheutil -q l'utilisateur un nom {{ utilisateur }},
sudo dscl . -ls /des Utilisateurs à la liste des utilisateurs, etdscl . -read /Users/{{ user }}
de vider les informations sur un utilisateur. Pour le mode mono-utilisateur des utilisateurs et des groupes, il y a aussi toujours/etc/passwd
et/etc/group
parce que OSX au moins est Unix compatible avec les fichiers lorsque vous exécutez en mode mono-utilisateur. D'autres utilisateurs sont dansopendirectoryd
que le commentaire en haut de ces fichiers unis.getent
utilitaire de ligne de commande que vous pouvez compiler et d'utiliser sur OSX ici.git clone https://github.com/petere/getent-osx.git && cd getent-osx
make ; make install
Je pense qu'il y a plusieurs réponses ici qui serait à l'œuvre, mais j'ai pensé que je voudrais vous montrer que vous pouvez obtenir ce à partir de la ansible utilisateur module, en l'inscrivant comme une variable.
Nous pouvons donc utiliser debug pour afficher les valeurs de var, y compris le chemin d'accès...
Et vous pouvez utiliser ces propriétés dans d'autres modules comme cela;
getent
solution, même avec ansible getent module ne fonctionne pas sur MacOS (au moins High Sierra) que la non-utilisation du système d'info supprimé de la base de données passwd. Et la solution dans la accepté de répondre fonctionne uniquement pour linux hôte géré..name
et.home
.user
module va créer l'utilisateur s'il n'existe pas au lieu d'échouer. Ce serait un grave impair cas, et je suppose que vous pourriez faire quelque chose comme l'utilisation d'un échec de la tâche avec unwhen: user.changed
mais il ne sera pas annuler la création de l'utilisateur. Je pense que vous pouvez l'envelopper dans un bloc et de sauvetage de l'échec d'une commande qui a supprimé l'utilisateur, puis ajouter un autre échec dans le sauvetage de bloc? Un peu gênant :/state
estpresent
, donc, comme l'écrit, il va créer l'utilisateur s'il n'existe pas. Toutefois, il ne faut pas faire sens pour obtenir le répertoire personnel d'un utilisateur non existant, donc si création il causerait des problèmes, alors que vous auriez à garde que.Je sais que c'est assez vieux thread, mais je pense que c'est un peu plus simple pour obtenir le répertoire de base d'utilisateurs
Sur Linux (ou Unix) systèmes de la tilde-signe de points pour le répertoire de base d'utilisateurs.
Chaque réponse mentionne sur la façon d'imprimer le répertoire d'accueil de détails lors de l'exécution de la playbook et l'afficher sur l'écran à l'aide de débogage et var.
S'adapter à @TrinitronX réponse
De l'information supplémentaire sur l'utilisation de cette information à une nouvelle tâche.
J'ai une liste des utilisateurs dont le répertoire d'accueil doit être extrait. J'ai donc ajouté les détails de l'utilisateur à une liste
Ici, cette étape vous permettra de parcourir l'ensemble de la liste des utilisateurs et permettra d'enregistrer les détails de user_home. Et ce sera sous la forme d'un tableau.
Alors la prochaine étape est d'utiliser cette information à une nouvelle tâche, qui est de dire par exemple trouver un fichier dans bash profil. C'est juste un exemple et peut être n'importe quel scénario, mais la méthode reste la même.
J'ai mis un fait pour java_dir à /usr/java/dernière dans le même système de jeu.
Tableau user_home.les résultats contiennent les détails de l'rentrer à la maison répertoire de la tâche.
Maintenant, nous bouclons ce tableau et prendre la sortie standard (stdout) de la valeur qui contient le répertoire d'accueil de chemin.
J'ai mis loop_control pour l'impression de la maison, répertoire, sinon il va imprimer l'intégralité du tableau.
Par ce processus, nous pouvons vous assurer que si n est le nombre d'utilisateurs est là, on peut suivre cette méthode, et tout sera pris en charge.
Remarque: j'ai commencé à apprendre l'Ansible, dans le cas où si les termes que j'ai utilisé est incorrect, veuillez excuser. J'ai passer un peu de temps pour comprendre comment faire cela et de la pensée de partager la même.
Il n'y a pas de moyen facile de le faire dans Ansible, en ce moment, et c'est pourquoi vous
ajouter votre voix à cette question
https://github.com/ansible/ansible/issues/15901
Alors que vous pouvez utiliser cette solution de contournement: https://stackoverflow.com/a/33343455/99834 vous ne devez pas oublier d'envoyer les commentaires que vous voulez que ce soit facile à utiliser.
Vous pouvez utiliser
expanduser
.Par exemple, alors que boucler sur une liste d'utilisateur: