PowerShell Core y Jenkins en Azure

Automatizar tareas aburridas es una de las cosas más divertidas para los que amamos el scripting, pero… ¿qué sucede si nos detenemos a pensar en la cantidad de scripts de PowerShell que hemos escrito para uso personal o del equipo? Módulos y/o funciones que ayudar a automatizar o solucionar problemas de forma más sencilla son olvidados y/o dejados de lado a pesar del esfuerzo que lleva realizar este tipo de tareas.

:loudspeaker: ¿Te gustaría enterarte cuando se publique un nuevo post? Follow me on Twitter: @vmsilvamolina :loudspeaker:

De ésto último, se suman también los problemas al intentar otorgar a los usuarios finales permisos para utilizar estos recursos cuando no son administradores. Existen varias maneras de resolver el problema: utilizar Just Enough Administration, dar acceso remoto a un servidor con una sesión de PowerShell, habilitar PowerShell Web Access… pero la idea es simplificar las tareas, no complejizarlas.

Para ello es que podemos utilizar Jenkins.

¿Qué es Jenkins?

Jenkins es tradicionalmente utilizado por desarrolladores como una herramienta de integración y continuous integration, que proporciona una interfaz web para crear y ejecutar trabajos manuales y programados. El siguiente video (en inglés) brinda una breve introducción a Jenkins en Linux, para darle una idea de lo que puede hacer.

Jenkins junto a PowerShell en Azure

Jenkins se puede utilizar para hacer muchas cosas dentro del equipo de operaciones, pero la idea de este post es concentrarnos en aprovechar PowerShell para realizar acciones desde el servidor de Jenkins.

Cualquier cosa que sea posible realizar con PowerShell, puede integrarse con Jenkins para proporcionar una interfaz fácil de usar, brindando un espacio para programar y ejecutar trabajos.

¿Y Azure? Azure ofrece desde el marketplace la opción de desplegar una VM con todo listo para comenzar a trabajar, incluyendo la posibilidad de extender la administración y gestión de los recursos de nube.

Jenkins

Desplegar Jenkins en Azure

Al ser este blog ferviente admirador de PowerShell y tomando en cuenta que estamos trabajando con Azure, el despliegue de la VM con Jenkins se realizará desde Azure Cloud Shell con PowerShell.

Para ello, es necesario acceder a https://shell.azure.com y seleccionar la experiencia anteriormente comentada (PowerShell):

Azure Cloud Shell

El primer paso, luego de ingresar a la consola, es movernos a nuestro $home, con el siguiente comando:

  cd ~

Ubicados correctamente vamos a obtener el template ARM para desplegar la máquina virtual con Jenkins, ejecutando el comando a continuación:

  wget https://raw.githubusercontent.com/vmsilvamolina/ARMtemplates/master/jenkins.json

Como resultado de la ejecución anterior vamos a tener en nuestro directorio actual el archivo jenkins.json, obtenido de un repositorio en el que alojo ARM templates de ejemplo.

Ahora que ya tenemos el archivo, se deberá ejecutar lo siguiente para continuar con el procedimiento:

  cat ./.ssh/id_rsa.pub

Copiamos el resultado del comando, que no es más que nuestra clave pública para poder conectarnos a la VM con Jenkins de forma segura y simple (por medio de SSH). En caso de no contar con una clave pública, es requerido ejecutar ssh-keygen -t rsa -b 2048.

El siguiente paso es modificar el archivo descargado (jenkins.json), en donde vamos a agregar el valor de nuestra clave pública dentro del template ARM, como se muestra en el siguiente extracto:

  "adminSSHPublicKey": {
    "metadata": {
        "description": "Public SSH key for the Virtual Machine. Will be used only if authenticationType is 'sshPublicKey'"
    },
    "defaultValue": "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABA...1N",
    "type": "string"
  }

Ya con el archivo modificado, el siguiente paso es generar el grupo de recurso que alojará todos los componentes del despliegue y luego generar el deploy del template modificado:

  az group create -n Jenkins -l eastus
  az group deployment create -n deploy -g Jenkins --template-file ./jenkins.json

Deploy Jenkins with ARM, az CLI and Azure Cloud Shell

Configuración inicial de Jenkins

Ya desplegada la VM con Jenkins en ejecución, se recomienda realizar algunos pasos para dejar operativa nuestra solución sin obviar la parte de seguridad.

Para ello tenemos los siguientes pasos a realizar, detallados en la siguiente entrada:

https://jenkins.io/blog/2017/04/20/secure-jenkins-on-azure/

