Modifica un playbook YAML en un pipeline de Jenkins.
Tengo un archivo delivery.yaml utilizado por Ansible para desplegar datos:
“`
- name: Desplegar en el Filer en el host
hosts: host
tasks:- name: Copiar archivos
copy: src={{ item.src }} dest={{ item.dest }} mode=0775
with_items:- { src: ‘data1.xml’, dest: ” }
- { src: ‘data2.so’, dest: ” }
- { src: ‘data3.exe’, dest: ” }
- { src: ‘data4.lib’, dest: ” }
“`
- name: Copiar archivos
Necesito completar el valor “dest” de acuerdo con la extensión del archivo:
archivos xml => destino1
archivos so => destino2
archivos exe => destino3
archivos lib => destino4
¿Cómo escribirlo? No estoy acostumbrado con el lenguaje Groovy. Actualmente, escribo esto pero no funciona:
stage('Prueba YAML') {
pasos{
script{
yamlData = readYaml file: 'delivery.yaml'
yamlData.tasks.with_items.find{it.src.endsWith("xml")}.dest="destino1"
writeYaml file: 'delivery_temp.yaml', data: yamlData
sh "cat delivery_temp.yaml"
}
}
}
Obtengo este error:
hudson.remoting.ProxyException: groovy.lang.MissingMethodException: No signature of method: java.util.ArrayList.endsWith() is applicable for argument types: (java.lang.String) values: [xml]
davy.ai
Para completar el valor “dest” de acuerdo con la extensión del archivo, podemos usar un mapa para hacer coincidir la extensión con el valor objetivo. Aquí hay una versión actualizada del script en groovy:
Explicación:
– Creamos un mapa llamado
extensionToTargetMap
que relaciona cada extensión de archivo con su valor objetivo.– Leemos el archivo YAML en una variable
yamlData
.– Recorremos cada elemento de la lista
tasks
utilizandoeach
, y para cada elemento:– Extraemos la extensión del archivo utilizando el método
tokenize
, que divide la cadena en una matriz utilizando el punto como delimitador, y obtenemos el último elemento de esa matriz (la extensión del archivo).– Actualizamos el valor
dest
del elemento utilizando el mapa que creamos.– Finalmente, escribimos los datos YAML actualizados en un archivo llamado
delivery_temp.yaml
, y usamossh
para imprimir su contenido.