Aller au contenu principal

VM Windows 2019 Server sous Linux

· 4 minutes de lecture
Stéphane ROBERT
Consultant DevOps

Le principal objectif est de pouvoir lancer mes playbooks à destination des machines Windows sur ma machine Linux! Il faut donc que je puisse rapidement installer une machine de test Windows 2019 Server.

Vagrant toujours ...

J'ai tester plusieurs boxes vagrant permettant d'instancier rapidement une VM en un minimum d'opérations. J'ai fini par prendre celle créé par ruzickap.

Il met régulièrement à jour ses VMS et en propose toute une série :

  • Windows 10
  • Windows Server 2012, 2016, 2019 et 2022
  • Ubuntu 14.04, 18.04 et 20.04

Celle qui m'intéresse ici c'est Windows 2019. Dont voici mon vagrantfile :

# -*- mode: ruby -*-
# vi: set ft=ruby :

Vagrant.configure("2") do |config|
  config.vm.box = "peru/windows-server-2019-standard-x64-eval"
  config.vm.synced_folder ".", "/vagrant", :disabled => true
  #config.vm.hostname = "test-windows"
  config.vm.provider "libvirt" do |hv|
    hv.cpus = "2"
    hv.memory = "4096"
  end
  config.vm.network "forwarded_port", guest: 443, host: 8443
  config.vm.network "private_network", ip: "192.168.33.10"
  config.vm.provision "ansible" do |ansible|
    ansible.playbook = "provision-playbook.yml"
  end
end

Quelques explications:

  • Je désactive le partage de dossier config.vm.synced_folder -> false
  • On utilise bien le provider libvirt (lien pour l'installation)
  • 4 Go est un minimun mais comme je dispose que de 8Go sur ma vm Linux je dois faire avec ca.
  • Partage du port 443 et je fixe l'ip qui est directement ajouté à mon fichier /etc/hosts via le plugin vagrant-hostsupdater.
  • Ensuite pour finaliser l'installation j'utilise un playbook Ansible.

Mon playbook Ansible :

Ce playbook ne fait qu'installer et configurer OpenSSH (les explications par là ): J'utilise [chocolatey](https://community.chocolatey.org/), qui grace à son module qui auto-installe choco si est absent, pour installer OpenSSH Server

---
- hosts: all
  gather_facts: no

  tasks:
    - win_chocolatey:
        name: openssh
        state: latest
        package_params: /SSHServerFeature
      register: package
      tags: package

    - name: open port 22 for inbound SSH connections
      win_firewall_rule:
        name: Win32-OpenSSH inbound
        protocol: tcp
        localport: 22
        direction: in
        action: allow
        state: present
        enabled: yes
        profiles: domain,private
      tags: firewall

    - name: start sshd service
      win_service:
        name: sshd
        state: started
        start_mode: delayed
        force: yes
        force_dependent_services: yes
      when: package is changed
      tags: service

    - name: Start ssh-agent service
      win_service:
        name: ssh-agent
        state: started
        start_mode: delayed
        force: yes
        force_dependent_services: yes
      tags: service

    - name: Registry configuration for vagrant
      win_regedit:
        path: HKLM:\SOFTWARE\OpenSSH
        name: '{{ item.name }}'
        data: '{{ item.data|default(None) }}'
        type: "{{ item.type|default('dword') }}"
        state: "{{ item.state|default('present') }}"
      with_items:
      - name: DefaultShell
        type: string
        data: C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe
      - name: DefaultShellCommandOption
        type: string
        data: /c
        state: absent
      - name: DefaultShellEscapeArguments
        data: 0
        state: absent
      tags: registry

    - win_file:
        path: '%USERPROFILE%/.ssh/'
        state: directory
      tags: key

    - win_copy:
        src: authorized_keys
        dest: '%USERPROFILE%/.ssh/authorized_keys'
      tags: key

    - win_copy:
        src: sshd_config
        dest: 'C:\ProgramData\ssh\'
      tags: key

    - win_service:
        name: sshd
        state: restarted
        force: yes
        force_dependent_services: yes

J'utilise les modules windows suivant (fichier requirements.yml)

collections:
  - name: community.windows
    version: 1.7.0
  - name: ansible.windows
    version: 1.7.3

Pour les installer :

ansible-galaxy collection install -r requirements.yml

Il faut en plus d'Ansible installer le module pip pywinrm :

pip install pywinrm

On teste :

vagrant up

Bringing machine 'default' up with 'libvirt' provider...
==> default: Box 'peru/windows-server-2019-standard-x64-eval' could not be found. Attempting to find and install...
    default: Box Provider: libvirt
    default: Box Version: >= 0
==> default: Loading metadata for box 'peru/windows-server-2019-standard-x64-eval'
    default: URL: https://vagrantcloud.com/peru/windows-server-2019-standard-x64-eval
==> default: Adding box 'peru/windows-server-2019-standard-x64-eval' (v20211001.01) for provider: libvirt
    default: Downloading: https://vagrantcloud.com/peru/boxes/windows-server-2019-standard-x64-eval/versions/20211001.01/providers/libvirt.box
    default: Calculating and comparing box checksum...
==> default: Successfully added box 'peru/windows-server-2019-standard-x64-eval' (v20211001.01) for 'libvirt'!
==> default: Machine booted and ready!
==> default: [vagrant-hostsupdater] Checking for host entries
==> default: Forwarding ports...
==> default: 3389 (guest) => 3389 (host) (adapter eth0)
==> default: 5986 (guest) => 5986 (host) (adapter eth0)
==> default: 5985 (guest) => 5985 (host) (adapter eth0)
==> default: 443 (guest) => 8443 (host) (adapter eth0)
==> default: Configuring and enabling network interfaces...
==> default: Running provisioner: ansible...
    default: Running ansible-playbook...

PLAY [all] *********************************************************************

TASK [win_chocolatey] **********************************************************
changed: [default]
[WARNING]: Chocolatey was missing from this system, so it was installed during
this task run.

TASK [open port {{ opt_openssh_port }} for inbound SSH connections] ************
changed: [default]

TASK [win_service] *************************************************************
changed: [default]

On teste la connexion ssh :

vagrant ssh
Windows PowerShell
Copyright (C) Microsoft Corporation. All rights reserved.

PS C:\Users\vagrant>

Récupérons la conf ssh de vagrant pour l'ajouter dans la config ssh :

vagrant ssh-config >> ~/.ssh/config

dont le contenu est :

Host default
  HostName 192.168.121.252
  User vagrant
  Port 22
  UserKnownHostsFile /dev/null
  StrictHostKeyChecking no
  PasswordAuthentication no
  IdentityFile /home/vagrant/.vagrant.d/insecure_private_key
  IdentitiesOnly yes
  LogLevel FATAL

On créé un fichier d'inventaire:

``ìni [all] default [all:vars] ansible_shell_type=powershell


On teste ansible :

```bash
ansible -m win_ping -i hosts all
default | SUCCESS => {
    "changed": false,
    "ping": "pong"
}

Objectif atteint !

Si vous voulez plus de tutorials Ansible je vous renvoie sur le billet de l'introduction à ansible