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