@Grab('com.aestasit.infrastructure.sshoogr:sshoogr:0.9.25')
@GrabConfig(systemClassLoader=true)
Descargar el script ../scripts/network/ChangeProperties.groovy
13 October 2017
El caso que vamos a tratar es la modificación del contenido de un fichero con el formato clave:valor.
Si trabajamos con varias máquinas, seguramente nos hayamos encontrado con que cada una de ellas tiene ficheros de configuración que indiquen la url de la base de datos a la que debe conectectarse, messages.properties de nuestra aplicación …
El problema de trabajar con estos ficheros es que en la mayoría de los casos, sobre todo cuando hablamos de ficheros de configuración, son personalizados y en el caso de tener que cambiar algún valor debemos de tener mucho cuidado ya que no son ficheros que podamos copiar a todas nuestras maquinas de manera masiva porque dedemos respetar la configuración que tienen cada uno de ellos.
A continuación vamos a explicar como crear un script que modifique el usuario con el que hacemos la conexión a la base de datos en base a cierta condición propia de la máquina.
Note
|
Vamos a usar una herramienta que ya hemos utilizado en alguno de nuestros scripts sshoogr. |
Añadimos la dependencia de sshoogr
@Grab('com.aestasit.infrastructure.sshoogr:sshoogr:0.9.25')
@GrabConfig(systemClassLoader=true)
Definimos el nombre del servidor y el de nuestro fichero de configuración.
def server_name = "server_1"
def file_config = '/tmp/file.properties'
Creamos el método de lectura de nuestro fichero
def getFile(file_config,server_name){
remoteSession("user:passwd@$server_name:22") {// (1)
result = remoteFile(file_config).text // (2)
}
return result.readLines()// (3)
}
Establecemos los parámtros de conexión usuario = user
, contraseña = passwd
mientras que el servidor
es variable.
En la función remoteFile
le pasamos por parámetro la ruta complete la fichero.
Con la función readLines
obtenemos una lista con el contenido del fichero.
Creamos el método para sobreescribir el fichero con los datos actualizados
def putFile(file_name,server_name,new_file){
remoteSession("user:passwd@$server_name:22") {// (1)
remoteFile(dir).text = properties // (2)
}
}
Establecemos los parámtros de conexión usuario = user
, contraseña = passwd
mientras que el servidor
es variable.
Actualizamos el contenido de nuestro fichero de configuración.
Aplicamos la lógica de sustitución. En nuestro caso vamos a cambiar la variable user.sql
por el valor de una
variable de entorno más una cadena fija _changeme
def read = getFile(file_config,server_name) // (1)
def properties = read.collect{
if (it.startWith("user.sql")){ // (2)
return "user.sql=${System.getenv('HOSTNAME')}_changeme"
}
return it
}.join('\n')
putFile(file_config,server_name,properties)// (3)
Lo primero que hacemos es emplear nuestra función getFile
para obtener en contenido del fichero.
Si econtramos la clave en nuestro fichero que queremos actualizar la modificamos y si no saltamos a la siguiente linea.
Llamaremos a nuestro método putFile
el cúal nos actualizará el contenido de nuestro fichero de configuración.
Note
|
Si te da error al conectar con el host, prueba a desactivar la comprobación estricta de la clave del host: |
options.trustUnknownHosts = true
//tag::dependencies[]
@Grab('com.aestasit.infrastructure.sshoogr:sshoogr:0.9.25')
@GrabConfig(systemClassLoader=true)
//end::dependencies[]
import static com.aestasit.infrastructure.ssh.DefaultSsh.*
options.trustUnknownHosts = true
//tag::config[]
def server_name = "server_1"
def file_config = '/tmp/file.properties'
//end::config[]
//tag::main[]
def read = getFile(file_config,server_name) // (1)
def properties = read.collect{
if (it.startWith("user.sql")){ // (2)
return "user.sql=${System.getenv('HOSTNAME')}_changeme"
}
return it
}.join('\n')
putFile(file_config,server_name,properties)// (3)
//end::main[]
//tag::write[]
def putFile(file_name,server_name,new_file){
remoteSession("user:passwd@$server_name:22") {// (1)
remoteFile(dir).text = properties // (2)
}
}
//end::write[]
//tag::read[]
def getFile(file_config,server_name){
remoteSession("user:passwd@$server_name:22") {// (1)
result = remoteFile(file_config).text // (2)
}
return result.readLines()// (3)
}
//end::read[]