Criando VM´s com Vagrant

De MSTECH wiki
Ir para: navegação, pesquisa

Versões de softwares utilizados para criação do manual

Versão Aplicação
6.3.9600.16384 Hyper-V
2012 R2 Standard Windows Server
1.7.2 Vagrant
3.0 Windows PowerShell

Introdução

Este documento visa apresentar o procedimento para preparação de máquinas virtuais usando a ferramenta Vagrant.
O Vagrant é uma ferramenta que permite que criemos rapidamente máquinas virtuais para fazermos testes, desenvolvimento ou provisionamento de ambientes utilizando as soluções de virtualização mais comuns como o Virtualbox e o Hyper-V.
Para a execução desta ferramenta, a interface é somente via prompt de comando.

Objetivo

Este manual tem como objetivo, se tornar uma espécie de consulta para os analistas de DevOps, assim como capacitar analistas que iniciarem na atividade de virtualização em quaisquer ambiente.

Execução

Criando uma VM zerada, com Windows 2012 R2 Standard

Checklist (padronização)
- Máquina Virtual (.vhdx) ter no máximo 45Gb para instalação do SO;
- Windows Server com as atualizações baixadas e instaladas;
- Instalar a feature .NET Framwork versões 3.5 e 4.5, pelo Add Roles e Features no Server Manager. Como da imagem abaixo.
caption

- Instalar a feature Windows PowerShell versões 3.0 e 2.0, pelo Add Roles e Features no Server Manager. Como da imagem abaixo.
caption

- Fazer um procedimento para desativar senha complexa. Para isso, vá pela VM e pressione as teclas caption + R e digite gpedit.msc. Em seguida, navegue em Computer Configuration -> Windows Settings -> Security Settings -> Account Policies -> Password Policy e clique 2x na regra Password must meet complexity requirements. Selecione para desabilitar essa regra e clique em OK.
- Configurar WinRM, que é uma ferramenta de linha de comando projetado para criar e controlar as conexões remotas. Para isso, abre uma console do PowerShell na VM (clicando com o botão direito sobre este aplicativo e selecionar Run as Administrator) e digite as três linhas de comando citada abaixo.
winrm set winrm/config/client/auth '@{Basic="true"}'
winrm set winrm/config/service/auth '@{Basic="true"}'
winrm set winrm/config/service '@{AllowUnencrypted="true"}'
- Habilitar conexões Remote Desktop. Para isso, abre uma console do PowerShell na VM (clicando com o botão direito sobre este aplicativo e selecionar Run as Administrator) e digite as duas linhas de comando citada abaixo.
$obj = Get-WmiObject -Class "Win32_TerminalServiceSetting" -Namespace root\cimv2\terminalservices
$obj.SetAllowTsConnections(1,1)
- Habilitar CredSSP (Credential SSP), que permite o uso do SSP (Suporte de Provedor de Segurança) do lado cliente para delegar as credenciais do usuário da máquina cliente ao servidor de destino. Para isso, abre uma console do PowerShell na VM (clicando com o botão direito sobre este aplicativo e selecionar Run as Administrator) e digite a linha de comando citada abaixo.
Enable-WSManCredSSP -Force -Role Server
- Habilitar regras RDP (protocolo de conexão remota) e WinRM no firewall. Para isso, abre uma console do PowerShell na VM (clicando com o botão direito sobre este aplicativo e selecionar Run as Administrator) e digite as duas linhas de comando citada abaixo.
Set-NetFirewallRule -Name WINRM-HTTP-In-TCP-PUBLIC -RemoteAddress Any
Set-NetFirewallRule -Name RemoteDesktop-UserMode-In-TCP -Enabled True
- Alterar as políticas de execução do PowerShell. Para isso, abre uma console do PowerShell na VM (clicando com o botão direito sobre este aplicativo e selecionar Run as Administrator) e digite a linha de comando citada abaixo.
Set-ExecutionPolicy -ExecutionPolicy Unrestricted

Exportando a VM

Nesta etapa, mostraremos como proceder para exportar a VM já criada, configurada e atualizada.
- A primeira coisa, é necessário compactar no máximo a máquina virtual, usando o PowerShell como mostra a imagem abaixo.
PS C:\Windows\system32> Optimize-VHD -Path C:\<caminho do arquivo .vhdx> -Mode Full
Onde: <caminho do arquivo .vhdx> -> caminho onde está salvo o arquivo que corresponde a máquina virtual criada.
- Próximo passo, será exportar a VM para a caminho desejado, conforme mostra a imagem abaixo.
PS C:\Windows\system32> Export-VM -Name <nome_da_VM> -Path C:\<nome da pasta onde salvará a VM exportada>
Onde: <nome_da_VM> -> nome da VM, que consta na console do gerenciador de Hyper-V.
<nome da pasta onde salvará a VM exportada> -> caminho onde salvará a VM a ser exportada
- Após exportar a VM, próximo passo será remover a pasta Snapshots, que não será muito útil. Esta pasta foi gerada durante o processo de exportação e está dentro da pasta onde foi exportada a VM. Segue o comando abaixo em que remove a pasta.
PS C:\Windows\system32> Remove-Item D:\<nome da pasta onde foi salva a VM exportada>\Snapshots -Recurse -Force
Dentro da pasta onde foi exportada a VM, iremos criar 2 arquivos (metadata.json e Vagrantfile), faremos primeiro a criação do arquivo metadata.json pelo notepad e inserir a informação necessária dentro do arquivo conforme mostra a imagem abaixo.
{
 "provider": "hyperv"
}
- Na sequência, iremos criar o arquivo Vagrantfile e inserir a informação necessária dentro do arquivo conforme mostra a imagem abaixo.
# -*- mode: ruby -*-
# vi: set ft=ruby :

