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

Instalar el entorno de desarrollo de Cocos2dx en Linux para Android (Parte 2)

Hola de nuevo, si fuiste capaz de acabar la primera parte y aun tienes ánimos para seguir, aquí esta la segunda. En esta vamos a montar la app TestCpp de Cocos2dx para Android. Será mucho mas cortito que el anterior.

Pero primero vamos a hacer un debug del HelloCpp. No por nada, sino porque a mi en mi Debian me falla el debug XD. Recibo el siguiente error: Error while launching command: gdb –version. Y después de un rato me he percatado de que literalmente no tengo instalado, http://www.gnu.org/software/gdb/ y al parecer es necesario para hacer debug XD, tan fácil como:  sudo apt-get install gdb

Para compilar en Android lo primero es definir un par de variables de entorno dentro de nuestro Eclipse. La primera COCOS2DX la definimos en Eclipse->Preferences->General->Workspace->Linked Resources hacemos click en el botón New y apuntamos la variable al directorio raiz donde hemos descomprimido Cocos2dx.

La segunda variable que vamos a definir apunta a ruta donde hemos descomprimido nuestro NDK, NDK_ROOT y la vamos a definir en Eclipse->Preferences->C/C++->Build->Environment. Hacemos click en Add y especificamos como valor la carpeta donde descomprimimos el NDK.

