Estoy tratando de crear un archivo sudoers con plantilla ansible. El archivo sudoers debería verse a continuación:
Cmnd_Alias LS = /bin/ls
Cmnd_Alias LESS = /usr/bin/less
Cmnd_Alias DU = /usr/bin/du
%support1 ALL=(ALL) NOPASSWD: LS, LESS, DU
Lo que he logrado hasta ahora está a continuación:
Cmnd_Alias LS = ls
Cmnd_Alias LESS = less
Cmnd_Alias DU = du
%support1 ALL=(ALL) NOPASSWD: LS, LESS, DU
La plantilla se ve a continuación:
{% 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
Hasta donde sé, el módulo de plantilla ansible no tiene nada que ejecute el comando en el servidor remoto e imprima la salida; de lo contrario, estaba pensando en cambiar el archivo de plantilla para que se vea a continuación:
{% 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 %}
y la salida será como lo que quería.
¿Hay algún otro método que pueda simplificarlo?
Por cierto, ya he revisado esta publicación
Respuestas:
TL; DR: BESO. No uses menos.
La gente a menudo comete un error con ansible al tratar de hacer cosas variables que no necesitan ser. A menos que haya varios lugares donde defina la lista de comandos a los que puede acceder el soporte, es perfectamente aceptable simplemente colocarlos en el archivo de creación de plantilla:
templates / etc / sudoers.d / support1
o incluso explícitamente, ya que no reutiliza Cmnd_Alias en ningún lado
Y agregue alguna tarea como:
Solo usaría plantillas en lugar de archivos porque más adelante podría haber alguna variable para agregar a todas ellas o el nombre del grupo podría provenir de la variable si obtiene otro rol que crea los grupos.
Si necesita usar variables, lo que puede hacer es usar una lista de hashes como esta:
Luego en la plantilla:
No es seguro usar / usr / bin / less
En todo esto, no notaste algo muy importante y ese es el uso de less como espectador. Lamentablemente ese es un agujero de seguridad. Puede escribir '! Bash' para invocar bash. Y al presionar 'v' ingresa al editor en función de las variables VISUAL, EDITOR o LESSEDIT. Entonces puede darles '/ bin / cat' y siempre pueden canalizar el contenido en menos ellos mismos. Tenga en cuenta que esto sigue siendo un agujero de seguridad, ya que algunos archivos en Unix están restringidos intencionalmente, por ejemplo:
fuente
primeramente
debe consultar el manejo de espacios / líneas nuevas de Jinja. su plantilla actual crearía nuevas líneas, y creo que esto confundirá
sudo
y fallará la validación de la sintaxis (IIRC, la sintaxis correcta es agregar-
como:-%}
en el bucle for, pero debe "jugar" y ver qué sucede). Para representar una plantilla, puede hacerlo en su estación de trabajo, sin ejecutarla en la máquina de destino real.Además, creo que crear la plantilla con 1 comando en la línea de instrucciones es más legible:
En segundo lugar
No recomiendo editar archivos globales existentes con ansible. En su lugar, cree su plantilla personalizada debajo
/etc/sudoers.d/
(como ha mencionado que vio).Esta es la forma correcta de hacerlo, porque:
En tercer lugar
Creo que ejecutar
which
dentrosudoers
es una idea original, pero no debería funcionar.fuente