Bonjour à nouveau, ce post va vous expliquer comment créer une machine virtuelle Windows Server avec Vagrant, WSL et Ansible. Je suppose que vous avez déjà vu mon précédent billet sur Windows Server où j'explique comment créer une machine virtuelle Windows Server, alors allez le consulter si ce n'est pas le cas :)
Before we start, Plugins!
Installation
Windows
Ainsi, pour mettre en action certains plugins dans notre fichier Vagrant, nous devons les installer directement dans notre terminal.
Pour ce faire, ouvrez un Powershell et installez les plugins suivants (notez que ce plugin est pour Windows OS) :
vagrant plugin install vagrant-reload
Cela nous permettra de recharger notre vm pendant la création du vm.
Autres OS
Maintenant, nous voulons utiliser les fonctionnalités de Windows mais nous utilisons un Linux ou un MacOS.
Pour cela, nous devons installer les plugins suivants dans notre machine Linux ou MacOS :
vagrant plugin install vagrant-reload
vagrant plugin install winrm
vagrant plugin install winrm-fs
vagrant plugin install winrm-elevated
Cela nous permettra de recharger notre vm et d'utiliser les fonctionnalités de Windows avec vagrant ;
Maintenant que nous avons installé nos plugins, continuons ;
WSL
Qu'est-ce que WSL et qu'est-ce qu'il fait ? WSL est l'abréviation de Windows Subsystem for Linux et, en l'installant sur notre serveur Windows, il nous permettra, en gros, d'avoir Linux sur un terminal Windows.
Cela signifie que vous pouvez, par exemple, installer un outil dans votre machine virtuelle Windows en utilisant des commandes Linux comme wsl sudo apt ansible -y (cette commande installera Ansible dans votre machine virtuelle Windows).
Mais pour utiliser WSL, nous devons l'installer ! Et pour l'installer, nous allons utiliser Vagrant. Jetons un coup d'oeil à notre fichier Vagrant :
# -*- mode: ruby -*-
# vi: set ft=ruby :
Vagrant.configure("2") do |config|
config.vm.box = "mcree/win2019"
config.vm.box_version = "1.0.1584095692"
config.vm.provider "virtualbox" do |v|
v.name = "Windows Server 2019"
v.memory = "2048"
end
config.vm.provision "shell", inline: <<-SHELL
Set-ExecutionPolicy Bypass -Scope Process -Force; [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072; iex ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1'))
SHELL
end
Si ce fichier vagrant vous semble familier, il devrait l'être ! Il s'agit du fichier vagrant de notre post précédent où nous avons défini la configuration de notre machine et installé Chocolatey.
Maintenant, ce que nous voulons faire, c'est installer WSL et pour ce faire, nous devons ajouter la commande d'installation dans notre Shell provisioner.
Donc, copiez-collez ceci dans le terminal shell de votre vagranfile :
Enable-WindowsOptionalFeature -FeatureName Microsoft-Windows-Subsystem-Linux -Online -NoRestart -WarningAction SilentlyContinue
Donc, notre fichier vagrant devrait ressembler à ceci pour le moment :
# -*- mode: ruby -*-
# vi: set ft=ruby :
Vagrant.configure("2") do |config|
config.vm.box = "mcree/win2019"
config.vm.box_version = "1.0.1584095692"
config.vm.provider "virtualbox" do |v|
v.name = "Windows Server 2019"
v.memory = "2048"
end
config.vm.provision "shell", inline: <<-SHELL
Set-ExecutionPolicy Bypass -Scope Process -Force; [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072; iex ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1'))
Enable-WindowsOptionalFeature -FeatureName Microsoft-Windows-Subsystem-Linux -Online -NoRestart -WarningAction SilentlyContinue
SHELL
end
Ainsi, nous avons maintenant WSL installé dans notre vm Windows Server ! C'est génial et nous avons maintenant la liberté de l'utiliser à volonté !
Depuis que nous avons installé Chocoaltey et WSL, nous voulons être sûrs que la machine prend en compte les modifications appliquées.
Pour cela, nous allons utiliser un provisioner (shell) reload :
config.vm.provision :reload
Nous allons l'ajouter après notre provisionneur de shell comme ceci :
# -*- mode: ruby -*-
# vi: set ft=ruby :
Vagrant.configure("2") do |config|
config.vm.box = "mcree/win2019"
config.vm.box_version = "1.0.1584095692"
config.vm.provider "virtualbox" do |v|
v.name = "Windows Server 2019"
v.memory = "2048"
end
config.vm.provision "shell", inline: <<-SHELL
Set-ExecutionPolicy Bypass -Scope Process -Force; [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072; iex ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1'))
Enable-WindowsOptionalFeature -FeatureName Microsoft-Windows-Subsystem-Linux -Online -NoRestart -WarningAction SilentlyContinue
SHELL
# trigger reload
config.vm.provision :reload
end
Maintenant que notre provisioner est rechargé, nous pouvons installer Kali Linux (distribution Linux basée sur Debian).
Pour cela, nous allons ouvrir un autre termninal et utiliser chocolatey pour l'installer.
Juste après avoir installé Kali Linux, nous allons recharger notre provisioner une fois de plus.
Cela nous donnera la certitude que tout a été redémarré, y compris la machine virtuelle elle-même !
Donc, voyons ce que nous devons ajouter :
# execute code after reload
config.vm.provision "shell", inline: <<-SHELL
choco install wsl-kalilinux -y
SHELL
# trigger reload
config.vm.provision :reload
Et maintenant que tout est frais et propre, ouvrons un autre terminal shell et commençons à utiliser WSL !
Pour commencer à utiliser WSL et voir si elle fonctionne, ajoutons un shell avec une simple mise à jour du paquet :
wsl sudo apt update
Plutôt facile, non ? Alors, voyons comment l'utiliser efficacement.
Pour l'essayer, installons quelques outils dont nous aurons besoin.
Installons Ansible et décompressons le paquet :
# -*- mode: ruby -*-
# vi: set ft=ruby :
Vagrant.configure("2") do |config|
config.vm.box = "mcree/win2019"
config.vm.box_version = "1.0.1584095692"
config.vm.provider "virtualbox" do |v|
v.name = "Windows Server 2019"
v.memory = "2048"
end
config.vm.provision "shell", inline: <<-SHELL
Set-ExecutionPolicy Bypass -Scope Process -Force; [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072; iex ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1'))
Enable-WindowsOptionalFeature -FeatureName Microsoft-Windows-Subsystem-Linux -Online -NoRestart -WarningAction SilentlyContinue
SHELL
# trigger reload
config.vm.provision :reload
# execute code after reload
config.vm.provision "shell", inline: <<-SHELL
wsl sudo apt update
wsl sudo apt install -y ansible
wsl sudo apt install -y unzip
SHELL
end
Pourquoi avons-nous besoin d'installer Ansible et Unzip, me direz-vous ? Eh bien, nous aurons besoin de décompresser certains fichiers, c'est pourquoi nous avons besoin de Unzip.
Pour Ansible, cela nécessite un peu plus d'explications, suivez-moi :)
Ansible
Ansible est un moteur d'automatisation, qui fonctionne avec des fichiers .yml appelés playbooks, et qui automatise l'approvisionnement du cloud, la gestion de la configuration, le déploiement d'applications, l'orchestration intra-service et de nombreux autres besoins informatiques.
Il n'utilise pas d'agents ni d'infrastructure de sécurité personnalisée supplémentaire, il est donc facile à déployer et, surtout, il utilise un langage très simple (YAML, sous la forme de Playbooks Ansible) qui vous permet de décrire vos tâches d'automatisation d'une manière qui se rapproche de l'anglais courant.
Nous avons également un fichier hosts (également connu sous le nom d'Inventaire). C'est là que nous allons ajouter nos machines cibles sur lesquelles nous souhaitons exécuter les playbooks.
Allez voir le lien pour une information plus profonde et détaillée sur Ansible et ce qu'il fait.
Donc, pour utiliser Ansible, nous avons besoin d'un playbook fonctionnel, d'hôtes et d'un tas d'autres choses ! Et pour cela nous allons utiliser wget pour télécharger un fichier zip contenant tout cela (notre paquet unzip sera utile :D ).
Copiez-collez simplement ce fichier dans votre provisioner :
wsl wget https://github.com/j0rdan-m/vagrant_wsl_ansible/archive/master.zip
Cela va télécharger le fichier zip.
Mais nous devons le décompresser :
wsl unzip master.zip
Grâce à ce travail, nous disposons désormais de playbooks fonctionnels.
Mais avant de les vérifier, configurons notre fichier hosts. Nous allons simplement ajouter la machine localhost dans le fichier hosts avec un utilisateur, un mot de passe, une méthode de connexion et une configuration de port.
Si tout est correct, cela devrait fonctionner parfaitement avec vos playbooks.
wsl sudo bash -c "echo [self] >> /etc/ansible/hosts"
wsl sudo bash -c "echo 127.0.0.1 >> /etc/ansible/hosts"
wsl sudo bash -c "echo [self:vars] >> /etc/ansible/hosts"
wsl sudo bash -c "echo ansible_port=5985 >> /etc/ansible/hosts"
wsl sudo bash -c "echo ansible_connection=winrm >> /etc/ansible/hosts"
wsl sudo bash -c "echo ansible_winrm_transport=basic >> /etc/ansible/hosts"
wsl sudo bash -c "echo ansible_user=vagrant >> /etc/ansible/hosts"
wsl sudo bash -c "echo ansible_password=vagrant >> /etc/ansible/hosts"
Et, juste pour être sûr que tout est correct, faisons un ping à notre vm :
wsl ansible self -m win_ping
Maintenant que le fichier hosts est correct, nous pouvons passer à nos playbooks !
Nous en avons 3 pour être exacts ! Un pour installer IIS, un pour installer quelques outils (Git, VSCode et SumatraPDF) et le dernier qui crée un utilisateur de service et lui donne les droits sur les bons dossiers.
Pour les utiliser, nous devons utiliser la commande ansible-playbook comme ceci :
wsl ansible-playbook vagrant_wsl_ansible-master/tools.yml
wsl ansible-playbook vagrant_wsl_ansible-master/iis.yml
wsl ansible-playbook vagrant_wsl_ansible-master/users.yml
Cela lancera chaque livre de jeux dans l'ordre présenté.
Ainsi, notre playbook devrait ressembler à quelque chose comme ceci :
# -*- mode: ruby -*-
# vi: set ft=ruby :
Vagrant.configure("2") do |config|
config.vm.box = "mcree/win2019"
config.vm.box_version = "1.0.1584095692"
config.vm.provider "virtualbox" do |v|
v.name = "Windows Server 2019"
v.memory = "2048"
end
config.vm.provision "shell", inline: <<-SHELL
Set-ExecutionPolicy Bypass -Scope Process -Force; [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072; iex ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1'))
Enable-WindowsOptionalFeature -FeatureName Microsoft-Windows-Subsystem-Linux -Online -NoRestart -WarningAction SilentlyContinue
SHELL
# trigger reload
config.vm.provision :reload
# execute code after reload
config.vm.provision "shell", inline: <<-SHELL
choco install wsl-kalilinux -y
SHELL
# trigger reload
config.vm.provision :reload
# execute code after reload
config.vm.provision "shell", inline: <<-SHELL
wsl sudo apt update
wsl sudo apt install -y ansible
wsl sudo apt install -y unzip
wsl wget https://github.com/j0rdan-m/vagrant_wsl_ansible/archive/master.zip
wsl unzip master.zip
wsl sudo bash -c "echo [self] >> /etc/ansible/hosts"
wsl sudo bash -c "echo 127.0.0.1 >> /etc/ansible/hosts"
wsl sudo bash -c "echo [self:vars] >> /etc/ansible/hosts"
wsl sudo bash -c "echo ansible_port=5985 >> /etc/ansible/hosts"
wsl sudo bash -c "echo ansible_connection=winrm >> /etc/ansible/hosts"
wsl sudo bash -c "echo ansible_winrm_transport=basic >> /etc/ansible/hosts"
wsl sudo bash -c "echo ansible_user=vagrant >> /etc/ansible/hosts"
wsl sudo bash -c "echo ansible_password=vagrant >> /etc/ansible/hosts"
wsl ansible self -m win_ping
wsl ansible-playbook vagrant_wsl_ansible-master/tools.yml
wsl ansible-playbook vagrant_wsl_ansible-master/iis.yml
wsl ansible-playbook vagrant_wsl_ansible-master/users.yml
SHELL
end
Nous avons maintenant une machine virtuelle Windows Server entièrement fonctionnelle avec Ansible et un tas d'autres trucs sympas dedans !
J'espère que cela vous a aidé et n'oubliez pas de consulter les autres articles ;)