Olá a todos, meu nome é Ivan e eu sou um administrador de sistemas alcoólatra (OPS).
Gostaria de compartilhar como implanto máquinas virtuais no ESXi sem o vCenter usando o Terraform.
Com frequência, preciso implantar/recriar máquinas virtuais para testar diferentes aplicações. Por causa da preguiça, pensei em automatizar o processo. Minhas pesquisas me levaram a um produto incrível da empresa , .
Acho que muitos sabem o que é o Terraform, e para quem não sabe, é um aplicativo para gerenciar qualquer nuvem, infraestrutura ou serviço usando o conceito de IasC (Infraestrutura como código).
Como ambiente de virtualização, uso o ESXi. Bastante simples, conveniente e confiável.
Prevejo a pergunta.
Por que usar Terraform se posso usar o vCenter Server?
Pode até ser, mas. Primeiro, é uma licença adicional; segundo, esse produto é muito exigente em recursos e simplesmente não caberia no meu servidor doméstico; e em terceiro lugar, é uma oportunidade para aprimorar as habilidades.
Como servidor, utilizo a plataforma Intel NUC:
CPU: 2 CPUs x Intel(R) Core(TM) i3-4010U CPU @ 1.70GHz
RAM: 8Gb
HDD: 500Gb
Versão do ESXi: ESXi-6.5.0-4564106-standard (VMware, Inc.)Então, vamos por partes.
Enquanto isso, vamos configurar o ESXi, mais especificamente, abrir a porta VNC nas configurações do firewall.
Por padrão, o arquivo está protegido contra gravação. Realizamos as seguintes manobras:
chmod 644 /etc/vmware/firewall/service.xml
chmod +t /etc/vmware/firewall/service.xml
vi /etc/vmware/firewall/service.xmlAdicionamos ao final do arquivo o seguinte bloco:
packer-vnc
inbound
tcp
dst
5900
6000
true
trueSaímos, salvamos. Mudamos as permissões de volta e reiniciamos o serviço:
chmod 444 /etc/vmware/firewall/service.xml
esxcli network firewall refreshVálido até a reinicialização do host. Após isso, essa manobra terá que ser repetida.
A partir daqui, todo o trabalho será feito em uma máquina virtual nesse mesmo servidor.
Características:
OS: Centos 7 x86_64 minimal
RAM: 1GB
HDD: 20GB
Selinux: desativado
firewalld: desativadoA seguir, precisaremos , também um produto da empresa HashiCorp.
É necessário para a construção automática da imagem 'dourada' que usaremos no futuro.
yum install unzip git -y
curl -O https://releases.hashicorp.com/packer/1.5.5/packer_1.5.5_linux_amd64.zip
unzip packer_1.5.5_linux_amd64.zip -d /usr/bin && rm -rf packer_1.5.5_linux_amd64.zip
versão do packer
Packer v1.5.5Na etapa versão do packer pode ocorrer um erro, pois pode haver um pacote com o mesmo nome em sistemas baseados em RedHat.
which -a packer
/usr/sbin/packerPara resolver, pode-se criar um symlink ou usar o caminho absoluto /usr/bin/packer.
Agora precisaremos do ovftool . Baixamos, colocamos no servidor e instalamos:
chmod +x VMware-ovftool-4.4.0-15722219-lin.x86_64.bundle
./VMware-ovftool-4.4.0-15722219-lin.x86_64.bundle
Extraindo o Instalador VMware...feito.
Você deve aceitar o Acordo de Licença do Usuário Final do VMware OVF Tool para Linux para continuar. Pressione Enter para prosseguir.
ACORDO DE LICENÇA DO USUÁRIO FINAL DO VMWARE
Você concorda? [sim/não]:sim
O produto está pronto para ser instalado. Pressione Enter para iniciar a instalação ou Ctrl-C para cancelar.
Instalando o componente VMware OVF Tool para Linux 4.4.0
Configurando...
[######################################################################] 100%
A instalação foi bem-sucedida.Vamos em frente.
No Git, preparei tudo o que é necessário.
git clone https://github.com/letnab/create-and-deploy-esxi.git && cd create-and-deploy-esxiNa pasta iso é preciso colocar o instalador do sistema operacional. No meu caso, é o centos 7.
Também é necessário editar o arquivo centos-7-base.json:
variables: especifique seus dados de conexão
iso_urls: indique o atual
iso_checksum: checksum da sua imagem Após todas as alterações, iniciamos a construção:
/usr/bin/packer build centos-7-base.jsonSe tudo estiver configurado e especificado corretamente, você verá o processo de instalação automática do sistema operacional. Esse processo leva de 7 a 8 minutos para mim.
Após a conclusão bem-sucedida, na pasta output-packer-centos7-x86_64 estará o arquivo ova.
Instalamos o Terraform:
curl -O https://releases.hashicorp.com/terraform/0.12.24/terraform_0.12.24_linux_amd64.zip
unzip terraform_0.12.24_linux_amd64.zip -d /usr/bin/ && rm -rf terraform_0.12.24_linux_amd64.zip
tf version
Terraform v0.12.24Como o Terraform não tem provedor para ESXi, precisamos compilá-lo.
Instalamos o Go:
cd /tmp
curl -O https://dl.google.com/go/go1.14.2.linux-amd64.tar.gz
tar -C /usr/local -xzf go1.14.2.linux-amd64.tar.gz && rm -rf go1.14.2.linux-amd64.tar.gz
export PATH=$PATH:/usr/local/go/bin
go version
go version go1.14.2 linux/amd64Em seguida, compilamos o provedor:
go get -u -v golang.org/x/crypto/ssh
go get -u -v github.com/hashicorp/terraform
go get -u -v github.com/josenk/terraform-provider-esxi
export GOPATH="$HOME/go"
cd $GOPATH/src/github.com/josenk/terraform-provider-esxi
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -a -ldflags '-w -extldflags "-static"' -o terraform-provider-esxi_`cat version`
cp terraform-provider-esxi_`cat version` /usr/binEstamos na reta final. Vamos implantar nossa imagem.
Vamos para a pasta:
cd /root/create-and-deploy-esxi/centos7Primeiro, editamos o arquivo variables.tf. Precisamos especificar a conexão com o servidor ESXi.
No arquivo network_config.cfg conterá as configurações de rede da futura máquina virtual. Ajustamos conforme nossas necessidades e executamos o comando:
sed -i -e '2d' -e '3i "network": "'$(gzip < network_config.cfg| base64 | tr -d 'n')'",' metadata.jsonE no arquivo main.tf mudamos o caminho para o arquivo ova, se for diferente.
O momento da verdade.
terraform init
Inicializando o backend...
Inicializando plugins do provedor...
Os seguintes provedores não têm restrições de versão na configuração,
portanto, a versão mais recente foi instalada.
Para evitar atualizações automáticas para novas versões principais que podem conter mudanças
quebrantadoras, é recomendado adicionar restrições version = "..." aos
blocos do provedor correspondentes na configuração, com as strings de restrição
sugeridas abaixo.
* provider.esxi: version = "~> 1.6"
* provider.template: version = "~> 2.1"
Terraform foi inicializado com sucesso!
Você agora pode começar a trabalhar com Terraform. Tente executar "terraform plan" para ver
quais mudanças são necessárias para sua infraestrutura. Todos os comandos do Terraform
devem funcionar agora.
Se você configurar ou alterar módulos ou a configuração do backend para Terraform,
execute este comando novamente para re-inicializar seu diretório de trabalho. Se você esquecer,
outros comandos detectarão e lembrarão você de fazê-lo, se necessário.terraform plan
Atualizando o estado do Terraform em memória antes do plano...
O estado atualizado será usado para calcular este plano, mas não será
persistido no armazenamento de estado local ou remoto.
data.template_file.Default: Atualizando estado...
data.template_file.network_config: Atualizando estado...
------------------------------------------------------------------------
Um plano de execução foi gerado e é mostrado abaixo.
As ações de recurso são indicadas pelos seguintes símbolos:
+ criar
O Terraform realizará as seguintes ações:
# esxi_guest.Default será criado
+ recurso "esxi_guest" "Default" {
+ tamanho_do_disco_de_arranque = (conhecido após a aplicação)
+ armazenamento_do_disco = "datastore1"
+ nome_do_convidado = "centos7-test"
+ tempo_limite_desligamento = (conhecido após a aplicação)
+ tempo_limite_inicialização = (conhecido após a aplicação)
+ informações_do_convidado = {
+ "metadados" = "base64text"
+ "metadados.codificação" = "gzip+base64"
+ "dados_do_usuário" = "base64text"
+ "dados_do_usuário.codificação" = "gzip+base64"
}
+ sistema_operacional = (conhecido após a aplicação)
+ id = (conhecido após a aplicação)
+ endereço_ip = (conhecido após a aplicação)
+ memória = "1024"
+ notas = (conhecido após a aplicação)
+ numvcpus = (conhecido após a aplicação)
+ temporizador_propriedades_ovf = (conhecido após a aplicação)
+ origem_ovf = "/root/create-and-deploy-esxi/output-packer-centos7-x86_64/packer-centos7-x86_64.ova"
+ energia = "on"
+ nome_do_pool_de_recursos = (conhecido após a aplicação)
+ versão_hardware_virtual = (conhecido após a aplicação)
+ interfaces_de_rede {
+ endereço_mac = (conhecido após a aplicação)
+ tipo_nic = (conhecido após a aplicação)
+ rede_virtual = "Rede VM"
}
}
Plano: 1 para adicionar, 0 para alterar, 0 para destruir.
------------------------------------------------------------------------
Observação: Você não especificou um parâmetro "-out" para salvar este plano, então o Terraform
não pode garantir que exatamente estas ações serão realizadas se
"terraform apply" for executado posteriormente.
Final:
terraform applySe tudo foi feito corretamente, uma nova máquina virtual será implantada a partir da imagem criada anteriormente em 2-3 minutos.
As opções de uso de tudo isso são limitadas apenas pela imaginação.
Eu apenas queria compartilhar algumas experiências e mostrar os principais pontos ao trabalhar com esses produtos.
Obrigado pela atenção!
P.S.: Ficarei feliz em receber críticas construtivas.
Fonte: habr.com
