Guia prático: Crie e configure máquinas virtuais com shell script

Guia prático: Crie e configure máquinas virtuais com shell script

Entenda como criar diversas máquinas virtuais e configurar seus serviços com shell script.

Instalação das dependências

Inicialmente é preciso fazer a instalação do VirtualBox, que sera o responsável por criar nossas VMs. O vagrant aceita diversos HyperVisors, mas, iremos utilizar o VBox por sua simplicidade, sendo um dos mais utilizados no dia-a-dia  Baixe aqui.

O segundo passo é fazer o Download e a instalação do Vagrant Baixe aqui 
Após a instalação do Vagrant e VBox basta criar um diretório que deseja iniciar o seu projeto
acesse o diretório criado e digite o comando vagrant init, com isto o vagrant ira criar um arquivo padrão chamado Vagrantfile que contem algumas configurações pré-definidas. 
Abra este arquivo com o editor de sua preferência, no meu caso irei utilizar o VIM
podemos observar que o arquivo vem com diversas opções genéricas comentadas, como iremos realizar as operações do zero, podemos apagar o conteúdo do arquivo da seguinte forma no seu terminal
echo > file
Agora com o arquivo vazio podemos iniciar as configurações, primeiramente passando para que seu VI (VIM) entenda que se trata de uma sintaxe ruby, as seguintes linhas no cabeçalho do arquivo
# -*- mode: ruby -*- 
# vi: set ft=ruby :
Por se tratar de um provisionamento com máquinas simultanêas podemos iniciar criando um lista chamada vms:
vms = {

}
Dentro desta lista iremos setar um valor para o nome das máquinas e criar novamente uma lista
vms = { 
  'debian-server' => { } 
}
Nesta nova lista iremos passar as configurações principais de nossa máquina como: box, ip, memória e o arquivo shell que iremos criar futuramente, com a lista ficando desta forma:
vms = { 
  'debian-server' => {'memory' => '512', 'cpus' => '1', 'ip' => '10', 'box' => 'debian/stretch64', 'provision' => 'debian-server.sh'}, 
  'ubuntu-server' => {'memory' => '512', 'cpus' => '1', 'ip' => '11', 'box' => 'ubuntu/xenial64', 'provision' => 'ubuntu-server.sh'} 
}

       Sendo sempre uma chave e um valor

       ex: ‘chave’ => ‘valor’

       Com isto temos uma lista com todas as nossas configurações e caso desejemos novas máquinas basta incluir seguindo a estrutura passada

       Agora precisamos  iniciar a configuração com o Vagrant da seguinte forma

Vagrant.configure('2') do |config|

end
Esta é a forma padrão de configuração do vagrant, é necessário colocar qualquer trecho de código dentro deste bloco para serem realizadas as configurações
Vagrant.configure('2') do |config|
   vms.each do |name, conf|
  end
end
Desta forma iremos fazer uma iteração tipica da linguaguem ruby “eacho do” este executa para cada elemento a lógica passada no bloco.
sendo os parametros name(Nome da nossa máquina passada na lista) conf(Configurações passadas dentro da nossa lista também)
Lembrando que utilizamos uma lista dentro de outra lista, por isso conseguimos segregar os valores desta forma.
Vagrant.configure('2') do |config|
  vms.each do |name, conf|
      config.vm.define "#{name}" do |my|
        my.vm.box = conf['box']
        my.vm.hostname = "#{name}.example.com"
        my.vm.network 'private_network', ip: "172.27.11.#{conf['ip']}"
        my.vm.provision 'shell', path: "Provision/#{conf['provision']}"
        my.vm.provider 'virtualbox' do |vb|
         vb.memory = conf['memory']
         vb.cpus = conf['cpus']
        end
      end
  end
end

config.vm.define é utilizado para provisionamento multiplo de máquinas (mult machine) e leva um único parametro obrigatório que é o nome da máquina virtual.
Os valores da lista serão setados desta forma seguindo o padrão do vagrant utilizando nossa lista inicial my.vm.<parametro-do-vagrant> desta forma obtemos como exemplo “my.vm.box” que ira receber o nome da box que definimos na lista
para passar os valores seguindo nossa lógica de lista dentro de uma lista precisamos identificar pelo parametro, como foi informado anteriormente o valor conf representa nossas configurações da VM, com isso basta definir “my.vm.box = conf[‘box’]” feito isso o valor será substituido pela box passada em nossa lista
No caso de passar o valor no meio de uma string é feito da seguinte forma ex: my.vm.network ‘private_network’, ip: “172.27.11.#{conf[‘ip’]}”
É preciso passar “#{<parametro>[‘valor’]}” ou “#{name}” assim teremos o valor do nome de nossa VM sendo na primeira iteração a debian e assim por diante conforme outras máquinas vão sendo  implementadas. O arquivo final ficará assim:
# -*- mode: ruby -*-
# vi: set ft=ruby :
vms = {
'debian-server' => {'memory' => '512', 'cpus' => '1', 'ip' => '10', 'box' => 'debian/stretch64', 'provision' => 'debian-server.sh'},
'ubuntu-server' => {'memory' => '512', 'cpus' => '1', 'ip' => '11', 'box' => 'ubuntu/xenial64', 'provision' => 'ubuntu-server.sh'}
}

