Déployer un domaine Active Directory avec Vagrant et Ansible
Sommaire
I. Présentation
Dans ce tutoriel, vous allez découvrir comment créer, et configurer de manière automatique un environnement de test sous Windows Server puisque nous allons déployer une VM Windows Server sous VirtualBox et mettre en place un domaine Active Directory. Le tout de manière automatique. En termes d'outillage, Vagrant sera utilisé pour le provisionning tandis qu'Ansible sera utilisé pour le paramétrage des rôles.
Avant de rentrer dans le vif du sujet, une présente succincte de Vagrant et Ansible s'impose.
- Vagrant
Outil permettant de travailler avec des environnements virtuels (VM, containers). Vagrant fournit un client en ligne de commande simple et facile à utiliser pour gérer ces environnements, ainsi qu'un interpréteur permettant de "coder" (pardonnez-vous moi l'expression) vos VM avec du code au lieu de faire d'enchaîner les clics sur une interface graphique.
L'usage premier de Vagrant est de s'interfacer avec des hyperviseur de type 2 comme VirtualBox, VMware ou encore Hyper-V. Cependant il est possible d'utiliser Vagrant avec un hyperviseur de type 1 comme VMware ESXi. Ce sont des plugins développés par la communauté open source qui le permette, donc pas forcement très stable.
Plus d'info ici pour VMware ESXi et Vagrant : GitHub - Vagrant + ESXi
- Ansible
Logiciel permettant de provisionner l'infrastructure sous-jacente de votre environnement (hyperviseurs, VM, containers, etc.) par l'intermédiaire de fichiers .yml. Ansible intervient pour la partie "configuration logicielle" afin d'installer des services et de les paramétrer par la suite, mais ne permets pas d'instancier (au sens propre du terme des environnements virtuels).
Avant toute chose, je vais pousser un petit coup de gueule contre la doc d'Ansible. Nonobstant que cet outil soit vraiment pratique et très puissant pour les tâches d'automatisation, je trouve que la doc reste beaucoup trop verbeuse et flou à certains endroits. Personnellement, cela m'a fait perdre un temps pas possible pour la rédaction de mon playbook. Ma critique s'adresse uniquement si vous utilisez Ansible pour provisionner des machines Windows. Néanmoins, avec un environnement Linux, j'ai clairement moins galéré, car il y avait beaucoup plus de ressources en ligne (articles, forum, etc.). Globalement en fonction de ce que vous voulez faire, si c'est commun ou non, vous êtes très vite projeté dans l'inconnu avec Ansible. Voilà l'essence même de cet article :-). C'est regrettable au vu de la puissance de l'outil et j'espère qu'à l'avenir cela changera.
En revanche, la documentation de Vagrant est très bien structurée et claire. Vous verrez par vous-même. Bravo une fois de plus a l'éditeur Hashicorp !
Passons aux choses sérieuses.
Remarque : pour suivre ce tutoriel, il est préférable de connaître un minimum Vagrant et l'Active Directory.
II. Description de mon lab
Vous avez besoin d'une machine sur laquelle nous allons installer VirtualBox, Vagrant, et Ansible, afin de déployer la VM Windows Server. Dans mon cas, je vais utiliser un hôte physique sous Linux : Ubuntu 20.04 ou 22.04 (testé sur les deux).
Remarque : Vagrant et Ansible sont des outils qui s'utilisent plus facilement depuis Linux, bien qu'ils soient capables de gérer des hôtes Windows et Linux.
Si vous souhaitez réaliser ce tutoriel depuis un hôte physique sous Windows, vous pouvez le faire, mais votre PC doit soit :
- Prendre en charge la "virtualisation imbriquée" (c'est le fait de créer une machine virtuelle depuis une machine qui est elle-même virtualisée) aussi appelée "nested virtualization" en anglais, pour créer une VM Linux dans laquelle vous allez installer les outils.
- Ce qui implique que vous devez utiliser un hyperviseur qui est capable de gérer cette fonction comme VMware Workstation ou VirtualBox. Pour cela, accéder aux paramètres de votre VM, puis cocher la case "Virtualize Intel VT-x/EPT or AMD-V/RVI".
- L'alternative consiste à installer directement Vagrant et Ansible sur votre hôte Windows. Mais bon, personnellement, je ne vous le recommande pas, car la quasi-totalité des documentations que vous trouverez sur ces deux technologies sont rédigées depuis un environnement Linux.
III. Installation des prérequis
Détendez-vous, ça va bien se passer...
Dans un premier temps, commencez par installer VirtualBox et Ansible ainsi que le gestionnaire Pip pour Python si-vous ne l'avez pas déjà :
sudo apt update && sudo apt install virtualbox ansible python3-pip
Ensuite, vous devez installer Vagrant en utilisant les instructions fournies sur le site officiel :
- www.vagrantup.com - Le setup est simple, et très user-friendly
Pour Ubuntu/Debian, voici les instructions fournies :
wget -O- https://apt.releases.hashicorp.com/gpg | gpg --dearmor | sudo tee /usr/share/keyrings/hashicorp-archive-keyring.gpg
echo "deb [signed-by=/usr/share/keyrings/hashicorp-archive-keyring.gpg] https://apt.releases.hashicorp.com $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/hashicorp.list
sudo apt update && sudo apt install vagrant
Préférez l'installation de Vagrant via le dépôt APT officiel d'Hashicorp (éditeur de Vagrant) comme ci-dessus plutôt qu'avec les repos officiels d'Ubuntu 22.04. En effet, j'ai rencontré des problèmes étranges avec les plugins sous-jacents de Vagrant qui ne voulaient pas s'installer. Ceci s'est produit lorsque j'ai fait mes tests en passant par les dépôts officiels d'Ubuntu 22.04 pour installer Vagrant.
Suite à cela, installez la dépendance python "pywinrm" qui est une des "briques" qui va vous permettre de pouvoir de faire communiquer votre machine Windows avec Vagrant puis Ansible par l'intermédiaire du protocole WinRM.
python3 -m pip install pywinrm
Continuons avec l'installation des plugins WinRM pour Vagrant :
vagrant plugin install winrm
vagrant plugin install winrm-elevated
vagrant plugin install winrm-fs
Ceux-ci vont permettre à Vagrant de pouvoir se connecter à la machine Windows via le protocole WinRM.
En quoi cela est nécessaire ?
Dans le cas de cet article, cela va permettre à Vagrant de pouvoir communiquer avec la VM afin de préparer ses "fondations" (setup de l'heure, installation de dépendances "core" pour l'ADDS, etc...), pour qu'ensuite Ansible puisse prendre le relais sur la configuration.
Vérifiez que les plugins se sont bien installés par l'intermédiaire de la commande :
vagrant plugin list
Vous devriez voir les plugins suivants :
Enfin, nous allons installer les plugins d'Ansible dont nous avons besoin :
ansible-galaxy collection install community.windows
ansible-galaxy collection install ansible.windows
Ouf... j'espère que tout s’est bien passé pour vous. Croyez-moi que j'ai bien galéré afin de comprendre et rassembler tous les éléments dans l'ordre pour vous, afin que vous ayez un article simple à comprendre et à tester de votre côté...
IV. Vagrant : création de la VM Windows Server
Créez un fichier de configuration nommé "Vagrantfile" sur votre machine :
touch Vagrantfile
Éditez le fichier afin d'insérer le bloc de code ci-dessous. Ici, on est clairement sur de l'Infrastructure as Code.
Vagrant.configure("2") do |config|
config.vm.box = "peru/windows-server-2019-standard-x64-eval"
config.vm.provider "virtualbox" do |hv|
hv.cpus = "2"
hv.memory = "2048"
hv.linked_clone = true
end
config.vm.provision "ansible" do |ansible|
ansible.playbook = "playbook-ansible.yml"
end
end
Les instructions sont suffisamment claires si vous connaissez un minimum Vagrant.
Précisons tout de même que Vagrant va créer une VM VirtualBox avec 2 Go de RAM, 2 vCPU et qu'après avoir mis en place la machine virtuelle, il va exécuter le playbook Ansible ("playbook-ansible.yml").
Note : vous pouvez aussi utiliser Vagrant pour exécuter des commandes sur le serveur, mais préférez l'utilisation d'Ansible si possible, car cela vous permettra de bien séparer les responsabilités de chacun de vos deux outils.
- Vagrant : utilisé la plupart du temps pour le provisionnement matériel
- Ansible : utilisé pour le provisionnement "logiciel" (exécution de commandes, installation de services, etc.)
V. Ansible - Configuration du rôle ADDS pour notre machine
Maintenant, nous allons nous occuper de la configuration "logiciel" de notre serveur. On crée un fichier pour notre playbook Ansible :
touch playbook-ansible.yml
Voici ce que nous allons faire sur ce serveur :
- Installation de fonctionnalités basiques pour l'installation du rôle ADDS
- Mise à jour de l'heure (fuseau horaire Europe/Paris)
- Changement du nom d'hôte
- Redémarrage de la machine
- Changement de l'adresse IP de celle-ci, afin que la machine puisse disposer d'une adresse IP fixe (dans le réseau NAT de VirtualBox)
- Installation et configuration du rôle ADDS en utilisant la plupart du temps les options par défaut
- Redémarrage du serveur afin de finir la configuration du rôle ADDS (et donc la promotion de celui-ci en tant que contrôleur de domaine)
Puis, insérez le bloc de code ci-dessous :
- name: Configure role(s) on a Windows server instance
hosts: all
tasks:
- name: Run powershell commands to prepare the DC
ansible.windows.win_powershell:
script: |
- name: Configure role(s) on a Windows server instance
hosts: all
tasks:
- name: Run powershell commands to prepare the DC
ansible.windows.win_powershell:
script: | Add-WindowsFeature AD-Domain-Services
Set-TimeZone -Name "Romance Standard Time"
- name: Change the hostname
ansible.windows.win_hostname:
name: dc
register: hostname
- name: Reboot
ansible.windows.win_reboot:
when: hostname.reboot_required
- name: Set up static IP address
win_shell: "Get-NetIpAddress -InterfaceAlias 'Ethernet*' | New-NetIpAddress -IpAddress 10.0.2.100 -PrefixLength 24 -DefaultGateway 10.0.2.2"
async: 100 # Using "fire-and-forget" asynchronous execution for this task, otherwise it will always fail and timeout
poll: 0
- name: Wait for the hosts network interface to come back up
local_action:
module: wait_for
host: "{{ ansible_host }}"
port: 5985
delay: 10
state: started
register: wait_result
- name: Install ADDS role and configure it with minimal option
ansible.windows.win_domain:
dns_domain_name: itconnect.local
safe_mode_password: password123!
register: domain_install
- name: Reboot after promotion
ansible.windows.win_reboot:
when: domain_install.reboot_required
Ce playbook reprend les étapes classiques de la configuration d'un contrôleur de domaine avec des étapes fondamentales (adresse IP fixe, paramétrage du rôle ADDS). Voici quelques précisions sur la configuration déployée (vous pouvez adapter le playbook à votre guise) :
- Nom de l'hôte : dc
- Nom du domaine Active Directory : itconnect.local
- Mot de passe de récupération de l'Active Directory : password123!
- Adresse IP de la VM : 10.0.2.100/24
- Fuseau horaire : Romance Standard Time
Si vous souhaitez plus de granularité pour la configuration du rôle, je vous invite à consulter le lien suivant (bon courage, c'est la doc d'Ansible) :
VI. Déploiement de notre machine Windows Server
Maintenant que tous les prérequis sont remplis, et que nos fichiers de configuration pour le déploiement sont prêts, vous pouvez utiliser la commande "vagrant up" afin de lancer le processus d'instanciation et de configuration de la VM.
Dans un premier temps, Vagrant va télécharger l'image "peru/windows-server-2019-standard-x64-eval" depuis le Vagrant "store". En général, une image Windows Server fait entre 7 et 10 Go, donc vous pouvez aller prendre un café le temps que le téléchargement s'effectue...
Ensuite, une fois que l'importation de la VM est terminée, celle-ci va démarrer. C'est à partir de ce moment que Vagrant va tenter de communiquer avec la VM en utilisant le protocole d'administration WinRM, afin qu'il puisse (Vagrant) passer la main à Ansible. Autrement dit, Vagrant exécute le playbook Ansible !
Dès lors, c'est Ansible qui prend le relais pour la configuration logiciel en exécutant l'ensemble des actions définies dans le playbook.
Pour s'authentifier sur la nouvelle machine Windows Server, il faudra utiliser les informations suivantes :
- Utilisateur : Administrator
- Mot de passe : vagrant (clavier en Qwerty par défaut)
Ces informations sont issues de l'image Vagrant utilisée. Bien sûr, vous devez modifier le mot de passe, car il s'agit du compte Administrateur du domaine.
VII. Conclusion
J'espère que tout s'est bien passé pour vous de votre côté ! Votre VM Windows Server est déployée sur VirtualBox et elle est déjà préconfigurée avec un domaine Active Directory !
Si vous souhaitez changer d'images à l'avenir afin d'utiliser une version différente de Windows Server, essayez d'en trouver une où WinRM est déjà actif et qu'il est autorisé dans le pare-feu Windows.
Propre Merci
Par contre tu peux instaurer le vaut pour cacher le mot de passe
Ansible-vault encrypt_string ‘achiffrer’ –vault-password-file ton fichier.key
Puis tu comme le résultat dans le yaml
C’est bon article
Très bon article, par conte j’ai une question au niveau de la commande » vagrant up ».
de mon côté, une fois arrivé à la ligne « WinRM transport: negotiate », ça se bloque.
tu as reussi mtn ?
Même situation ..
Bloqué à python3 -m pip install pywinrm
error : externally-managed-environment.
Pourrais tu m’aider ?
il est installé par défaut à présent, il faut abandonner cette commande
Impossible de changer l’ip perso.. Apres un reboot : timeout
Bonjour, votre playbook présente pas mal de mauvais copier-coller.
Pouvez-vous corriger ?