Ansible tips

Este post se limita a incluir algunas notas sobre el uso de Ansible y en particular sobre la realización de un tutorial paso a paso sobre la aplicación del mismo, incluyendo los conceptos más básicos.

Inventory file

Ejecuta comandos

Módulos (plugins)

Obtiene información sobre los nodos del inventario

Fichero de inventario, agrupaciones

Variables en fichero de inventario

Playbooks

Registra resultado de tareas y ejecuta en función de su valor

Iteraciones en playbooks

Usar tags en playbooks

Jinja templates

And in the playbook

Lanza varios playbooks

Variables para hosts y para grupos

Se pueden usar en templates

Roles

Se lanzan los roles desde el playbook principal

Estructura de los roles

roles
|
|_some_role
|
|_defaults
|   |
|   |_main.yml
|   |_…
|
|_files
|   |
|   |_file1
|   |_…
|
|_handlers
|   |
|   |_main.yml
|   |_some_other_file.yml
|   |_ …
|
|_meta
|   |
|   |_main.yml
|   |_some_other_file.yml
|   |_ …
|
|_tasks
|   |
|   |_main.yml
|   |_some_other_file.yml
|   |_ …
|
|_templates
|   |
|   |_template1.j2
|   |_…
|
|_vars
|
|_main.yml
|_some_other_file.yml
|_ …

Referencias

https://www.ansible.com/get-started

https://www.ansible.com/how-ansible-works

https://www.ansible.com/webinars-training/introduction-to-ansible

 

Herramientas SDLC

Disclaimer: Lo que se escribe a continuación es una visión personal de una serie de experiencias laborales y conocimientos extraidos en los últimos tiempos por mi mismo. Las definiciones y términos usados puede que no se ajusten a la realidad debido a mi falta de experiencia en estos campos.

gitjenkinsmavencruciblenexussonarqubeuDeployveracode

Comenzamos una nueva sección del blog dedicada a los procesos que rodean el desarrollo de software y a las tareas clásicas de ingeniería que se aplican a lo largo del ciclo de vida del mismo y que tienen que ver con el soporte, gestión y configuración de la implementación, implantación y mantenimiento, entre otras.

Nos referimos fundamentalmente a tareas de gestión de la configuración, gestión de entornos, soporte a tareas de ingeniería de software, gestión de la calidad, etc. Es lo que siempre se ha conocido como Gestion de la Configuración o más ampliamente como ITIL y que ultimamente se aplica al término DevOps, que proviene de la contracción Developers + Operators. Es decir, el conjunto de tareas y personas que se situarían entre los desarrolladores o el desarrollo del software en sí, y las personas que lo manejan u operan con él. Estas tareas darían soporte horizontal y envolverían las tareas de los desarrolladores y operadores, gestionando entornos, herramientas de desarrollo, controles de calidad, mecanismos de implantación, gestión de incidencias, etc.

El objetivo de aplicar estas técnicas es fundamental en un desarrollo de software moderno o con cierta embergadura, y aportan:

  • Mayor control
  • Mejor productividad
  • Reducción de errores
  • Mejor calidad
  • Reducción de costes
  • Etc

Las áreas fundamentales sobre las que se aplicarían estos conocimientos serían:

  • Gestión de control de versiones
  • Gestión de la implementación (integración contínua)
  • Revisión de código
  • Control de calidad del código
  • Seguridad del código
  • Gestión de la implantación (despliegues en entornos)
  • Gestión de incidencias
  • Gestión documental

Para trabajar en estas áreas, exiten numerosas aplicaciones gratuitas y de pago que pueden ser aplicadas y que facilitan la realización de las mismas. A continuación se presenta una revisión de algunas herramientas y tareas relacionadas con el mundo DevOps y el ciclo de desarrollo de software que son un pilar fundamental en un desarrollo de software moderno, como se ha mencionado anteriormente.

Control de versiones del software

Aqui nos referimos al uso de:

  • Repositorios
  • Control de versiones
  • Estrategia de ramas

Es fundamental el uso de un repositorio de código que permita tener copias de seguridad del mismo. Además ha de controlar las diferentes versiones de código que se generan. Una buena estrategia de ramas basada en buenas prácticas y recomendaciones, como una estrategia Git workflow, es fudamental para gestionar las diferentes versiones de código. Se pueden usar las siguientes herramientas aqui:

Como repositorios de software y sistemas de control de versiones:

  • SVN (Subversion)
  • Git (recomendado)

Git se lo recomendado. Tiene implementaciones gratuitas y accesibles en Internet como Github. Bitbucket (antiguo Stash) es una implementación alternativa. Como clientes para conectarse a los repositorios:

  • TortoiseSVN para SVN
  • SourceTree para Git

