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/

 

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.