Intégration Gitlab-CI#

Objectif

Industrialiser la création d’images de machines virtuelles EC2.

Note

Cet exercice a été validé sur gitlab.com, le service SaaS de GitLab. Il vous faut créer un compte gratuit sur sur gitlab.com en pré-requis, ou utiliser votre compte personnel si vous en possédez déjà un.

Notre image doit comporter tout le nécessaire pour construire des AMI AWS.

Créez un projet GitLab vierge. Ce projet comportera un fichier Packer, un playbook Ansible et son requirements.yml pour la gestion des dépendances.

Fichier quick-start.pkr.hcl#

VPC par défaut

Le fichier de configuration Packer suivant fonctionne dans le cas où le VPC par défaut existe dans le compte AWS cible. Si vous ne disposez pas de VPC par défaut, utilisez le fichier de configuration n°2.

  • Exemple n°1 (VPC par défaut requis) :

packer {
  required_plugins {
    amazon = {
      version = ">= 1.0.8"
      source  = "github.com/hashicorp/amazon"
    }
  }
}

locals { timestamp = regex_replace(timestamp(), "[- TZ:]", "") }

source "amazon-ebs" "quick-start" {
  ami_name      = "packer-example ${local.timestamp}"
  instance_type = "t2.micro"
  region        = "eu-west-1"
  source_ami    = "ami-0a2616929f1e63d91"
  ssh_username  = "ubuntu"
}

build {
  sources = ["source.amazon-ebs.quick-start"]

  provisioner "ansible" {
    playbook_file   = "ansible/playbook.yml"
  }
}

Choix du VPC

Le fichier de configuration Packer suivant fonctionne dans le cas où le VPC par défaut n’existe pas. Dans ce cas, vous devez spécifier à Packer le VPC et le sous-réseau à utiliser.

  • Exemple n°2

source "amazon-ebs" "quick-start" {
  ami_name      = "packer-example ${local.timestamp}"
  instance_type = "t2.micro"
  region        = "eu-west-1"
  source_ami    = "ami-0a2616929f1e63d91"
  ssh_username  = "ubuntu"

  subnet_filter {
    filters = {
      "tag:Name" = "<Valeur du tag:Name du sous-réseau à utiliser>"
    }
    most_free = true
    random    = false
  }

  vpc_filter {
    filters = {
      cidr       = "<CIDR du VPC à utiliser>"
      isDefault  = "false"
      "tag:Name" = "<Valeur du tag:Name du VPC à utiliser"
    }
  }
}

build {
  sources = ["source.amazon-ebs.quick-start"]
  provisioner "ansible" {
    
    playbook_file   = "ansible/playbook.yml"
  }  
}

Fichiers Ansible#

Organisez les fichiers Ansible en suivant les bonnes pratiques présentées ici.

Ajoutons le playbook ansible/playbook.yml suivant :

- hosts: "{{ target|default('all') }}"
  become: true
  roles:
    - ansible-role-security
  tags:
    - security

Le rôle ̀ansible-role-security est un rôle public qui permet de configurer et ajouter des paramètres de sécurité basiques. Ajoutons le rôle dans le fichier ansible/requirements.yml :

- src: https://github.com/geerlingguy/ansible-role-security.git
  scm: git
  version: "2.1.0"

À ce stade vous devriez avoir l’arborescence suivante dans votre projet GitLab :

.
├── README.md
├── ansible
│   ├── playbook.yml
│   └── requirements.yml
└── quick-start.pkr.hcl

1 directory, 4 files

Configuration Gitlab-CI#

Dans le menu Settings –> CI/CD déroulez la section Variables afin d’ajouter les variables d’environnement suivantes :

  • AWS_ACCESS_KEY_ID

  • AWS_SECRET_ACCESS_KEY

  • AWS_DEFAULT_REGION

Maintenant que les variables sont ajoutées, il nous reste à définir les actions dans la pipeline. Pour cela il suffit d’ajouter un fichier .gitlab-ci.yml comme suit :

# https://docs.gitlab.com/ee/development/cicd/templates.html
# This specific template is located at:
# https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Packer.gitlab-ci.yml

image:
  name: stelar/packer_ansible_build:latest
  
before_script:
  - packer --version
  - find . -maxdepth 1 -name '*.pkr.hcl' -print0 | xargs -t0n1 packer init

stages:
  - validate
  - build
  - test
  - deploy

validate:
  stage: validate
  script:
    - find . -maxdepth 1 -name '*.pkr.hcl' -print0 | xargs -t0n1 packer validate

build:
  stage: deploy
  environment: production
  before_script:
    - ansible-galaxy install -r ansible/requirements.yml -p ./ansible/roles --force
  script:
    - find . -maxdepth 1 -name '*.pkr.hcl' -print0 | xargs -t0n1 packer build
  rules:
    - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
      when: manual

Ce fichier de configuration de CI/CD est largement basé sur le modèle disponible en lien en haut du fichier.

On utilise une image Docker qui contient tout le nécessaire dont Packer, Ansible et Awscli.

Ligne d’arrivée#

Féliciations, vous venez de configurer votre première chaîne d’intégration et de déploiement continus pour la construction des AMI AWS via Packer et Ansible !

Mais attention, il reste encore du chemin avant d’aller en production ! En effet, nous avons posé les bases, nous irons plus loin dans une prochaine section.