J'essaie de créer un fichier sudoers avec un modèle ansible. Le fichier sudoers devrait ressembler à ci-dessous:
Cmnd_Alias LS = /bin/ls
Cmnd_Alias LESS = /usr/bin/less
Cmnd_Alias DU = /usr/bin/du
%support1 ALL=(ALL) NOPASSWD: LS, LESS, DU
Ce que j'ai réussi jusqu'à présent est ci-dessous:
Cmnd_Alias LS = ls
Cmnd_Alias LESS = less
Cmnd_Alias DU = du
%support1 ALL=(ALL) NOPASSWD: LS, LESS, DU
Le modèle ressemble à ci-dessous:
{% for item in commands %}
Cmnd_Alias {{ item|upper }} = {{ item }}
{% endfor %}
%{{ group }} ALL=(ALL) NOPASSWD: {% for item in commands %}
{{ item|upper}}{% if not loop.last %}, {% endif %}
{% endfor %}
vars
commands:
- ls
- less
- du
Pour autant que je sache, le module de modèle ansible n'a rien qui puisse exécuter la commande dans le serveur distant et imprimer la sortie, sinon je pensais à changer le fichier de modèle pour ressembler à ci-dessous:
{% for item in commands %}
Cmnd_Alias {{ item|upper }} = `which {{ item }}`
{% endfor %}
%{{ group }} ALL=(ALL) NOPASSWD: {% for item in commands %}
{{ item|upper}}{% if not loop.last %}, {% endif %}
{% endfor %}
et la sortie sera comme ce que je voulais.
Existe-t-il une autre méthode qui peut simplifier les choses?
BTW j'ai déjà vérifié ce post
Réponses:
TL; DR: BAISER. N'utilisez pas moins.
Les gens font souvent une erreur avec ansible en essayant de faire des choses variables qui n'ont pas besoin d'être. À moins qu'il y ait plusieurs endroits où vous définissez la liste des commandes auxquelles le support peut accéder, il est parfaitement acceptable de simplement les placer dans le fichier de création de modèle:
templates / etc / sudoers.d / support1
ou même explicitement car vous ne réutilisez le Cmnd_Alias nulle part
Et ajoutez une tâche comme:
Vous utiliseriez uniquement des modèles au lieu de fichiers, car plus tard, il pourrait y avoir une variable à ajouter à tous ceux-ci ou le nom du groupe pourrait provenir d'une variable si vous obtenez un autre rôle qui crée les groupes.
Si vous devez utiliser une variable, vous pouvez utiliser une liste de hachages comme celle-ci:
Puis dans le modèle:
Il n'est pas sûr d'utiliser / usr / bin / less
Dans tout cela, vous n'avez pas remarqué beaucoup de chose importante et c'est l'utilisation de moins en tant que spectateur. Malheureusement, c'est un trou de sécurité. Vous pouvez taper '! Bash' pour appeler bash. Et en appuyant sur «v», vous accédez à l'éditeur en fonction des variables VISUAL, EDITOR ou LESSEDIT. Vous pouvez donc leur donner '/ bin / cat' et ils peuvent toujours canaliser le contenu en moins eux-mêmes. Notez que c'est toujours une faille de sécurité car certains fichiers sous Unix sont très intentionnellement restreints par exemple:
la source
d'abord
vous devez vous référer à la gestion Jinja des espaces / sauts de ligne. votre modèle actuel créerait de nouvelles lignes, et je pense que cela confondra
sudo
et échouera la validation de la syntaxe (IIRC, la bonne syntaxe est d'ajouter-
comme:-%}
à la boucle for, mais vous devriez "jouer" et voir ce qui se passe). Pour rendre un modèle, vous pouvez le faire sur votre poste de travail, sans l'exécuter sur la machine cible réelle.De plus, je pense que la création du modèle avec 1 commande sur la ligne d'instructions est plus lisible:
Deuxièmement
Je ne recommande pas de modifier les fichiers globaux existants avec ansible. Créez plutôt votre modèle personnalisé sous
/etc/sudoers.d/
(comme vous l'avez mentionné, vous l'avez vu).C'est la bonne façon de procéder, car:
Troisièmement
Je pense que l'exécution à l'
which
intérieursudoers
est une idée originale, mais ne devrait pas fonctionner.la source