"Después del juego es antes del juego"
Sepp Herberger

sábado, 17 de diciembre de 2016

Funciones puppet para añadir líneas a ficheros

Dado que gestionamos gran número de equipos mediante puppet, todo lo que sea automatizar y ampliar las funcionalidades del mismo nos viene bien. Ya mostré aquí un par funciones puppet para facilitar la descarga e instalación paquetes .deb en nuestros clientes, muy útiles cuando tratamos con paquetes sueltos fuera de repositorios que no podemos gestionar mediante el recurso puppet package.

En esta sentido son muy interesantes estos defines para gestionar ficheros de texto: permiten, entre otras cosas, añadir o borrar líneas de los mismos. Mi compañero Esteban los ha mejorado mucho, como podemos ver en su blog.

Por mi parte, y basándome en lo anterior he programado varias funciones más. La primera permite añadir una línea por encima de otra identificada por un patrón:
# cat /etc/puppet/defines/add_line_above.pp
#Añade la linea "line" al fichero "file", siempre que la cadena "search" no esté en el fichero.
#La línea la añade inmediatamente por encima de la línea que contenga la cadena "above".
#Usado por ejemplo para añadir lineas a /etc/rc.local por encima del "exit 0" con el cual
#siempre finaliza dicho script.

define add_line_above($file, $line, $search, $above) {
    exec { "/bin/sed -i --follow-symlinks '/${above}/i\\${line}' '${file}' ":
           unless => "/bin/grep -q '${search}' '${file}'"
    }
}
La segunda permite añadir una línea por debajo de otra identificada por un patrón:
# cat /etc/puppet/defines/add_line_below.pp
#Añade la linea "line" al fichero "file", siempre que la cadena "search" no esté en el fichero.
#La línea la añade inmediatamente por debajo de la línea que contenga la cadena "below". 
#En resumen: añade lineas al script por debajo de una linea dada, siempre y cuando no encuentre
# un patrón en el fichero. 
define add_line_below($file, $line, $search, $below) {
    exec { "/bin/sed -i --follow-symlinks '/${below}/a ${line}' '${file}' ":
           unless => "/bin/grep -q '${search}' '${file}'"
    }
}
La tercera permite añadir una línea en una posicion concreta dentro del fichero.
# cat /etc/puppet/defines/add_line_number.pp
#Añade la linea "line" al fichero "file", siempre que la cadena "search" no esté en el fichero.
#La ubica justo despues de la línea "pos" del fichero, quedando en la linea "pos+1" y desplazando
#las posteriores hacia abajo.

define add_line_number($file, $line, $search, $pos) {
    exec { "/bin/sed -i --follow-symlinks '${pos} a ${line}' '${file}' ":
           unless => "/bin/grep -q '${search}' '${file}'"
    }
}
Comentarios:
  • Estos ficheros .pp se guardarán /etc/puppet/defines/... del servidor puppet.
  • Dentro de nuestras clases haremos al comienzo import "/etc/puppet/defines/*.pp" para poder usarlos.
  • El --follow-symlinks del sed sirve para que si el fichero es un enlace simbólico que apunta a un fichero real ubicado en otro lugar, los cambios se hagan sobre el fichero real. Si no se especifica sed crea un nuevo fichero distinto del fichero real, que permanece inalterado.
  • En los tres casos file es el fichero donde buscar, line es la línea a insertar y search es la cadena a buscar para determinar si se inserta o no lo la línea.
  • El cuarto parámetro depende de la funcion.
Ejemplos de uso:
import "/etc/puppet/defines/*.pp"
class .... {

 #============================================================================================================================
 #Anade a rc.local (si no esta ya) el codigo que desactiva en el arranque la tarjeta de audio HDMI de la tarjeta grafica
 #lo hace justo antes de la linea exit 0.

 add_line_above { desactiva_audio_hdmi_siatic:
              file=> "/etc/rc.local",
              line=> 'bus=$(lspci | grep "Audio device: NVIDIA Corporation" | cut -d" " -f1) ; test -n $bus && echo 1 > "/sys/bus/pci/devices/0000:$bus/remove"',
              search=> "NVIDIA Corporation",
              above=> "^exit 0$"
 }

 #============================================================================================================================
 #Anade a etckeeper-commit-post (si no esta ya) una llamada al script /usr/bin/puppet_post_send
 #lo hace justo después la linea que contiene PATH.

 add_line_below { run_post_puppet:
              file=> "/etc/puppet/etckeeper-commit-post",
              line=> '/usr/bin/puppet_post_send',
              search=> "/usr/bin/puppet_post_send",
              below=> "PATH"
 }
}
Nos despedimos con un consejo del Estado:

1 comentario:

  1. Muchas gracias por tus post.
    En estas fechas tan e(n||x)trañables, os regalo cientos de libros gratis, de todas las temáticas.
    La web de descarga es https://openlibra.com y encontraréis libros bajo licencia CC como este:
    https://openlibra.com/es/book/the-debian-administrators-handbook-ed-2013 Si quereis, podeis donar via paypal.
    De nada.

    ResponderEliminar