Los IDEs como Eclipse o Netbeans también permiten desde diferentes plugins acceder a estos repositorios y operar con ellos sin problemas.

Integración contínua

Nos referimos a las actividades que se encargan de mantener siempre en todo momento una versión estable del software independientemente de que se esté modificando de forma contínua. Es decir, a pesar de que se es esté trabajando de continuo en desarrollar nuevas características en el código, ha de existir una version lo más estable posible y una integración continuada de esas nuevas características con el código ya existente.

Para esto se pueden usar diferentes herramientas de integración que junto con los repositorios de código y otras herramientas de construcción, permitene de forma auotmatica inegrar nuevas funcionalidades al software ya existente y asegurar una version lo suficientemente estable para ser usada. Las herramientas que encontramos aqui son:

  • Servidores de integración contínua
  • Herramientas de construcción

Dentro de los sevidores tenemos:

  • Jenkins (recomendado)
  • TravisCI
  • Hudson
  • TeamCity

Como herramientas, destaca Maven y su infinidad de plugins con los que hacer practicamente de todo.

Revisión de código

Es una buena práctica revisar el código fuente antes de darlo por bueno e incluirlo en alguna nueva versión dentro de nuestro SCM. Existen múltiples estrategias de revisión de código, desde las más básicas hasta otras más complejas que requieren de herramientas específicas. Las herramientas de las que se puede hacer uso para incluir la revisión de código y que incluimos en este post son:

  • Fisheye / Crucible
  • Stash / Bitbucket

Adenás si se usa Git como SCM, este incorpora ya mecanismos que facilitan la aplicación de revisiones de código, como es el Pull Request. Implementaciones de Git como Stash/Bitbucket incluyen Code Review como una funcionalidad adicional dentro del SCM y en conjunción con otros pasos intermedios como el Pull Request.

Control de calidad

El control de calidad del código es fundamental para reducir el número de bugs y crear un código mantenible y legible. El control se puede aplicar:

  • Desde el entorno de desarrollo, por parte del propio desarrollador
  • Desde el servidor de integración contínua y como parte del proceso de creación de nuevas versiones

Desde la parte de desarrollo, se pueden aplicar varios plugins para el IDE (Eclipse, Netbeans) que se este usando y que pueden ser ejecutados por el propio desarrollador para corregir errores de calidad lo antes posible. Algunos son:

  • Checkstyle
  • PMD
  • Findbugs
  • Sonar

Para el último se necesitaría disponer de la parte servidora de Sonar (SonarQube) que además se recomienda como herramienta para analizar y visualizar la calidad del código desde su web.

Cobertura de tests

La existencia y ejecucion de tests es importante también para detectar bugs cuanto antes. La integración continua permite ejecutar los tests de forma automatica, tanto tests de unidad como tests de integración, en el momento en el que se construyen las nuevas versiones de software.

Se puede revisar cuanto código existe bajo algun test (al menos con Java) usando diferentes herramientas de cobertura. Estas herramientas suelen necesitar de cierta configuración para afinar sus resultados y que se correspondan con la realiudad. Además suelen integrarse bien con otras herramientas de control de calidad como Sonar. JaCoCo puede ser una opción. Por otro lador los sevidores de integración suelen contener plugins y sus propias herramientas de cobertura en algunos casos.

Repositorio de binarios

Para almacenar el software una vez se crean las diferentes versiones, se usan repositorios de binarios. Estos se integran bien con los servidores de integración continua desde donde se crea el software. Algunos de estos repositorios, los más usados, son:

  • Nexus
  • Artifactory

Despliegues

Para desplegar el software de forma agil y automatica se pueden usar aplicaciones especializadas como:

  • Udeploy

Suelen ser aplicaciones complejas ya que su tarea lo es, pero con un gran rendimiento si se consiguen dominar. Si se conecta la parte de integración continua con el despliegue automático podriamos llegar a conseguir lo que se conoce como Continuous Deployment, o Despliegue Continuo.

Seguridad

Para revisar la seguridad del código desarrollado, en busca de agujeros y código que pueda crear situaciones peligrosas una vez desplegado, se puede usar:

  • Veracode

Este software es de pago, pero se puede usar tanto desde un servidore sobre la aplicación en funcionamiento como desde el entorno de desarrollo o sobre los repositorios de código en revisiones estáticas o en sandboxes creados para detectar posibles errores cuanto antes.

Testeando y documentando REST WS con Spring REST Docs

El presente post se centra en el uso de Spring REST Docs, un componente de la suite de Spring, que tiene como objetivo facilitar la generación de documentación de servicios web tipo REST.

