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