sábado, marzo 27, 2021

Probando Ansible Playbook en un Docker Container con Gitlab

 Estoy probando ansible y quería tener un setup sencillo para que gitlab hiciera pruebas del código en un contenedor de docker a través de un pipeline, por el momento aquí dejo algo sencillo, tengo este playbook:


simple_playbook.yml

---
- hosts: all
  connection: local
  tasks:
          - name: curl instalation
            apt: pkg=curl update_cache=yes

La conexión es local para ya que no es necesario trabajar con llaves ssh al estar aplicando las pruebas al contendor cada vez.

el archivo .gitlab-ci.yml es el siguiente:

image: "tonymoyoy/ubuntu_ansible:v2"

stages:
    - build
    - test

build:
    stage: build
    script:
        - echo $HOSTNAME > hosts
        - echo "Running ansible playbook"
        - ansible-playbook -i hosts local-playbook.yml

test:
    stage: test
    script:
        - echo "Test pending"

La forma que logre que se ejecutara en el contenedor fue agregando el hostname a un archivo y luego haciendo referencia al archivo hosts como variable del comando ansible-playbook

En este caso use la variable HOSTNAME de gitlab-ci (ver https://docs.gitlab.com/ee/ci/variables/) aunque también pude simplemente usar el comando hostname y enviar el resultado a el archivo, intente hacer la llamada después del comando ansible-playbook pero no encontré una forma de hacerlo funcionar.

Espero que este material puede servir de referencia para alguien


martes, marzo 23, 2021

Creación de Imagen simple de Docker

 Requisitos: Tener cuenta en https://hub.docker.com


En tu maquina con docker previamente instalado crea en una carpeta de tu elección un archivo 

touch Dockerfile

vim Dockerfile

Incluye instrucciones como la imagen base (ubuntu) quien mantiene la imagen creada y en este caso un par de instrucciones para actualizar el sistema operativo e instalar ansible.

FROM ubuntu

MAINTAINER tonymoyoy

RUN apt-get update -y

RUN apt-get install ansible -y

Una vez creado y guardado el archivo, construye la imagen con el comando build, con -t le pongo un tag y el punto hace referencia a que el Dockerfile esta en el directorio de donde estoy corriendo el comando

docker build -t ubuntu_ansible .


Una vez creada la imagen la debes poder ver con el comando


tony@x220:~/docker/ansible$ docker images

REPOSITORY                    TAG                 IMAGE ID            CREATED              SIZE

ubuntu_ansible                latest              7988920ab754        8 seconds ago        300MB

Para subirla a docker hub es necesario hacer login con:

docker login

Utiliza tus credenciales de docker hub.

Ahora vuelve a tagear la imagen en este caso referenciada por si ID con un formato como el siguiente:

docker tag 7988920ab754 tonymoyoy/ubuntu_ansible:v1

Y con el siguiente comando puedes subir la image an docker hub:

docker push tonymoyoy/ubuntu_ansible:v1

Y listo, la debes de poder ver desde tu cuenta de docker hub




domingo, marzo 21, 2021

Instalacion de Gitlab (Community Edition) en Ubuntu 20.04

Recientemente instale Gitlab en una maquina personal con la finalidad de hacer algunas pruebas, me tope con varios problemas y decidí documentar como al final lo instale y cree un pipeline sencillo.

Varios de los problemas con los que me tope eran derivados de la validez del certificado que se intenta generar en la instalación de Gitlab y del dominio de DNS, si tienes un dominio valido y quieres utilizar un certificado puedes hacerlo, la instalación de Gitlab intentara crear uno con letsencrypt, pero para este caso no usare un certificado o un dominio.


Las instrucciones para la instalación de Gitlab Community Edition se encuentran aquí:

https://about.gitlab.com/install/?version=ce#ubuntu


sudo apt-get install -y curl openssh-server ca-certificates tzdata perl

Es opcional instalar y configurar el correo:

sudo apt-get install -y postfix

Con la siguiente instrucción puedes instalar Gitlab y definir el URL, en las instrucciones de Gitlab aconseja usar un dominio valido y el protocolo https, pero para fines de pruebas lo haremos con http y usare la dirección IP del servidor, (usa la ip de tu servidor)

sudo EXTERNAL_URL="http://192.168.1.210" apt-get install gitlab-ce

Igual esto se puede cambiar después desde el archivo:

/etc/gitlab/gitlab.rb

Editando el parametro external_url y reconfigurando gitlab:

sudo gitlab-ctl reconfigure


Con esto deberás tener tu servicio corriendo y puedes ir a http://localhost (o la ip de tu servidor) desde tu navegador web y tendrás que definir un password de root para Gitlab con el cual podrás administrar la aplicación

Para registrar un nuevo usuario puedes hacer logout del usuario root para volver a la pagina de login y ahí esta el botón de Register Now:



Por default los nuevos usuarios que se registren tienen que ser aprobados así que entras de nuevo como el usuario root 

Admin Area -> Users 

En esa sección encontraras un apartado llamado Pending Approval y ahí tienes la acción para aprobar al usuario recién creado 

El usuario nuevo ahora podrá hacer login,  y al ser la primera vez que este usuario esta entrando pedirá que te asignes un rol:





Una de las primeras cosas a realizar es agregar tu llave publica de SSH de la maquina donde estarías trabajando, esto lo puedes hacer en:

User Settings ->  SSH Keys


En caso de no tener una, usar el comando ssh-keygen

Al menos de que elijas otra localidad tu llave publica se encontrara en /home/usuario/.ssh/id_rsa.pub


Crea un nuevo Proyecto para comprobar la funcionalidad, elige Initialize repository with a README
para que el repositorio no este vacío.

Una vez creado el proyecto veras un botón Clone con la dirección para clonar el repositorio, si tu external_url es un dominio la dirección que veras aquí será en base a esa información, en mi caso estoy usando la dirección IP.



Desde tu maquina de trabajo clona el repositorio:

git clone git@192.168.1.220:jesus/ansible-hello2.git

Y crea estos tres archivos o una versión similar, yo aquí tengo la referencia a una maquina en mi red con la ip 192.168.1.210 a la cual entro con el usuario a6 y del cual tengo configuradas llaves de ssh, para fines prácticos este código no se usara en el pipeline aun.

hosts
192.168.1.210 ansible_user=a6
ping-playbook.yml
---
- hosts: all
  remote_user: a6
  tasks:
          - name: ping server
            ping:
.gitlab-ci.yml
build-job:
  stage: build
  script:
    - echo "Hello There!"

test-job1:
  stage: test
  script:
    - echo "This job tests something"

Empuja estos nuevos archivos a tu repositorio en Gitlab

git add hosts ping-playbook.yml .gitlab-ci.yml
git commit -a
git push

Los archivos hosts y ping-playbook.yml son parte un playbook de ansible muy simple, y el archivo .gitlab-ci.yml es un pipeline que solo manda unos mensajes, a continuación haremos el setup simplemente para que el pipeline se ejecute por los runners, configuraremos uno con docker.



Es necesario instalar docker

sudo apt-get install docker.io


Prueba que docker este funcionando:

sudo usermod -aG docker nombredetuusuario

Ejecuta un docker de prueba:

docker run hello-world


Ya que tengas docker instalado, instala lo siguiente gitlab-runner, los runners son los encargados de correr los Jobs de los pipelines, puedes tener distintos tipo, para este caso usaremos uno basado en docker.

 sudo apt-get install gitlab-runner


De regreso a Gitlab, ve a tu  proyecto

Settings -> CI/CD -> Runners

En esa sección encontraras las instrucciones para instalar y registrar un runner en:

Show Runner Installation Instructions

Veras algo como:

sudo gitlab-runner register --url http://192.168.1.220/ --registration-token JKuz82V6zA2maiaYsLs

De nuevo puedes ver que estoy usando http y no https y la ip en lugar de un dominio, el registration token en tu caso será diferente así como la ip de tu servidor

Entre las preguntas que necesitas contestar están las siguientes:

Please enter the executor: docker+machine, kubernetes, docker-ssh, parallels, shell, ssh, virtualbox, docker, docker-ssh+machine:
docker
Please enter the default Docker image (e.g. ruby:2.1):
ubuntu:latest
Runner registered successfully. Feel free to start it, but if it's running already the config should be automatically reloaded!

De regreso a 

Settings -> CI/CD -> Runners

Podrás ver los runners que tienes registrados


En este punto es posible que el pipeline se intente ejecutar o lo puedes ejecutar desde 

CI/CD -> Pipeline - Run Pipeline

Pero es posible que el pipeline falle porque no lo tome el runner:




 en mi caso no tenia la imagen de docker necesaria e intente descargarla aunque tuve el siguiente error:


tony@x220:~$ docker pull gitlab/gitlab-runner-helper
Using default tag: latest
Error response from daemon: manifest for gitlab/gitlab-runner-helper:latest not found: manifest unknown: manifest unknown

Encontre que alguien la pudo descargar de la siguiente forma

tony@x220:~$ docker run --rm -it gitlab/gitlab-runner-helper:x86_64-6d9dd510
Unable to find image 'gitlab/gitlab-runner-helper:x86_64-6d9dd510' locally
x86_64-6d9dd510: Pulling from gitlab/gitlab-runner-helper
614f111fed99: Pull complete
Digest: sha256:2731a347dfb90e2a93a63a9d5f61ee19860ebb6cfeb1258ffaf8fb7afae33133
Status: Downloaded newer image for gitlab/gitlab-runner-helper:x86_64-6d9dd510
docker: Error response from daemon: No command specified.
See 'docker run --help'.
tony@x220:~$ docker tag  gitlab/gitlab-runner-helper:x86_64-6d9dd510 gitlab-runner-helper:11.2.0
tony@x220:~$


Ahora que tienes la imagen del contenedor necesaria ve de nuevo a tu pipeline y intenta correr el Job atorado: Retry This Job


Aquí Gitlab pudo tomar la configuración de .gitlab-ci.yml y ejecutar las instrucciones:






En una segunda parte de este tema incluiré in pipeline que pruebe el código de ansible y otro que la aplique a algún host





jueves, agosto 06, 2020

Z & The Firemen's Ball

Recientemente pude avanzar un poco en el backlog de películas que tengo pero que no he visto, uno de mis hobbies es comprar DVDs de segunda mano en los sobre ruedas, no compro todo solo películas que ya vi que me gustan, clásicos de edición especial y cualquier que sea de The Criterion Collection.

The Firemen's Ball
Dir. Milos Forman
1967

Es una comedia que gira alrededor de un evento en el departamento de bomberos hay un concurso de belleza, rifas y un antiguo jefe de bomberos recibira un reconocimiento pero todo sale mal, aunque una comedia checoslovaquia es muy diferente a lo que estamos acostumbrados a ver en la actualidad pero verla desde el contexto en el cual fue realizada es interesante pues en su momento se considero una sátira al partido comunista sin mencionarlo directamente y eso sirve como una excusa para mirar The Firemen's Ball y la misma sátira puede aplicar en la actualidad.



Z
Dir. Costa-Gavras
1969

Z es un thriller que recrea en forma de ficcion eventos reales sobre el asesinato de un político griego en 1963, esta película es muy accesible su edición y musicalización son memorables y el manejo tema es algo que quisiera ver mas en películas de la actualidad pues no trata de esconder de que se está hablando sin embargo no se inclina hacia una temática de políticos de derecha vs politicos de izquierda ni es una biografía del político asesinado, simplemente narra hechos y vemos la corrupción en el ser humano. 




Ambas películas fueron un blind buy (es decir, no se nada de estas cintas) y las tuve por más de un año hasta que me di el tiempo de verlas, y ambas fueron una sorpresa agradable aunque desagradablemente uno puede ver que el mundo aún no ha cambiado mucho en los últimos 50 años.


En esta pandemia del COVID-19 me he refugiado en películas de los 90's y 80's y quise ir mas atrás pero por alguna razón vi muchos reflejos de situaciones actuales, creo que me quedaré en  el escapismo de otras décadas 

sábado, julio 18, 2020

python zip function

No me he dedicado a programar de tiempo completo pero me he mantenido activo con algunos proyectos personales, hace poco realice un script para el trabajo el cual funcionó bien aunque algunas partes no eran muy buenas.

Un ejemplo es una iteración como esta:

movies = ['The Abyss', 'Big', 'The Prestige', 'Boyhood', 'Brick']
years = [1989,1988,2006,2014,2005]

# ugly iteration
for movie in range(len(movies)):
print(str(movies[movie]) + " - " + str(years[movie]))

Necesitaba recorrer dos listas a mismo tiempo y generar información en otra lista en el mismo índice, aunque el ciclo funciona el codigo es feo


Despues encontre la función zip la cual permite hacer una iteración paralela, el ciclo puede quedar de esta forma:

for movie, year in zip(movies, years):
print(str(movie) + " - " + str(year))


lo cual es mas claro y el resultado es el mismo.


domingo, julio 15, 2012