Esta parte de Spring se integra con Spring MVC Test para que, desde nuestros tests de unidad o de integración, podamos, a la vez que se testean los servicios web, generar una documentación en formato HTML completa, consistente y moderna con la que describir el uso de los mismos.

Qué cocinamos

El uso de servicios web es una buena manera de compartir funcionalidades entre aplicaciones, crear interacciones entre ellas e integrar diferentes usos. Es una manera sencilla y poco invasiva de compartir información y realizar peticiones de ejecución de todo tipo de servicios. Además los servicios web tipo REST son sencillos de implementar, siguen estándares bien definidos y son compatibles entre multitud de aplicaciones y tipos de tecnologías.

Uno de los principales problemas a la hora de compartir o publicar un conjunto de servicios web tipo REST para que puedan ser usados por terceros es documentarlos debidamente para que esas terceras partes conozcan como usarlos, que invocar, que entradas de datos deben usar o que salidas deben esperar. Si otros tipos de servicios similares, como los servicios web tipo SOAP tienen documentos más o menos formales y estandarizados como los WSDL, que pueden ser usados por aplicaciones de terceros para crear clientes que invoquen a nuestros servicios, practicamente de forma automática, en el caso de los servicios tipo REST, su simplicidad y fundamentos basados en tecnologías más genéricas impide o dificulta la presencia de ese tipo de formalismos (aunque existen intentos para definir formalmente este tipo de servicios de forma similar usando también XML).

Al final, lo que parece ser una ventaja del mundo de los WS tipo REST, en relación a su simplicidad, puede verse como un problema a la hora de transmitir su uso a terceros. Por este motivo, se recomiendan, además de usar una serie de estándares o buenas prácticas a la hora de desarrollar los servicios, unas buenas prácticas asimismo a la hora de documentarlos. En este sentido, Spring REST Docs es una herramienta de gran utilidad ya que permite, al mismo tiempo que se testean esos mismos servicios web, generar una documentación de calidad. Además si se siguen esas recomendaciones y buenas prácticas, tendremos una documentación útil y sencilla de transmitir a terceros para que puedan hacer uso de nuestros servicios.

Lo que hace Spring REST Docs es generar, en función de la implementación que establezcamos en su ejecución, que puede realizarse integramente dentros de los tests de unidad o integración de nuestros servicios, una documentación en texto plano que posteriormente se transformará en HTML (u otros formatos) usando un programa externo llamado Asciidoctor. Para facilitar esto, existen plug-ins para Maven que permiten ejecutar los tests y generar la documentación de forma simultánea, de tal manera que incluso si la generación de documentación falla, el test también fallará, asegurándonos así que existe una referencia consistente para ese servicio.

Ingredientes

Vamos a usar una aplicación web de prueba que implementa una serie de servicios web tipo REST para pobar los Spring REST Docs, testeando y documentando dichos servicios de forma simultanea. Para ello necesitaremos:

  • Spring Boot
  • Spring MVC
  • Spring Data
  • Spring REST Docs
  • HSQLDB
  • Log4j

Para más información acerca de las dependencias usadas (versiones, paquetes específicos etc.) se puede echar un vistazo al pom.xml que se incluye con el proyecto.

Paso a paso

Lo de siempre, una vez creado nuestro proyecto, se maveniza. Este es el aspecto del pom.xml que incluye las dependencias a las librerias de los componentes anteriores:

En este caso, como en otros expuestos en este blog, para facilitar la implementación y ejecución de la prueba, se usa Spring Boot. Para implementar una pequeña aplicacion de prueba que desarrolle una serie de servicios web con acceso a datos, se usa la integración de Spring MVC y Spring Data con Spring Boot, de esta manera podremos implementar una sencilla aplicacion de forma rápida y simple. Se usa HSQLDB como base de datos relacional embebida, que nos permitirá ejecutar las operaciones CRUD clásicas de persistencia de datos.

El resto del pom incluye, además, los plugin que se usarán para, desde Maven, ejecutar los tests y la generación de la documentación (con Asciidoctor).

1. Desarrollar la aplicación de prueba que implementa los servicios web

Vamos a desarrollar una aplicación muy sencilla que nos permita realizar las clásicas operaciones CRUD sobre una entidad concreta y poder acceder a esas operaciones mediante servicios web tipo REST. Nuestra aplicación va a realizar lo siguiente:

  • Insertar o actualizar un superheroe
  • Borrar un superheroe
  • Mostrar un superheroe
  • Mostrar la lista de superheroes