VAGRANTFILE_API_VERSION = "2"

Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
  config.vm.guest = :windows
  config.vm.communicator = "winrm"
end
- A estrutura dentro da pasta ficará conforme a imagem abaixo, com 2 pasta e 2 arquivos.

caption

Compactando a VM

Para compactar toda a estrutura referente a imagem anterior, utilizaremos um aplicativo chamado bsdtar o arquivo zipado se encontra disponível em \\mstech.com.br\docs\Areas\Dir. Sistemas de Gestão\Ger. Desenvolvimento de Software\Coord. DevOps\Restrito - Equipe\Programas\bsdtar.
Pegue uma cópia do arquivo zipado e armazene em um local de sua preferencia no servidor destino. Descompacte-o na sequência, após descompactado, note que há 4 arquivos e um desses arquivos está o executável bsdtar.
Abra o prompt de comando com o botão direito do mouse e selecione Run as Administrator. Vá até o caminho onde está a pasta contendo a VM exportada e aplique a seguinte linha de comando.
D:\vm_exportada> C:\<caminho da pasta descompactada>\bsdtar.exe –lzma –cvf <define um nome para o box>.box  *
Obs.: o diretório e os caminhos citados na linha de comando acima é apenas um exemplo.
Segue a figura abaixo de como o processo de compactação é gerado.

caption

Nota: a criação o arquivo *.box leva tempo para ser concluído, de 2 a 3 horas, dependendo do tamanho total a ser compactado e da performance do host. Este arquivo fica salvo dentro ou fora da pasta contendo a VM exportada.
Após o processo de compactação, segue a figura em que exibe o arquivo *.box criado.

caption

Instalando o Vagrant

A instalação se encontra dentro de \\mstech.com.br\docs\Areas\Dir. Sistemas de Gestão\Ger. Desenvolvimento de Software\Coord. DevOps\Restrito - Equipe\Programas\Vagrant, o processo de instalação em um host é mostrado na sequência de imagens abaixo.

caption
Clique em Next

caption
Habilite a opção I accept terms in the License Agreement e clique em Next

caption
Mantenha o caminho de instalação padrão e clique em Next

caption
Clique em Install

caption
Clique em Finish para finalizar a instalação

caption
Clique em Clique em Yes para reiniciar o host.

Iniciando o uso do Vagrant

Após reiniciar o host, o vagrant está disponível para uso. Lembrando que para usar esta ferramenta, necessário entrar via prompt de comando clicando com o botão direito do mouse e selecionar Run as Administrator.
Como exemplo, foi criado uma pasta no diretório D:\, chamado vagrant. Dentro desta pasta será criado o ambiente virtual usando vagrant.
Copie o box criado para dentro da pasta D:\vagrant, iniciamos com a primeira linha de comando pelo prompt de comando.
vagrant box add dsvm D:\vagrant\ds-vm.box
Onde: vagrant -> chama a ferramenta
box -> comando para gerenciar boxes
add -> parâmetro que vem depois do comando box, serve para poder adicionar a box
dsvm -> nome para a box (você pode definir um nome qualquer)
D:\vagrant\ds-vm.box -> caminho onde se encontra atualmente a box criada
Esta linha de comando coloca a box em seu cache global vagrant. Por padrão, é uma pasta chamada .vagrant.d e fica localizada dentro do diretório pessoal (por exemplo, dentro de C:\Users\<usuario>).

Boas práticas de TI

