Hacer backups de datos con Ansible en Linux y Windows (Parte 1)

En este post voy a explicar como conectarte con Ansible a una maquina windows y otra linux (parte 2) para realizar backups. En mi empresa Genera Games gestiono todos los procesos con un proyecto de Python al que he bautizado como Professor-X. Cada módulo del proyecto es un miembro de la Imposible Patrulla X, que realiza una tarea específica. En este post voy a hablar de Wolverine, que se encarga de gestionar los backups en mi oficina.

El primer paso es crearte tu entorno virtual de Python 3 con el comando virtualenv wolverine -p python3 . Una vez instalado hay que instalar las siguientes dependencias:

Ahora podemos probar a hacer un playbook pequeño que se conecte  al windows que hayas elegido y haga un ipconfig. El playbook pb-wintest-data.yml tendría el siguiente contenido:

En hosts ponemos el nombre del grupo de maquinas a  las que vayamos a acceder, que luego utilizaremos para listar las ip de las mismas. Ese mismo nombre se utiliza luego en el directorio group_vars para definir variables que afecten a ese grupo de maquinas. El fichero inventory contendrá la siguiente información:

En la carpeta group_vars deberías tener un fichero all.yml que serán variables comunes a todos los playbooks y un fichero wintest.yml cuyo contenido debe ser:

Aún me queda averiguar como configurar Active Directory para que admita ssl y valide el certificado. Por ahora lo haremos “inseguro”. Si intentamos ejecutar el playbook con  ansible-playbook -i ../inventory pb-wintest-data.yml -vvvv. Pongo “-vvvv” porque quiero que salga toda la información posible de los errores que no van a salir hasta que ya funcione, cuando funcione no ponemos nada para evitar logs largos. La salida que os debería dar es la siguiente:

Para arreglar este error tenemos que llevar a cabo varios pasos:

  • Habilitar en el firewall de la maquina destino los puertos de Windows Remote Management (puertos 5985 y 5986). Para eso entramos en la configuración avanzada del Firewall de Windows.
  • Ejecutar el script que proporciona ansible para configurar un host de windows para la administración remota ConfigureRemotingForAnsible.ps1
  • En nuestro caso como aún no hemos configurado certificados ni tráfico seguro debemos ejecutar también el comando:  winrm set winrm/config/Service '@{AllowUnencrypted = "true"}'  para comprobar que ha funcionado imprimimos la configuración del winrm con el comando  winrm get winrm/config

Si todo ha funcionado deberíamos ver el resultado de ejecutar en la máquina remota el comando ipconfig /all.

Una vez establecida la conexión vamos a hacer lo que a priori parece sencillo: nos conectamos a la maquina remota, comprimimos lo que queremos guardar en un zip y hacemos un rsync a una máquina que hayamos elegido para guardar nuestros backups. Pero en windows esto puede ser un poco lioso, para empezar si intentamos hacer un rsync del tirón vamos a obtener un error en powershell. Para conseguir rsync, debemos instalar cygwin y para conseguir instalarlo debemos instalar chocolatey. Chocolatey es un gestor de paquetes para windows y tiene un rol en ansible (win_chocolatey) que permite hacer fácil su instalación por lo que vamos a empezar a añadir a playbook mas tasks.

La segunda task la utilizaremos bastante para obtener información de lo que hay instalado y de lo que se han instalado. Ahora tenemos que instalar el cygwin y el cyg-get para poder instalar paquetes adicionales en cygwin

Una vez hecho esto instalamos el openssh y el rsync para poder realizar el rsync por ssh. Además debemos crear un enlace simbólico desde la ruta del home del user del ordenador a la del user de cygwin para poder hacer los rsync.

Con esto ya estamos preparados para poder hacer un rsync a otra maquina por ssh. Nos falta instalar un software de compresión de ficheros que sea sencillo de manejar por linea de comandos, he escogido el 7zip. Lo instalamos igualmente con chocolatey y lo añadimos al path.

Para comprimir voy a utilizar un script de ps1 que he encontrado en github. Se puede utilizar para hacer backups incrementales o como en mi caso completo siempre, para lo cual hay que borrar un fichero que guarda por donde habiamos dejado el incremental de nombre backupconfig.ini

Ahora ya solo falta hacer el rsync propiamente dicho para ello tenemos que realizar dos pasos previos: primero creamos las claves ssh para el usuario de esa máquina ya que la clave publica deberá ser alojada en al maquina hacia la que vamos a hacer el rsync como authorized_keys y segundo añadimos la fingerprint de la maquina destino al known_hosts de la maquina origen, para ello utilizamos la siguiente task.

Para crear la clave ssh utilizamos el comando  ssh-keygen -t rsa -b 4096  el contenido del fichero id_rsa.pub ira al fichero .ssh/authorized_keys de la maquina destino. Con esto podremos realizar el rsync sin que nos solicite contraseña. Finalmente realizamos el rsync de los ficheros 7z que contenga la carpeta backup y los borramos una vez haya terminado

Y hasta aquí como hacer en Windows los bacukps con Ansible. En la parte 2 veremos como hacerlo en linux que es mucho mas sencillo 🙂