Para ello desarrollamos una aplicación por capas más o menos clásica que implemente los diferentes niveles de acceso a los datos:

  • Un POJO que representa la entidad “Superheroe”
  • Un DAO que por simplicidad solo implementará las operaciones CRUD anteriores
  • Un Controlador que implementará los servicios web

En este caso, como no hay lógica de negocio, y por simplicidad y porque el post está centrado en la generación de la documentación de los servicios web y no en el desarrollo de la aplicación en sí, nos saltaremos la capa de negocio o de servicios que debería tener este tipo de aplicaciones por capas.

2. POJO y DAO

El POJO representa la entidad que usaremos para la prueba, que como se ha mencionado antes, modela los datos de un superheroe cualquiera, con sus superpoderes, debilidades y demás características. Además de usarlo para la capa de persistencia, también usaremos la misma clase como DTO para transferir datos entre capas de negocio.

El DAO, por motivos de simplicidad, es una interfaz que se exitende del CrudRepository de Spring Data. De esta manera se implementan automaticamente las operaciones CRUD clásicas necesarias para nuestro ejemplo. Usaremos el nombre del superheroe como clave primaria de la entidad.

 3. Servicios web

Para implementar los servicios web en este caso usamos Spring MVC. Vamos a seguir en la medida de lo posible las recomendaciones y buenas prácticas en la implementación de servicios de este tipo. Estas recomendaciones afectan a varias características de los servicios, a saber:

  • URL del servicio
  • Método HTTP
  • Códigos HTTP de respuesta

A parte de esto, en nuestro caso, como vamos a invocar los servicios desde una página web, usaremos JSON para enviar y recibir los datos desde los mismos (se podría usar XML en su lugar).

Los servicios que vamos a implementar y sus características son los siguientes:

Inserta o modifica un superheroe

Inserta un nuevo superheroe, si éste no existe, o lo modifica con los datos enviados, si existe en función de su clave primaria (nombre).

Obtiene los datos de un superheroe concreto en función de su nombre

Borra un superheroe en función de su nombre

Muestra la lista completa de superheroes

 4. Tests de servicios y generación de documentación

El último paso es implementar los tests de integración de los servicios que además de testear la funcionalidad completa de los mismos, nos permitirá generar la documentación asociada según los criterios que indiquemos en dicha implementación.

Para testear los servicios web usamos MockMVC de Spring, que implementa un cliente HTTP que nos permite invocar dichos servicios y validar los códigos de respuesta HTTP recibidos así como el contenido de la respuesta.

Al mismo tiempo inicializamos la generación de la documentación usando la API de Spring REST Docs y especificamos los campos obligatorios de entrada de datos o los campos de los datos de retorno para los servicios relacionados.

 5. Asciidoctor

Definimos en un fichero de texto plano el contenido y el formato de la página HTML que se generará como índice de nuestra documentación. Para ello usamos la sintaxis de Asciidoctor. Además seguimos recomendaciones de buenas prácticas relacionadas con la redacción de este tipo de documentación, a saber:

  • Indicar en un apartado diferente los distintos tipos de códigos de respuesta HTTP y su significado
  • Indicar en un apartado diferente los tipos de métodos HTTP usados y su significado
  • Indicar el tipo de respuesta recibida cuando se generar un error
  • Para cada servicio web documentado, indicar un ejemplo de invocación de la URL usando curl, ejemplos de petición y respuesta HTTP y si fuera necesario, el significado de los campos de entrada y salida de los datos usados. Esta información es la que genera de forma automática Spring REST Docs en cualquier caso, salvo la descripción de los campos de entrada y/o salida, que tendríamos que especificar en cada test si queremos que se genere

La ruta al fichero se incluye en el plugin de Asciidoctor para Maven, en el pom.xml.

 6. Ejecución de tests y generación de documentación

Configuramos los plugin de Maven en el pom.xml para que se ejecute la generación de la documentación al generar un nuevo “release” de la aplicación, es decir, cuando se invoque el goal “package” de Maven. Previamente se ejecutarán los tests de forma automática. Si falla el test o la generación de la documentación para un servicio dado, se indicará en la salida por consola y no se generará ni el release ni la documentación de ninguno de los servicios.

Maven goals

Maven goals

7. Visualización de la documentación generada

La documentación se genera en la ruta indicada en el plugin de Maven (ver arriba). Por un lado se generan los “snippets” que es la documentación que corresponde a cada servicio, y por otro una página principal o índice HTML que enlaza a esso “snippets” según hayamos indicado en el fichero de texto plano que define la página y que se describe en el punto 5.

Índice generado

Índice generado

Descripción de los servicios web

Descripción de los servicios web