Continuous Delivery (y 3) Sesión 11a
2
Entornos de prueba La última parte de la tubería de despliegue consiste en probar los builds compilados en distintos entornos de prueba Distintos entornos Tests de integración y aceptación UAT Tests de capacidad Producción A su vez, cada uno de ellos puede tener distintas configuraciones y estar formado por múltiples máquinas Pruebas con distintos clientes y navegadores Pruebas con distintas bases de datos y servicios (si se va a desplegar la aplicación en distintos entornos de producción) 3
Desplegar de la misma forma Es esencial usar el mismo proceso para desplegar en los distintos entornos Características diferentes de los entornos Distintas IP (como mínimo) Distintos sistemas operativos Distinta configuración del middleware (localización de las bases de datos y servicios externos) El script de despliegue debería ser el mismo en todos los entornos: 1. Configurar el entorno 2. Desplegar los binarios 3. Pruebas de humo Los entornos deben tener siempre la misma configuración inicial, dependiente solo de los tests que se quieren realizar 4
Gestión de entornos de prueba y producción Cuanto menos control tenemos sobre el entorno en el que el código se ejecuta, más probabilidades hay de comportamientos no esperados Nos interesa tener control sobre todos y cada uno de los bits del entorno en el que se despliega nuestra aplicación Los cambios en los entornos deben realizarse sólo mediante procesos automatizados y registrados En cada entorno se debe definir claramente (y guardar en el control de versiones): Configuración Software que se despliega Topología de la red Estado El objetivo final es necesitar solo dos parámetros para realizar el despliegue: Identificador del entorno de despliegue Identificador del build a desplegar 5
Herramientas de empaquetado En cada entorno hay que desplegar: Conjunto de ficheros binarios Ficheros de configuración Ficheros estáticos en el control de versiones Es muy recomendable utilizar un sistema de empaquetado para desplegar la aplicación en el entorno: RPMs en el mundo Linux Cada release se empaqueta y se sube a un repositorio Las herramientas de gestión de entornos se encargan de instalar el paquete de la misma forma que instalan el resto de software 6
Virtualización de entornos La virtualización permite crear y configurar distintos entornos en una única máquina física Muy económico Entornos controlables Ejecuciones repetibles Software más popular VirtualBox (Oracle) vsphere Hypervisor (VMware) 7
Vagrant Software open source, creado por Mitchel Hashimoto (@mitchellh) Escrito en Ruby Permite automatizar la creación, puesta en marcha, configuración y aprovisionamiento de entornos virtuales Vagrant web site 8
Instalación de Vagrant Funciona inicialmente con VirtualBox Fácil instalación mediante paquetes nativos del SO Se instala el comando vagrant Posibles comandos: 9
Inicializando y descargando una box Se crea un directorio y se ejecuta el comando vagrant init para crear un fichero Vagrantfile que contiene una configuración por defecto $ mkdir prueba-vagrant $ cd prueba-vagrant $ vagrant init Se descarga una máquina virtual vacía (box) de una URL con el comando vagrant box add nombre URL $ vagrant box add precise32 http://files.vagrantup.com/precise32.box Downloading box from URL: http://files.vagrantup.com/precise32.box Extracting box...te: 568k/s, Estimated time remaining: 0:00:02)) Successfully added box 'database' with provider 'virtualbox' 10
Boxes Las boxes son esqueletos de máquinas virtuales de la plataforma de virtualización con la que Vagrant esté trabajando Lista de boxes oficiales: https://github.com/mitchellh/vagrant/wiki/available-vagrant-boxes Lista de boxes de la comunidad: http://www.vagrantbox.es Contienen lo básico para poder poner en marcha Vagrant: Gestor de paquetes ssh Usuario ssh Chef o Puppet (aunque no es necesario, lo veremos después) Se guardan en el directorio ~/.vagrant.d/boxes 11
Cómo usar una box Un primer ejemplo Fichero Vagrantfile Vagrant.configure("2") do config config.vm.box = "precise32" end Para poner en marcha la máquina virtual y conectarse por ssh: $ vagrant up $ vagrant ssh 12
Carpeta compartida Vagrant comparte automáticamente el directorio de la máquina host (el directorio con el fichero Vagrantfile) en el directorio /vagrant de la máquina virtual $ vagrant up Bringing machine 'default' up with 'virtualbox' provider... [default] Booting VM... [default] Waiting for machine to boot. This may take a few minutes... [default] Machine booted and ready [default] Mounting shared folders... [default] -- /vagrant [default] VM already provisioned. Run `vagrant provision` or use `--provision` to force it $ vagrant ssh Welcome to Ubuntu 12.04 LTS (GNU/Linux 3.2.0-23-generic-pae i686) * Documentation: https://help.ubuntu.com/ Welcome to your Vagrant-built virtual machine. Last login: Fri Sep 14 06:22:31 2012 from 10.0.2.2 vagrant@precise32:~$ pwd /home/vagrant vagrant@precise32:~$ ls /vagrant Vagrantfile 13
Aprovisionamiento Es posible automatizar la instalación de software en las máquinas virtuales definiendo un script en el fichero bootstrap.sh en el mismo directorio del Vagrantfile: #/usr/bin/env bash apt-get update apt-get install -y apache2 rm -rf /var/www ln -fs /vagrant /var/www Y añadiendo una instrucción en Vagrantfile: Vagrant.configure("2") do config config.vm.box = "precise32" config.vm.provision :shell, :path => "bootstrap.sh" end 14
Puesta en marcha El comando vagrant reload --provision vuelve a lanzar la máquina virtual y ejecuta el aprovisionamiento: $ vagrant reload -provision... se ejecuta el script bootstrap.sh $ echo "Hola mundo" > hola.txt $ vagrant ssh vagrant@precise32:~$ wget -qo- 127.0.0.1/hola.txt Hola mundo 15
Configuración de la red El fichero Vagrantfile permite también configurar la red de la máquina virtual con distintas opciones Reenvío de puertos Asignación de dirección IP estática Definición de redes privadas entre máquinas (documentación de Vagrant) Ejemplo de reenvío de puertos Vagrant.configure("2") do config config.vm.box = "precise32" config.vm.provision :shell, :path => "bootstrap.sh" config.vm.network :forwarded_port, host: 4567, guest: 80 end Si hacemos vagrant reload podremos acceder en la máquina host al servidor web en http://127.0.0.1:4567 16
Múltiples máquinas Es posible controlar distintas máquinas con un único Vagrantfile Vagrant.configure("2") do config config.vm.provision "shell", inline: "echo Hello" config.vm.define "web" do web web.vm.box = "apache" end config.vm.define "db" do db db.vm.box = "mysql" end end Es posible arrancar, conectarse, etc. a cualquier máquina con vagrant up <machine-name> Es posible comunicar una máquina con otra a través de la red privada 17
Otros comandos vagrant halt: para la máquina vagrant destroy: elimina el estado de la máquina (no borra la box) vagrant status: muestra el estado de las máquinas 18
Herramientas de gestión de entornos Por defecto la configuración (aprovisionamiento) de la máquina Vagrant se hace con un script de shell Es posible utilizar otras herramientas de mayor nivel, independientes del shell y del SO usado, como Puppet o Chef Vagrant.configure("2") do config config.vm.provision "puppet_server" do puppet puppet.puppet_server = "puppet.example.com" puppet.puppet_node = "node.example.com" puppet.options = "--verbose --debug" end end 19
Introducción a Puppet Permite automatizar la gestión toda la infraestructura de máquinas de una empresa Terminología: Nodo: máquina que mantiene una configuración determinada Puppet master: servidor de Puppet que chequea la configuración de los nodos cada 30 minutos Puppet agent: agente de Puppet que se ejecuta en cada nodo y se comunica con el Puppet master Estado deseado: Configuración definida para cada uno de los nodos Cada nodo envía al Puppet master datos sobre su estado actual Si un nodo no se encuentra en la configuración deseada, el maestro le envía detalles de su configuración y el agente realiza los cambios necesarios en el nodo para volver al estado deseado 20
Introducción a Puppet http://puppetlabs.com/puppet/what-is-puppet 21
Introducción a Puppet http://puppetlabs.com/puppet/what-is-puppet 22
Descripción de la configuración de un nodo La configuración de un nodo se describe mediante la definición de recursos Cada recurso es una instancia de un tipo de recurso, tiene un nombre, unos atributos (definidos por el tipo) y unos valores para cada atributo Puppet usa su propio lenguaje para definir los recursos user { 'dave': ensure => present, uid => '507', gid => 'admin', shell => '/bin/zsh', home => '/home/dave', managehome => true, } En los recursos se define el estado deseado 23
Tipos de recursos Es conveniente tener a mano la chuleta de tipos de recursos The Trifecta file package service Otros importantes notify exec cron user group 24
Consola de administración La versión enterprise de Puppet (gratuita hasta 10 nodos) tiene herramientas y utilidades para simplificar la gestión, como la consola de administración 25
Vídeo de Puppet enterprise http://www.youtube.com/watch?v=j8imf23jzag#t=1 26
Lecturas Jez Humble, Continuous Delivery, pp. 152-168 27