1
0
Clone
18
Home
Polaire edited this page 2025-01-31 10:41:04 +01:00
This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

I - Présentation du projet

Dans le cadre du cours INFR010 pour la promo CapGIPI n°6, nous devons déployer une infrastructure dans Azure au moyen d'Ansible. Pour ce faire, le professeur nous a fourni des containers sur AWS. Les containers étaient déployés à partit d'une image d'Ubuntu Server.

Le but est d'obtenir l'infrastructure suivante :

  • un virtual Network
  • Un resource group
  • un subnet
  • une VM
  • Un IP publique associée à la VM (pour pinguer depuis l'extérieur)
  • un Network Security Group (firewall) permettant de faire du SSH sur votre VM Linux ou du RDP sur Windows (attention plus difficile)

En bonus, il est également demandé de :

  • S'assurer que la VM dispose d'un compte sur laquelle on puisse se connecter et lui monter un compte utilisateur autre que celui par défaut
  • Avoir aucun mot de passe stocké en clair en utilisant ansible-vault
  • Générer automatiquement les mots de passe
  • Et enfin d'effectuer un découpage en rôle

II - Pré-requis

Une fois l'IP des containers et les identifiants communiqués nous avons pu nous connecter via SSH.

ssh ansible@IP.IP.IP.IP

Une fois la mire obtenue sur le container, il nous faut désormais installer l'ensemble des repos et paquets nécessaire au déploiement sur Azure via Ansible.

II.1 - En Bash

Pour cela on utilise le script bash présent dans le repo : 00_prerequis.sh

Normalement une fois les commandes passées, on peut faire :

az login

Et ainsi se connecter à notre tenant et abonnement Azure comme ci-dessous

II.2 - Avec Ansible

On peut également utiliser un playbook installer pour installer les pré-requis sur notre machine. On va alors créer le fichier 00_azurecli.yml

Une fois le fichier créer, on lance la commande :

ansible-playbook 00_azurecli.yml

On peut s'assurer que l'installation est OK en passant la commande : az version

II - Actions sur Azure

Une fois connecté à notre compte Azure, on va créer un Service Principal, puis configurer un playbook Ansible pour l'utiliser.

II.1 - Créer un Service Principal dans Azure :

Pour créer notre Service Principal on passe la commande ci-dessous en modifiant les informations avec les détails contenus dans le tableau plus bas.

az ad sp create-for-rbac --name "AnsibleServicePrincipal" --role="Contributor" --scopes="/subscriptions/<subscription_id>"

Option Description
az ad sp create-for-rbac Crée un Service Principal avec un rôle basé sur RBAC (Role-Based Access Control).
--name "AnsibleServicePrincipal" Donne un nom au Service Principal (ici, AnsibleServicePrincipal). Tu peux le remplacer par un autre nom si besoin.
--role "Contributor" Attribue le rôle Contributor au Service Principal. Ce rôle lui permet de gérer toutes les ressources dans la portée définie, sans pouvoir modifier les
autorisations daccès.
--scopes "/subscriptions/<subscription_id>" Définit la portée des permissions. Ici, on applique le rôle à tout labonnement Azure. Tu dois remplacer <subscription_id> par lID de ton abonnement

Ce qui nous donne la sortie suivante :

{
 "appId": "212debe2-a0fa-XXXX-9aa5-97f7524036cf",
 "displayName": "AnsibleServicePrincipal",
 "password": "LALALALALALAL",
 "tenant": "LETENANT"
}

II.2 - Configurer Ansible pour utiliser le Service Principal

On utilise un fichier de configuration : Créer un fichier ~/.azure/credentials

Puis, on va ajouter les informations en se refferrant au tableau ci-dessous :

[default]
subscription_id=12345678-XXXX-cdef-1234-567890abcdef
client_id=11111111-2222-3333-4444-555555555555
secret=your-secret-password
tenant=66666666-7777-8888-9999-000000000000
Clés Signification
appId Client ID → Identifiant unique de ton Service Principal dans Azure AD
password Client Secret → Mot de passe généré pour authentifier le Service Principal.
tenant Tenant ID → Identifiant de ton Azure Active Directory (AAD).
subscriptionId Identifiant de l'abonnement Azure.

Pour s'authentifier directement sur Azure avec Ansible, on va indiquer à Ansible d'aller chercher dans notre fichier credentials nouvellement créé les informations nécessaire pour remplir ses variables. On peut donc ajouter le bloc suivant dans notre .yaml :

- name: Configurer l'authentification Azure via fichier credentials
  copy:
    dest: "/root/.azure/credentials"
    content: |
      [default]
      subscription_id={{ lookup('env', 'AZURE_SUBSCRIPTION_ID') }}
      client_id={{ lookup('env', 'AZURE_CLIENT_ID') }}
      secret={{ lookup('env', 'AZURE_SECRET') }}
      tenant={{ lookup('env', 'AZURE_TENANT') }}
    mode: '0600'

- name: Vérifier la connexion à Azure
  command: az account show
  register: azure_account
  changed_when: false

- name: Afficher les informations du compte Azure
  debug:
    msg: "{{ azure_account.stdout }}"
 

III - Déploiement via Ansible

On commence par créer le mot de passe sécurisé :

ansible-vault create secrets.yml MDP : Le mot de passe!

Puis on créer le fichier secrets.yml

admin_password: "{{ lookup('password', '/dev/null length=20 chars=ascii_letters,digits,special') }}"
ssh_public_key: "{{ lookup('file', '~/.ssh/id_rsa.pub') }}"

On créer le fichier 01_AnsibleAzure.yml

Exécuter le playbook : ansible-playbook --ask-vault-pass 01_AnsibleAzure.yml

Et on indique le mot de passe !

Le playbook va alors nous créer :

  • un Ressource Group
  • un Virtual Network
  • un sous-réseau
  • une IP publique
  • un Network Security Group
  • une interface réseau (NIC)
  • une VM Linux sous Ubuntu

La pluspart des variable sont indiqués au début du fichier .yaml ; les plus sensibles sont chargées depuis un fichier secrets.yml ; le mot de passe de notre mot de passe de la variable "admin_password" est lui créé aléatoirement.

NB : L'ensemble de l'infrastructures est fonctionnelle, mais la partie gestion des mots de passes mériterait davantage de temps et de travail. ;-)