Referencias

  • http://docs.ansible.com/ansible/intro_windows.html
  • https://github.com/traschke/7z-backup/blob/master/backup.ps1
  • https://github.com/ansible/ansible/blob/devel/examples/scripts/ConfigureRemotingForAnsible.ps1
  • http://www.virtualtothecore.com/en/configuring-windows-machines-for-ansible/
  • http://www.techrepublic.com/blog/the-enterprise-cloud/set-the-powershell-execution-policy-via-group-policy/
  • https://www.404techsupport.com/2012/10/use-group-policy-to-allow-ping-and-remote-management-on-windows-7/
  • https://wyssmann.com/my-first-steps-with-ansible/
  • http://nokitel.im/index.php/2016/11/09/how-to-manage-windows-server-2016-with-ansible/
  • https://github.com/diyan/pywinrm
  • https://github.com/spencergibb/ansible-osx
  • https://github.com/ultimateboy/ansible.osx
  • https://github.com/lafarer/ansible-role-osx-defaults
  • https://github.com/geerlingguy/ansible-role-nodejs/issues/30
  • https://github.com/mas-cli/mas/issues/70
  • https://blog.vandenbrand.org/2016/01/04/how-to-automate-your-mac-os-x-setup-with-ansible/
  • https://github.com/ansible/ansible/issues/16478
  • http://www.grouppolicy.biz/2014/05/enable-winrm-via-group-policy/
  • http://oriolrius.cat/blog/2015/01/29/ansible-and-windows-playbooks/
  • https://github.com/Homebrew/brew/blob/master/docs/How-to-Create-and-Maintain-a-Tap.md
  • https://blog.vandenbrand.org/2016/01/04/how-to-automate-your-mac-os-x-setup-with-ansible/
  • http://docs.ansible.com/ansible/playbooks_best_practices.html
  • http://answers.unity3d.com/questions/1280198/unable-to-list-target-platforms-cant-build-into-an.html
  • https://social.msdn.microsoft.com/Forums/windowsserver/en-US/fb154aea-33ee-4182-a345-66f88a6769bc/allowunecrypted-winrm-property?forum=windowssecurity
  • https://www.groovypost.com/howto/join-a-windows-10-client-domain/

 

Instalar Python 3 en Linux coexistiendo con Python 2

En este post voy a explicar como instalar Python 3 en Linux coexistiendo con Python 2. El primer paso es instalar las dependencias necesarias.

A continuación vamos a descargar de la web oficial y a descomprimir la ultima versión de Python 3 disponible en una carpeta a nuestra elección.

Nos situamos en dentro de la carpeta descomprimida y nos disponemos a compilar e instalar Python 3.

Finalmente para comprobar que todo ha ido bien ejecutamos  /opt/python3.3/bin/python3 y tenemos que obtener algo parecido a lo siguiente:

Además también tendrás nuevos comandos que podrás utilizar: python3python3.3. Para la gestión de módulos en Python3 vamos a instalar pip, pero para Python 3. Afortunadamente hay una paquete de Debian que nos resuelve esto, utiliza el siguiente comando para instalarlo  sudo apt-get install python3-pip.

Finalmente vamos a crear un entorno virtual de Python 3. Existen dos formas de llevar esto a cabo. La primera, la difícil, es especificando la ruta de la versión de Python que queremos virtualizar.

La segunda, más fácil, necesita que primero instalemos el modulo virtualenv utilizando pip3  sudo pip3 install virtualenv . Una vez este instalado, para crear entornos virtuales de Python 2 tendremos que usar virtualenv-2.7 y para crearlos de Python 3 virtualenv-3.3. Creemos uno de Python 3:

Una vez creado y seleccionado, podremos instalar nuevos modulos usando el comando pippip-3.3. Vamos a probar que todo funciona instalando django pip install django , arrancamos la consola de Python 3 y escribimos el siguiente código:

 

Web scraping con Python, Selenium, Lxml y PhantomJS

En este post voy a montar un ejemplo básico de web scraping con Python utilizando el navegador headless PhantomJS. En otras palabras voy a automatizar la extracción de información de una pagina web utilizando un navegador  que no tiene/necesita interfaz de usuario.

  • La forma mas cómoda de trabajar con Python es haciendo uso de los entornos virtuales utilizando el virtualenv. Para instalar todo esto en Linux (en mi caso Debian) hacemos:

    A continuación nos vamos a una carpeta a nuestra elección y ahí creamos y seleccionamos el entorno virtual utilizando los siguientes comandos.
  • Primer Test. Para realizar el scraping necesitamos instalar una serie de dependencias por un lado  selenium y por otro lxml. Para ello ejecutamos  pip install selenium y  pip install lxml dentro de nuestro entorno virtual. Si tenéis problemas instalando lxml es porque como a mí, os faltan dependencias. Por lo que tendreís que borrar el virtualenv que acabamos de crear

    Y a continuación instalar las siguientes dependencias necesarias para compilar el modulo lxml.

    Una vez instalado esto, volvéis a crear el virtualenv como hemos hecho antes, y dentro de él ejecutáis de nuevo la instalación de lxml. Si todo ha ido bien deberías ver al final algo como  Successfully installed lxml . Una vez realizado esto vamos a probar el siguiente código:

    Si lo guardamos en un fichero “test1.py” y lo ejecutamos dentro del virtualenv venv con  python test1.py  obtenemos la salida:
  • Segundo Test. Primero vamos a instalar PhantomJS siguiendo las instrucciones de phantomjs.org, en una carpeta a nuestra elección ejecutamos

    Una vez hecho esto nuestro código solo va a cambiar en la instanciación del browser. Además he especificado una una dimensión para la ventana del mismo por si tuviéramos que obtener datos para un tamaño concreto de ventana en el caso de que la información cambiase en función del mismo debido a un diseño responsive.

    Guardamos el código en un fichero “test2.py” y lo ejecutamos dentro de nuestro virtualenv con  python test2.py y obtendremos la misma salida pero no se nos abrirá ningún navegador.

 

Referencias