Indagamos en el mundo online para de esta forma regalarte la solución para tu inquietud, si continúas con dificultades puedes dejar tu duda y responderemos con mucho gusto, porque estamos para servirte.
Solución:
Hay una opción de red segura para tales casos: validate
.
El comando de validación para ejecutar antes de copiar en su lugar. La ruta al archivo para validar se pasa a través de ‘%s’ que debe estar presente como en el ejemplo a continuación. El comando se pasa de forma segura, por lo que las funciones de shell, como la expansión y las tuberías, no funcionarán.
Si observa la sección de ejemplos del módulo lineinfile, verá exactamente lo que necesita:
# Validate the sudoers file before saving
- lineinfile:
path: /etc/sudoers
state: present
regexp: '^%ADMIN ALL='
line: '%ADMIN ALL=(ALL) NOPASSWD: ALL'
validate: '/usr/sbin/visudo -cf %s'
Es seguro si ha probado que la sintaxis es correcta.
El punto de alentar visudo
es evitar que alguien se bloquee de la administración de un sistema mediante la creación de un /etc/sudoers
ya sea por un error tipográfico o un thinko.
Cuando usa Ansible para realizar una edición, puede probar el código que realiza esa edición para hacer lo correcto con sus archivos de configuración, entorno y versión reales de sudo
antes de desplegarlo. Por lo tanto, las preocupaciones sobre las personas que cometen un error tipográfico o de sintaxis a mano no son relevantes de inmediato.
Si bien esta respuesta define las cosas correctamente y proporciona una mitigación de los problemas potenciales, veamos su código.
Le pide a Ansible que (potencialmente) reemplace la línea definida de la siguiente manera:
regexp: ^Defaults env_reset
Esto es claramente una mala práctica y si se repite para un parámetro que no sea Defaults
en sudoers
archivo, es probable que cause un problema crítico.
En general Defaults
es el parámetro de configuración y env_reset
es uno de los valores posibles.
No puede suponer que el archivo de configuración real siempre contendrá ^Defaults env_reset
string.
Si hubiera un conjunto de valores diferente, la expresión regular no coincidiría y terminaría agregando una segunda línea que comenzaría con Defaults
.
Así que la forma correcta de usar lineinfile
es usar regexp
argumento para que coincida solo con el parámetro de configuración, no con su valor. En tu caso:
regexp: ^Defaults
line: Defaults env_reset,timestamp_timeout
El otro peligro potencial es que sudoers
contienen secciones que deben escribirse en el orden correcto. Si el archivo que modifica no contiene la línea especificada por la expresión regular, lineinfile
agregará una nueva línea al final del archivo, donde podría ignorarse o dar como resultado un error (pero eso debería ser descubierto por validación), y muy probablemente cause confusión si un humano mira el archivo más tarde. Por lo tanto, sería prudente especificar insertafter
o insertbefore
.
Comentarios y puntuaciones
Al final de la página puedes encontrar las acotaciones de otros usuarios, tú igualmente tienes la libertad de dejar el tuyo si dominas el tema.