Si como yo estáis compilando el proyecto TestCpp con la última versión de Android, puede que el NDK os de el siguiente error android-ndk-r8e/build/core/add-application.mk:128: Android NDK: WARNING: APP_PLATFORM android-14 is larger than android:minSdkVersion 8 in ./AndroidManifest.xml, este error lo podemos saltar modificando el fichero add-application.mk y en la linea 128 como se indica, cambiando $(call __ndk_warning por $(call __ndk_info.

Hecho esto, trata de compilar el proyecto TestCpp, obtendrás una salida por consola parecida a esta pero mucho mas larga :-).

Una vez terminado el proceso de compilación, arrancamos la app normalmente y todo debería funcionar correctamente.

SC20130717-214505

Gracias por aguantar hasta el final, en la nueva serie de post que voy a escribir, explicaré como montar un sistema de integración continua en general y para Android en particular.

¡Hasta pronto!

Instalar el entorno de desarrollo de Cocos2dx en Linux para Android (Parte 1)

Voy a explicar los pasos a seguir para instalar el entorno de desarrollo de Cocos2dx en Linux para trabajar con Eclipse y Android. Iremos desde lo básico hasta compilar y ejecutar los ejemplos HelloCpp en Linux y TestCpp en Android. Parto de que tienes conocimientos de Android, C++, Linux y tienes ya instalado un eclipse con Android configurado para trabajar. Por comodidad tengo incluido unos paths en mi .bashrc que utilizaré durante el tutorial, de esta forma por ejemplo puedo llamar al “adb” de Android desde cualquier terminal. Para añadirlos solo tenemos que situarnos en nuestro home y con nuestro editor favorito modificar el .bashrc nano .bashrc, y añadir las siguientes lineas:

Finalmente para hacerlo efectivo ejecutamos el comando source .bashrc Lo primero es instalar el plugin de Eclipse para C++, el Eclipse CDT, para ello tenemos dos formas, la primera buscarlo directamente en el Marketplace de eclipse Help > Eclipse Marketplace..”, la segunda utilizando el update site http://download.eclipse.org/tools/cdt/releases/juno. A continuación vamos a descargarnos la última versión de Cocos2dx de su página oficial (http://www.cocos2d-x.org/projects/cocos2d-x/wiki/Download), en nuestro caso la versión 2.1.4, y la última versión del NDK de Android (http://developer.android.com/tools/sdk/ndk/index.html), descomprimimos ambos ficheros en una carpeta a nuestra elección, en mi caso la carpeta “Programas”.

Ahora tenemos que definir una serie de variables de entorno editando nuevamente el fichero .bashrc de nuestro home nano .bashrc.

Nuevamente hacemos efectivos los cambios con source .bashrc Debéis estar seguros de tener instalados el JDK ya que sera necesario en los siguientes pasos. Si no lo tenéis instalado comprobad que versión de java tenéis con java -version, en mi caso tengo la 6, e instalar el JDK correspondiente, en mi caso sudo apt-get install openjdk-6-jdk.

Ahora empieza la parte divertida. Vamos instalar las dependencias necesarias para que Cocos2dx funcione, previamente si no lo habíamos instalado, debemos instalar el paquete de build essentials y el ia32-libs, consultar mi anterior post. Una vez hecho esto, lanzamos el script “make-all-linux-project.sh”, que se encuentra en la raiz de la carpeta de Cocos2dx que hemos descomprimido:  sudo bash make-all-linux-project.sh. Cuando el proceso haya finalizado, para saber si todo ha ido bien nos dirigimos a la carpeta “cocos2d-x-2.1.4/samples/Cpp/HelloCpp/proj.linux/bin/release” y ejecutamos el HelloCpp: ./HelloCpp. Si ves una ventana con el logo de Cocos2dx y el texto “Hello World” podemos continuar con el siguiente paso.

Ahora vamos a hacer que esto mismo funcione en eclipse para desarrollar más cómodamente. Para eso lo primero es importar el conjunto básico de proyectos necesarios para trabajar con Cocos2dx en Linux y Android, para ello sobre el Project Explorer de la perspectiva C/C++ de Eclipse, hacemos click derecho y seleccionamos la acción de “Import…” y en el desplegable seleccionamos “General > Existing Projects into Workspace”. Hacemos click en “Browse” y seleccionamos la carpeta raiz de Cocos2dx. Una vez que nos aparezca la lista completa hacemos click sobre “Deselect All” y de la lista seleccionamos solo los siguientes:

  • libBox2D – (proj.linux)
  • libChipmunk – (proj.linux)
  • libcocos2d – (proj.linux)
  • libcocos2dx – (android/java)
  • libCocosDenshion – (proj.linux)
  • libExtension . (proj.linux)
  • HelloCpp – (proj.linux)
  • TestCpp – (proj.android)

A priori parece una lista obvia, pero me llevo un buen rato averiguar exactamente cuales eran los  proyectos que me hacían falta la primera vez. Pero lo que resulto ser una perdida de tiempo fue mi desconocimiento del plugin CDT. Como tengo una distribución de Linux de 64bits, cuando compilaba por consola no tenia problemas, sin embargo en eclipse fallaba todo por culpa de las dependencias. Tras revisar los scripts que lanzaba el “make-all-linux-project.sh” y poner a mano todas las dependencias para que los proyectos compilasen, descubrí que cada proyecto de C++ tenía una configuración para 64 bits lista para ser utilizada dentro de Eclipse. Por ello los siguientes pasos solo tendréis que llevarlos a cabo si vuestro sistema operativo es de 64 bits. Adjunto imágenes.

Main Menu Home Logo

Vamos a ir compilando los proyectos en el mismo orden de la lista, y según vaya encontrando detalles los iré indicando.

  • Compilamos libBox2D sin problemas
  • Compilamos libChipmunk sin problemas
  • En la librería libcocos2d nos encontramos el primer problemilla, existe un error de dependencias con una librería estática, libxml2.a. Este problema se soluciona rápido, en las propiedades del proyecto C/C++ Build > Settings. De GCC C++ Compiler > Includes y de GCC C Compiler > Includes quitamos la dependencia con la libreria ../../../cocos2dx/platform/third_party/linux/libxml2. De GCC C++ Linker > Miscellaneous quitamos ../../../cocos2dx/platform/third_party/linux/libraries/lib64/libxml2.a. Ya he hecho un pull request al proyecto para subsanar el error https://github.com/cocos2d/cocos2d-x/pull/3019.
  • En la librería libCocosDenshion, ocurre algo curioso, después de arreglar todas las dependencias, al compilar en eclipse os saldrá una lista interminable de errores del tipo “…multiple definition of…” relacionados con las clases SimpleAudioEngineFMOD.cpp y SimpleAudioEngineOpenAL.cpp. Sin embargo, por consola funciona, así que analicé el Makefile y descubrí que en función de tus dependencias ya instaladas incluye uno u otro fichero a la hora de compilar. Supongo que existe una forma más elegante, pero no conozco lo suficiente el plugin CDT para hacer inclusiones condicionales, por lo que opte por borrar uno de los dos simplemente. Yo me quedé con SimpleAudioEngineFMOD.cpp, si decides quedarte con SimpleAudioEngineOpenAL.cpp y te pide algunas dependencias (en mi caso las pedía en Debian) debes instalar lo siguiente:
  • El proyecto libextension también nos dará problemillas. Llegados a este punto, reconozco que este problema es nuevo de esta ultima versión, la 2.1.4. Esta nueva entidad WebSocket no estaba antes y necesita de una dependencia que no existe “libwebsockets.h”.

    Fe de erratas (06/07/2013)
    <ERROR>
    Y de nuevo ¿por qué funciona con la consola?, pues está claro ¿no?, porque la entidad no está incluida como source en el Makefile :-). Por lo que vamos a borrar ambos WebSocket.h y WebSocket.cpp del “Project Explorer” de eclipse. </ERROR>
    Si que hay una forma de instalar la librería “libwebsockets” 🙂 y la razón por la que funciona por linea de comandos es porque no está en el Makefile. Para instalar la librería seguid los pasos que indico en este nuevo post , no lo pongo en este mismo post porque creo que ya es suficientemente grande :-).

    Pero aún así parece que no es suficiente :-), no encuentra SimpleAudioEngine.h, esta es fácil, conozco la respuesta, tan solo tenemos que acceder a las propiedades C/C++ Build > Settings y en la sección GCC C++ Compiler > Includes añadir ../../../CocosDenshion/include. He hecho el correspondiente pull request https://github.com/cocos2d/cocos2d-x/pull/3034

  • Y llegamos por fin al proyecto HelloCpp, y tras compilar recibimos el fallo:

    En este punto y dado que las otras versiones no me han provocado este error, tuve que investigar un rato. Después de más de una hora descubrí unas cuantas cosas. Primero, que esos dos elementos están definidos en ccFPSImages.h y ccFPSImages.c. Segundo, que por linea de comandos funciona, porque como ya supondréis esta incluido en el Makefile. Y tercero que en eclipse no va porque literalmente no se incluye en el .so que genera el proyecto libcocos2d. Esto se soluciona añadiendo estos dos elementos a la lista de “LinkedResources” en las properties del proyecto, dentro de la opcion “Resources”. Como no he descubierto como se hace con la interfaz de eclipse, directamente he editado el .project y he añadido la siguientes lineas dentro de la sección <linkedResources>. Aquí tenéis el link al pull request correspondiente: https://github.com/cocos2d/cocos2d-x/pull/3035

    Ahora sí es la buena, refrescamos, hacemos un clean y volvemos a compilar el proyecto libcocos2d, y hacemos el mismo proceso para el proyecto HelloCpp. Y si todo ha ido bien, y no estáis a punto de suicidaros, debería de ejecutarse una ventanita como esta:

