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
1echo > 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
1# -*- mode: ruby -*-
2# vi: set ft=ruby :
Por se tratar de um provisionamento com máquinas simultanêas podemos iniciar criando um lista chamada vms:
1vms = {
2 
3}
Dentro desta lista iremos setar um valor para o nome das máquinas e criar novamente uma lista
1vms = {
2  'debian-server' => { }
3}
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:
1vms = {
2  'debian-server' => {'memory' => '512', 'cpus' => '1', 'ip' => '10', 'box' => 'debian/stretch64', 'provision' => 'debian-server.sh'},
3  'ubuntu-server' => {'memory' => '512', 'cpus' => '1', 'ip' => '11', 'box' => 'ubuntu/xenial64', 'provision' => 'ubuntu-server.sh'}
4}

       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

1Vagrant.configure('2') do |config|
2 
3end
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
1Vagrant.configure('2') do |config|
2   vms.each do |name, conf|
3  end
4end
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.
01Vagrant.configure('2') do |config|
02  vms.each do |name, conf|
03      config.vm.define "#{name}" do |my|
04        my.vm.box = conf['box']
05        my.vm.hostname = "#{name}.example.com"
06        my.vm.network 'private_network', ip: "172.27.11.#{conf['ip']}"
07        my.vm.provision 'shell', path: "Provision/#{conf['provision']}"
08        my.vm.provider 'virtualbox' do |vb|
09         vb.memory = conf['memory']
10         vb.cpus = conf['cpus']
11        end
12      end
13  end
14end
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:
01# -*- mode: ruby -*-
02# vi: set ft=ruby :
03vms = {
04'debian-server' => {'memory' => '512', 'cpus' => '1', 'ip' => '10', 'box' => 'debian/stretch64', 'provision' => 'debian-server.sh'},
05'ubuntu-server' => {'memory' => '512', 'cpus' => '1', 'ip' => '11', 'box' => 'ubuntu/xenial64', 'provision' => 'ubuntu-server.sh'}
06}
07 
08Vagrant.configure('2') do |config|
09  vms.each do |name, conf|
10     config.vm.define "#{name}" do |my|
11       my.vm.box = conf['box']
12       my.vm.hostname = "#{name}.example.com"
13       my.vm.network 'private_network', ip: "172.27.11.#{conf['ip']}"
14       my.vm.provision 'shell', path: "Provision/#{conf['provision']}"
15       my.vm.provider 'virtualbox' do |vb|
16          vb.memory = conf['memory']
17          vb.cpus = conf['cpus']
18       end
19     end
20  end
21end
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) 
1touch 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
1Estrutura
2- Vagrantfile
3- Provision (Diretório)
4  - vars.sh (arquivo com as funções e algumas variáveis)
5  - debian-server.sh, ubuntu-server.sh (arquivos para o provisionamento)
01arquivo com as funções e variáveis principais
02 
03#!/bin/bash
04### vars.sh ####
05USER='suporte'
06PASS='4linux'
07function addUsers {
08#criando o usuário suporte
09useradd -m -d "/home/${USER}" -p $(openssl passwd -1 ${PASS}) -s /bin/bash ${USER}
10 
11#alterando a senha do usuario vagrant
12sudo usermod -p $(openssl passwd -1 ${PASS}) vagrant
13 
14#alterando a senha do root
15sudo usermod -p $(openssl passwd -1 ${PASS}) root
16}
17 
18function installNginx {
19#atualizando os pacotes
20sudo apt-get update -y; wait;
21 
22#instalando o nginx
23sudo apt-get install -y nginx;
24}

arquivo de provisionamento
ex: debian-server.sh

1#!/bin/bash
2source /vagrant/Provision/vars.sh
3 
4#chama a função de criação e alteração de usuários
5addUsers;
6 
7#chama a função de instalação do nginx
8installNginx;
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

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

Cloud

Guia completo: Implantação de MongoDB resiliente no Google Kubernetes Engine

Este guia aborda a implantação de um MongoDB resiliente no GKE, incluindo etapas para configurar um StatefulSet, serviço headless e inicializar o conjunto réplica. Aprenda a utilizar recursos do GKE

Infraestrutura TI

Descubra o Opensearch: a ferramenta opensource para análise de logs e monitoramento

Heeey! Podemos nos referir ao Opensearch como um fork do Elasticsearch e Kibana 7.10. Basicamente, o Opensearch é uma ferramente de monitoração de aplicação e análise de logs totalmente opensource

Treinamentos

Descubra o poder do Kubernetes e como ele pode impulsionar suas aplicações

    Kubernetes ou “k8s” para os íntimos, é uma ferramenta de código aberto originalmente desenvolvido pela Google, utilizado para a orquestração de containers, ou seja, para implantação, dimensionamento e