Esta entrada no tiene como objetivo cubrir estos pasos inicialmente, por lo que se deja el enlace como referencia para implementaciones en producción.

Lo siguiente que debemos hacer intentar conectarnos utilizando la URL (que obtenemos desde la configuración de la VM):

Entonces, para poder acceder a la instancia desde el navegador, tenemos que habilitar el puerto 8080 en el NSG (Network Security Group) en Azure. Para ello ejecutamos lo siguiente en nuestra Azure Cloud Shell:

  az vm open-port -n vm-jenkins -g Jenkins --port 8080

Y ahora sí, podemos navegar en la siguiente URL: vm-jenkins.eastus.cloudapp.azure.com:8080.

Seguido de lo anterior (y notificados por la web), debemos ingresar la contraseña temporal guardada en la ruta que se muestra en la web. Simplemente ingresamos por ssh a lo siguiente:

  ssh -L 127.0.0.1:8080:localhost:8080 [email protected]

Obtenemos la contraseña ejecutando:

  sudo cat /var/lib/jenkins/secrets/initialAdminPassword

Copiamos la contraseña y la ingresamos seleccionando Continue:

Unlock Jenkins

Continuando con el proceso de configuración de Jenkins, seleccionamos la opción “Install suggested plugins”:

Install suggested plugins

A partir de este momento, se comienza a desarrollar la instalación y puesta en marcha de Jenkins, junto con el deploy de los plugins por defecto:

Jenkins update progress

Luego de finalizado este proceso, es requerido generar un usuario admin. Para ello se debe completar el formulario:

Create first admin user

Seleccionar Save and Continue para comenzar a utilizar Jenkins.

Instalación de PowerShell Core

Ya con la solución desplegada en Azure, junto a la configuración básica de la misma, resta ejecutar la instalación PowerShell Core.

Para completar esta tarea, lo primero que debemos realizar es conectarnos por SSH a nuestra VM en Azure:

  ssh [email protected]

Y luego ejecutar los siguientes comandos:

  # Descargar las claves del repositorio
  wget -q https://packages.microsoft.com/config/ubuntu/16.04/packages-microsoft-prod.deb

  # Registrar Register the Microsoft repository GPG keys
  sudo dpkg -i packages-microsoft-prod.deb

  # Update de la
  sudo apt-get update

  # Instalar PowerShell
  sudo apt-get install -y powershell

  # Comprobar instalación de PowerShell
  pwsh

Instalación de PowerShell Core

Creando un job en Jenkins

Se va a definir para el ejemplo un script muy simple donde vamos a tener como resultado la salida de los 10 procesos con mayor consumo de CPU. Ésto lo vamos a generar por medio de un job en Jenkins, que luego vamos a ejecutar.

Para generar un job en Jenkins, luego de tener toda la infraestructura a disposición, es necesario realizar lo siguiente:

  • Desde la interfaz web, click en Nueva tarea.
  • En el campo “Enter an item name” ingresar el nombre del job. Para el ejemplo se usó Procesos con más consumo.
  • Seleccionar Crear un proyecto de estilo libre y click en OK.

Crear job en Jenkins

  • Navegar hasta el final de las opciones y en Ejecutar seleccionar Añadir un nuevo paso, de la lista desplegable seleccionar Ejecutar línea de comandos (shell).
  • Dentro del campo de texto, vamos a ingresar el siguiente script:
  pwsh -c "&{Get-Process | Sort-Object CPU -Descending | select -First 10}"

Agregar comando shell en Jenkins

Y luego click en Guardar.

Ejecutar un job

Luego de todo lo configurado estamos en condiciones de ejecutar el job que acabamos de crear. Para ello hay que regresar al Panel de Control de Jenkins y desde ahí seleccionar el job Procesos con más consumo.

Por último seleccionar el botón Construir ahora.

Listo! Ya iniciamos la ejecución de nuestro trabajo.

Para poder ver el resultado, seleccionamos Console Output y vamos a poder observar la lista de los 10 procesos con mayor consumo de CPU.

Salida del job en Jenkins

La imagen anterior es el punto final, donde pudimos ejecutar un trabajo en Jenkins con PowerShell Core. Las posibilidades son infinitas sobre tareas a realizar y gestionar por medio de estas 2 grandes herramientas, sin contar que también existe la posibilidad de trabajar con Azure directamente.

¿Más información sobre Jenkins? https://jenkins.io/

En próximas entradas veremos como seguir profundizando en esta gran solución.

Happy scripting!

Comments