Bueno creo que es suficiente para la primera parte 🙂 . En la segunda parte veremos como arrancar el proyecto TestCpp en un dispositivo Android. Muchas gracias por llegar hasta el final de este interminable post.

Instalar el entorno de desarrollo de Android en Debian 7 (Wheezy)

En este post voy a describir los pasos que he seguido para instalar el entorno de desarrollo de Android en Debian 7 (Wheezy).

En primer lugar vamos a cambiar la lista de repositorios a los que podemos acceder, para ello editamos el fichero sources.list

Comentamos la entrada correspondiente al cd o cds de instalación, en mi caso

Y al final de cada linea correspondiente a los repositorios de debian añadimos “non-free contrib”, por ejemplo:

A continuación, vamos a instalar el paquete esencial que necesitaremos para compilar algunas cosillas  apt-get install build-essential.

El siguiente paso solo será necesario, si como en mi caso estáis utilizando una Debian de 64 bits. Para que el sdk de Android funcione necesitamos instalar las ia32-libs. Para ello, el package manager de Debian debe saber que queremos instalar paquetes de otra arquitectura, la i386, utilizando el comando dpkg.

La linea 4 es opcional, en mi caso me solicitaba esos paquetes.

Ahora solo nos falta descargar el eclipse (http://www.eclipse.org/downloads/), el SDK (http://developer.android.com/sdk/index.html#download), descomprimirlos, instalar el plugin ADT de eclipse con el update site (https://dl-ssl.google.com/android/eclipse/) y finalmente decirle al plugin ADT donde hemos descomprimido el SDK.

Espero que os sirva!!