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 d’accès. | |
| --scopes "/subscriptions/<subscription_id>" | Définit la portée des permissions. Ici, on applique le rôle à tout l’abonnement Azure. Tu dois remplacer <subscription_id> par l’ID 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. ;-)




