Pular para o conteúdo principal

Servidor Windows com Vagrant, WSL e Ansible

· Leitura de 8 minutos

Olá novamente, este post irá explicar como criar uma máquina virtual Windows Server com Vagrant, WSL e Ansible. Presumo que já tenha visto o meu post anterior do Windows Server onde explico como criar uma máquina virtual Windows Server vm, por isso vá verificar se não viu :)

Antes de começarmos, Plugins!

Instalação

Windows

Assim, para pôr em acção alguns plugins no nosso ficheiro Vagrant, precisamos de os instalar directamente no nosso terminal.

Para o fazer, abrir um Powershell e instalar os seguintes plugins (note que este plugin é para o SO Windows):

vagrant plugin install vagrant-reload

Isto permitir-nos-á recarregar o nosso vm durante a criação do vm.

Outros OS

Agora, queremos utilizar funcionalidades do windows mas estamos a utilizar um Linux ou MacOS.

Para isso, precisamos de instalar os seguintes plugins na nossa máquina Linux ou MacOS:

vagrant plugin install vagrant-reload
vagrant plugin install winrm
vagrant plugin install winrm-fs
vagrant plugin install winrm-elevated

Isto permitir-nos-á recarregar o nosso vm e utilizar características de janelas com vagabundos;

Agora que já temos os nossos plugins instalados, vamos continuar;

WSL

O que é a WSL e o que ela faz? WSL significa Subsistema Windows para Linux e, ao instalá-lo no nosso Windows Server, permitir-nos-á, basicamente, ter Linux num terminal Windows.

Isto significa que pode, por exemplo, instalar uma ferramenta no seu Windows vm usando comandos Linux como wsl sudo apt ansible -y* (este comando irá instalar Ansible na sua máquina virtual Windows).

Mas para usar WSL precisamos de o instalar! E para o instalar vamos usar o Vagrant. Vamos dar uma vista de olhos ao nosso ficheiro 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

Se este ficheiro vagabundo parece familiar, deveria! Este é o ficheiro vagabundo do nosso posto anterior onde definimos a configuração da nossa máquina e instalamos Chocolatey.

Agora o que queremos fazer é instalar WSL e para o fazer precisamos de adicionar o comando de instalação no nosso fornecedor de Shell.

Por isso, copie colar isto para o terminal shell no seu vagranfile:

Enable-WindowsOptionalFeature -FeatureName Microsoft-Windows-Subsystem-Linux -Online -NoRestart -WarningAction SilentlyContinue

Portanto, o nosso ficheiro vagabundo deve ter este aspecto por agora:

# -*- 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

Portanto, temos agora a WSL instalada no nosso Windows Server vm! Isto é óptimo e agora temos a liberdade de o utilizar à vontade!

Desde que instalámos Chocoaltey e WSL, queremos ter a certeza de que a máquina tem em conta as modificações aplicadas.

Para isso, utilizaremos um provisionador (shell) de recarga:

  config.vm.provision :reload

Acrescentaremos isto depois do nosso fornecedor de conchas, tal como este:

# -*- 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

Agora que o nosso provisionador é recarregado, podemos instalar o Kali Linux (base de distribuição Linux em Debian).

Para isso, vamos abrir outro termninal e usar chocolate para o instalar.

Logo após a instalação do kali linux, vamos recarregar o nosso provisionador mais uma vez.

Isto dar-nos-á a certeza de que tudo foi reiniciado, incluindo a própria máquina virtual!

Portanto, vamos ver o que precisamos de acrescentar:

  # execute code after reload
config.vm.provision "shell", inline: <<-SHELL
choco install wsl-kalilinux -y
SHELL

# trigger reload
config.vm.provision :reload

E agora que tudo está fresco e limpo, vamos abrir outro terminal de concha e começar a usar a WSL!

Para começar a usar a WSL e ver se funciona, vamos adicionar uma concha com uma simples actualização do pacote:

wsl sudo apt update

Bastante fácil, certo? Então, vejamos como podemos utilizá-lo eficazmente.

Para o experimentar, vamos instalar algumas ferramentas que vamos precisar.

Assim, vamos instalar o Ansible e descompactar o pacote:

# -*- 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

Porque é que precisamos de instalar o Ansible and Unzip, pode perguntar? Bem, precisamos de descomprimir alguns ficheiros, por isso é que precisamos de descomprimir.

Para o Ansible é necessário um pouco mais de explicação, venha comigo :)

Possível

Ansible é um motor de automação, que funciona com ficheiros .yml chamados playbooks, que automatiza o aprovisionamento de nuvens, gestão de configuração, implementação de aplicações, orquestração intra-serviço, e muitas outras necessidades de TI.

Não utiliza agentes e nenhuma infra-estrutura de segurança adicional personalizada, pelo que é fácil de implementar - e o mais importante, utiliza uma linguagem muito simples (YAML, sob a forma de Ansible Playbooks) que lhe permite descrever os seus trabalhos de automação de uma forma que se aproxima do inglês simples.

Temos também um ficheiro de hosts* (também conhecido como Inventory). É aí que vamos adicionar as nossas máquinas alvo que desejamos para executar os livros de jogo.

Consulte a ligação para uma informação mais profunda e detalhada sobre Ansible e o que faz

Portanto, para usar o Ansible precisamos de um livro de jogo funcional, anfitriões e um monte de outras coisas! E para isso vamos usar wget* para donwload um ficheiro zip contendo tudo isto (o nosso pacote unzip virá a calhar :D )

Basta copiar colar isto ao seu provisionador:

    wsl wget https://github.com/j0rdan-m/vagrant_wsl_ansible/archive/master.zip

Isto irá descarregar o ficheiro zip.

Mas precisamos de o descomprimir, por isso:

    wsl unzip master.zip

Graças a este trabalho, temos agora à nossa disposição livros de exercícios práticos.

Mas antes de os verificarmos, vamos configurar o nosso ficheiro de hosts*. Vamos apenas adicionar a máquina localhost ao ficheiro anfitrião com um utilizador, palavra-passe, método de ligação e configuração de porta.

Se tudo estiver correcto, isto deve funcionar perfeitamente com os seus livros de jogo

    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"

E, só para ter a certeza de que tudo está correcto, vamos pingar o nosso vm:

    wsl ansible self -m win_ping

Agora que o ficheiro do anfitrião está correcto, podemos avançar para os nossos livros de jogos!

Temos 3 para ser exatos! Um para instalar IIS, outro para instalar algumas ferramentas (Git, VSCode e SumatraPDF) e o último que cria um utilizador de serviço e lhe dá os direitos às pastas correctas.

Para as utilizar, precisamos de utilizar comando um livro de jogo possível, tal como este:

    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

Isto lançará cada livro de jogo na ordem apresentada.

Por isso, o nosso livro de jogo deve ter o seguinte aspecto:

# -*- 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

Temos agora uma máquina virtual Windows Server totalmente funcional com Ansible e um monte de outras coisas fixes nela!

Espero que isto tenha sido útil e certifique-se de verificar os outros posts ;)