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 ;)