Vagrant.configure('2') do |config|
  vms.each do |name, conf|
     config.vm.define "#{name}" do |my|
       my.vm.box = conf['box']
       my.vm.hostname = "#{name}.example.com"
       my.vm.network 'private_network', ip: "172.27.11.#{conf['ip']}"
       my.vm.provision 'shell', path: "Provision/#{conf['provision']}"
       my.vm.provider 'virtualbox' do |vb|
          vb.memory = conf['memory']
          vb.cpus = conf['cpus']
       end
     end
  end
end

Desta forma finalizamos a configuração de nosso vagrantfile, basta seguir com o provisionamento baseado no Shell Script

Shell Script

Bom para que possamos instalar nossos pacotes ou arquivos de configuração, hosts e hostname iremos utilizar o pai de todos, shell :3
basta criar um arquivo com o nome de sua máquina (pois passamos desta forma no vagrantfile) 
touch debian-server.sh
Agora podemos escrever um código bem simples para instalar o nginx, criar usuarios novos e alterar a senha dos já existentes
Como estamos trabalhando com várias máquinas, podemos realizar a mesma operação para o debian e o ubuntu em nosso vagrant, para isso podemos seguir uma estrutura utilizando funções no código
Estrutura
- Vagrantfile
- Provision (Diretório)
  - vars.sh (arquivo com as funções e algumas variáveis)
  - debian-server.sh, ubuntu-server.sh (arquivos para o provisionamento)
arquivo com as funções e variáveis principais

#!/bin/bash
### vars.sh ####
USER='suporte'
PASS='4linux'
function addUsers {
#criando o usuário suporte
useradd -m -d "/home/${USER}" -p $(openssl passwd -1 ${PASS}) -s /bin/bash ${USER}

#alterando a senha do usuario vagrant
sudo usermod -p $(openssl passwd -1 ${PASS}) vagrant

#alterando a senha do root
sudo usermod -p $(openssl passwd -1 ${PASS}) root
}

function installNginx {
#atualizando os pacotes
sudo apt-get update -y; wait;

#instalando o nginx
sudo apt-get install -y nginx;
}

arquivo de provisionamento
ex: debian-server.sh

#!/bin/bash
source /vagrant/Provision/vars.sh

#chama a função de criação e alteração de usuários
addUsers;

#chama a função de instalação do nginx
installNginx;

O vagrant cria um diretório padrão para compartilhar arquivos entre o diretório que contem o vagrantfile e um diretório na máquina guest chamado /vagrant, com isso ao provisionar para acessar o script podemos passar esse diretório que contem todos os arquivos de nosso projeto
O source no shell script serve para que possamos carregar todas as variáveis e funções de outro arquivo para nosso bash gerado pelo nosso .sh
após finalizar o mesmo código para ambas as máquinas basta acessar o diretório com o vagrantfile e digitar o seguinte comando:
 vagrant up

Com isso as máquinas serão provisionadas com o vagrant chamando o shell script na máquina virtual no momento da inicialização, desta forma os usuários serão alterados e o nginx instalado.

Líder em Treinamento e serviços de Consultoria, Suporte e Implantação para o mundo open source. Conheça nossas soluções:

CURSOSCONSULTORIA

Anterior Transforme sua carreira com os novos cursos open source da 4Linux
Próxima Aprenda Linux agora: Aumento de interesse em cursos e soluções durante a pandemia

About author

Gabriel Nascimento
Gabriel Nascimento 4 posts

Gabriel Nascimento, Formado como Tecnologo em Análise e Desenvolvimento de Sistemas pela UNASP e Técnico em Redes de computadores pela ETEC de Embu , atua como Analista de infraestrutura Linux com ênfase em automação de tarefas bem com as tecnologias Jenkins, Shell Script, Puppet, Chef e Ansible

View all posts by this author →

Você pode gostar também

Infraestrutura TI

Como Configurar Alta Disponibilidade de Interfaces de Rede com Bonding no Linux

Quando falamos de infraestrutura, um dos pré-requisitos é se pensar em alta disponibilidade, seja ela de: Máquinas Virtuais Storages Máquinas Físicas Links de Internet E etc. Nesse post vou explicar

Infraestrutura TI

Novidades do PostgreSQL 16

Com o lançamento da nova versão 16 do PostgreSQL, teremos melhorias significativas em seu desempenho, com notáveis aprimoramentos na paralelização de consultas, carregamento em massa de dados e replicação lógica.

Infraestrutura TI

Kompose: Ferramenta para conversão do Docker Compose para Kubernetes

Hoje, no blog da 4Linux, vamos falar sobre o Kompose: uma ferramenta que faz a conversão do Docker Compose para orquestradores de containers como o Kubernetes. O Kompose tem como