Uma vez aplicado a linha de comando, já basta para ser usada em diversas situações. Caso você opte usar a linha de comando definindo um nome diferente para a box e usar o mesmo arquivo .box, vai ocupar muito espaço em disco desnecessariamente.
Segue abaixo de como o processo de descompactação é gerado. Obs.: esse processo todo leva e 45 minutos a 1h para concluir, dependendo da performance do host.
caption
A próxima linha de comando a ser inserida é mostrada abaixo.
vagrant init
O comando init, que vem depois de vagrant, cria um arquivo Vagrantfile dentro do seu diretório atual (deste exemplo, é o D:\vagrant\). Segue abaixo a figura após aplicar a linha de comando.
caption
É neste arquivo que faremos algumas modificações antes de criar a VM a partir do box, abre este arquivo com botão direito do mouse e selecione Open with para abrir com notepad.
caption
O Vagrantfile possui uma biblioteca de comandos e parâmetros já definidos, como pode ver na figura anterior, há exemplos de comandos e parâmetros nos comentários.
Para o nosso exemplo, removi um único comando que não está protegido por comentário e que é default do Vagrantfile, o config.vm.box = “base”. Este comando fica abaixo da linha # boxes at https://atlas.hashicorp.com/search.
Foi feito uma modificação no Vagrantfile, para definir o tipo de VM necessária para um projeto, assim como configurar e prover esta VM. Segue a figura abaixo de como foi definido.
# -*- mode: ruby -*-
# vi: set ft=ruby :

# All Vagrant configuration is done below. The "2" in Vagrant.configure
# configures the configuration version (we support older styles for
# backwards compatibility). Please don't change it unless you know what
# you're doing.
Vagrant.configure(2) do |config|
  # The most common configuration options are documented and commented below.
  # For a complete reference, please see the online documentation at
  # https://docs.vagrantup.com.

  # Every Vagrant development environment requires a box. You can search for
  # boxes at https://atlas.hashicorp.com/search.
  config.winrm.username = "<user>"         (1)
  config.winrm.password = "<pwd user>"     (2)
  # VM Windows 1                           (3)
  config.vm.define "web" do |web|          (4)
	  web.vm.hostname = "MS-EXEMPLO"   (5)
  	  web.vm.box = "dsvm"              (6)
  	  web.vm.provider "hyperv" do |y|  (7)
               y.ip_address_timeout = 420  (8)
          end                              (9)
  end                                      (10)

  # Disable automatic box update checking. If you disable this, then
  # boxes will only be checked for updates when the user runs
Onde:
1 – Este comando define como Vagrant irá acessar a VM sobre WinRM e o username que o Vagrant irá usar para logar o serviço WinRM.
2 – Este comando define como Vagrant irá acessar a VM sobre WinRM e o password que o Vagrant irá usar para autenticar o usuário WinRM.
3 – Comentário para melhor identificar o tipo de VM.
4 – Esta linha de comando substitui o config para web, para melhor definição de um nome para ser usado na modificação da configuração de uma VM, que o Vagrant gerenciará.
5 – Este comando define o nome da VM, no caso é MS-EXEMPLO.
6 – Este comando define qual box será usada para criar a VM, no caso é dsvm.
7 – Esta linha de comando substitui o web para y, para melhor definição de um nome para ser usado na modificação das configurações em que são específicas para um certo provedor, no caso o Hyper-V.
8 – Este comando define o tempo em segundos para aguardar a VM de informar um endereço IP.
9 – Final da estrutura referente ao item 7
10 – Final da estrutura referente ao item 4
Finalmente, a última linha de comando irá criar a VM através do box em seu provedor, no caso o Hyper-V. Para Hyper-V, precisa incluir uma opção que é -–provider.
vagrant up -–provider hyperv
Onde:
vagrant -> chama a ferramenta
up -> comando para iniciar a VM
-- provider -> parâmetro informa o provedor, no caso o Hyper-V
hyperv -> hipervisor informado
Segue a figura abaixo após aplicar a linha de comando.
caption
Feito isso, a VM já se encontra operacional, verifique pelo Gerenciador Hyper-V e encontrará a tal VM criada através do Vagrant (destaque em vermelho).
caption

Manipulando a VM usando comandos Vagrant

- Para iniciar a configuração de uma VM
vagrant init
- Para iniciar uma VM
vagrant up
- Para desligar a VM
vagrant halt
- Para regarregar a VM (reboot)
vagrant reload
- Para suspender a VM
vagrant suspend
- Para fazer resumo de uma VM suspensa
vagrant resume
- Para verificar o status de uma VM (se está off-line ou online)
vagrant status
- Para destruir a VM, apagando ela do host
vagrant destroy

Referências

- https://docs.vagrantup.com/v2/ - Site oficial do Vagrant, página de documentação da versão 1.1
- http://friendsofvagrant.github.io/v1/docs/getting-started/index.html - Site em português, página de documentação da versão 1.0.x
- http://www.hurryupandwait.io/blog/in-search-of-a-light-weight-windows-vagrant-box - Site que foi fundamental para testar, implantar e documentar no ambiente MSTech
- http://blog.jsinh.in/vagrant-for-developers/#.VOYgJ3l0wdV - Site explicativo sobre como manipular Vagrantfile para subir mais de uma VM
- http://gutocarvalho.net/octopress/2014/05/12/vagrant-multi-machines/ - Site em português, página que explica sobre como manipular Vagrantfile para subir mais de uma VM