Provisionando um repositório privado para Vagrant Boxes

Thursday, February 13, 2020

No artigo anterior demonstrei passo à passo como criar suas próprias Vagrant Boxes, do zero até a execução. Ficou bem interessante.

Neste artigo quero te mostrar como criar um repositório privado pra você publicar suas Boxes de forma controlada.

Aqui estou utilizando uma VM com as seguintes especificações:

  • CentOS Linux release 7.7.1908 (Core)
  • 1 GB de memória RAM
  • 10 GB de armazenamento
  • Usuário SSH com permissão de sudo

Executando alguns pré-requesitos

Antes de executar qualquer instalação e/ou configuração gosto de assegurar que alguns pré-requesitos sejam atendidos. Como:

  • Ajustar o nome do servidor de acordo com a função à ele concedida.
hostnamectl set-hostname vagrant-repo && bash
  • Editar o arquivo /etc/hosts para garantir que ele esteja semelhante a configuração abaixo.
127.0.0.1	localhost
::1         localhost
10.10.10.10	vagrant-repo.meudominio.local vagrant-repo

10.10.10.10 é o IP do meu servidor, vagrant-repo é o nome do servidor e meudominio.local é o domínio que estou utilizando para este artigo. Ajuste de acordo com o seu ambiente.

  • Ajustar minhas configurações de localidades.
localectl set-locale LANG=pt_BR.UTF-8
  • Garantir que o meu timezone esteja correto.
timedatectl set-timezeon "America/Recife"
  • Alterar o estado do SELinux para permissive.
setenforce 0
sed -i 's/SELINUX=enforcing/SELINUX=permissive/g' /etc/selinux/config
  • Vou adiantar logo a liberação da porta 80/HTTP no firewalld.
firewall-cmd --permanent --add-service=http
firewall-cmd --reload

Tudo certo. Agora posso continuar tranquilo.

Criando a estrutura de diretórios necessária

Preciso criar uma estrutura de diretórios na qual seja possível versionar posteriormente as Boxes de forma organizada.

mkdir -p /var/www/html/vagrant/boxes

Cada Box terá um diretório principal (raíz) e diversos subdiretórios que corresponderão por suas versões.

Para este artigo, por exemplo, estou utilizando uma Box chamada centos-base-image, que está na versão 20200213.0.0.

A versão acima nada mais é que MAJOR.MINOR.PATCH.

MAJOR: aqui utilizo a data de publicação da Box, semelhante ao que se pede no formato de data estabelecido pela ISO 8601 Date And Time Format.

MINOR: aqui são adições de funcionalidades, porém mantendo a compatibilidade.

PATCH: esse representa correções de falhas mantendo a compatibilidade.

Para mais informações sobre esse formato de versionamento é só consultar o manual Versionamento Semântico 2.0.0.

Com as informações acima devidamente explicadas, posso dar continuidade criando o diretório base da Box assim como seu subdiretório.

mkdir -p /var/www/html/vagrant/boxes/centos-base-image/v20200213.0.0

Faço o upload do arquivo centos-base-image.box para o repositório.

scp centos-base-image.box root@vagrant-repo.meudominio.local:/var/www/html/vagrant/boxes/centos-base-image/v20200213.0.0

No mesmo diretório da Box mantenho um arquivo contendo a hash SHA256 que será utilizada para validar o arquivo.

Para gerar a hash é simples. Basta executar o comando abaixo.

sha256sum centos-base-image.box

Na sequência basta pegar a saída do comando acima e criar um arquivo de mesmo nome da Box, mas com sufixo .sha256. No meu caso o arquivo que criei foi nomeado de centos-base-image.box.sha256 cujo conteúdo é:

55dbddadfa7f169e569898bcfcef44c5cec3d679bf53fc0634fdcb2d11074700  centos-base-image.box

Para finalizar essa parte, preciso apenas criar um arquivo no formato JSON que servirá como um index contendo as informações de todas as Boxes disponíveis no repositório. Vou nomear o arquivo de index.json.

Como só tenho uma Box no repositório até então, o arquivo ficará da seguinte forma

{
    "name": "centos-base-image",
    "description": "This box contains CentOS 7.7.1908 (Core) 64-bit.",
    "versions": [
      {
        "version": "20200213.0.0",
        "providers": [
          {
            "name": "virtualbox",
            "url": "http://repo.meudominio.local/boxes/centos-base-image/v20200213.0.0/centos-base-image.box",
            "checksum_type": "sha256",
            "checksum": "55dbddadfa7f169e569898bcfcef44c5cec3d679bf53fc0634fdcb2d11074700"
          }
        ]
      }
    ]
}

Perceba que acima, no campo url, utilizei o DNS repo.meudominio.local e não vagrant-repo.meudominio.local, que é o nome do servidor. Gosto e acho importante trabalhar assim. Utilizarei esse nome mais na frente, na criação do Virtual Host.

Com isso o nome repo.meudominio.local é um CNAME para vagrant-repo.meudominio.local.

Analise se isso faz sentido pra você.

Para finalizar esta parte temos a seguinte estrutura de diretórios.

/var/www/html/vagrant/
├── boxes
│   └── centos-base-image
│       └── v20200213.0.0
│           ├── centos-base-image.box
│           └── centos-base-image.box.sha256
└── index.json

3 directories, 3 files

Configuração do Virtual Host

Aqui o negócio é mais simples.

Basta eu criar o arquivo /etc/httpd/conf.d/vagrant.conf com o seguinte conteúdo:

<VirtualHost *:80>
	ServerName repo.meudominio.local
	ServerAlias repo
	ServerAdmin sysadmin@meudominio.local
	DocumentRoot "/var/www/html/vagrant"

	ErrorLog logs/repo.meudominio.local_error.log
	CustomLog logs/repo.meudominio.local_access.log combined

	<IfModule dir_module>
		DirectoryIndex index.json
	</IfModule>
</VirtualHost>

Por enquanto vou brincar só na porta 80/HTTP mesmo.

Verifico se ficou tudo OK com a sintaxe do arquivo. Importante.

apachectl configtest

O resultado precisa ser Syntax OK.

Na sequência, recarrego as configurações do Apache com o comando abaixo.

systemctl reload httpd

Agora é só chamar no browser.

Imagem 00Imagem com o resultado do funcionamento do repositorio no browser

Baixando e executando a Box a partir do Vagrantfile

Para validar se ficou tudo OK mesmo, basta eu criar o Vagrantfile abaixo.

# -*- mode: ruby -*-
# vi: set ft=ruby :

Vagrant.configure("2") do |config|
  
  config.vm.define "centos-base-image" do |centos|
    centos.vm.box = "centos-base-image"
    centos.vm.box_version = "20200213.0.0"
    centos.vm.box_url = "http://repo.meudominio.local"
    centos.vm.box_download_checksum = "http://repo.meudominio.local/boxes/centos-base-image/v20200213.0.0/centos-base-image.box.sha256"
    centos.vm.box_download_checksum_type = "sha256"
    centos.vm.box_check_update = true
    centos.vm.hostname = "centos-tutorial"
    centos.vm.network "private_network", ip: "10.10.10.5"
    centos.vm.post_up_message = "Vagrant Box v20200213.0.0 - CentOS 7.7.1908 (Core)"

    centos.vm.provider "virtualbox" do |vb|
      vb.name = "vagrant-centos-tutorial-repo"
      vb.gui = false
      vb.cpus = 1
      vb.memory = 512
    end

    centos.vm.provision "shell", inline: <<-SHELL
     getenforce
     firewall-cmd --state
     SHELL
  end
end

Executo um teste de validação de sintaxe. Importante.

vagrant validate

O resultado do comando acima precisa ser Vagrantfile validated successfully.

Agora é só executar o comando vagrant up.

Abaixo o resultado da execução do comando acima.

Imagem 01Screenshot da execução do comando vagrant up

Só sucesso. Nas próximas execuções dessa Box não será mais necessário baixar a imagem do repositório, porque a Box já foi importada para o repositório local. Esse fluxo pode ser comparado a trabalhar com imagens Docker.

Versionando as Boxes

Então, para versionar as Boxes é simples, basta seguir o mesmo fluxo que fiz neste artigo, porém, acrescentando os subdiretórios das versões que irão surgindo.

Digamos que precisei adicionar o serviço ntpd na Box, para quando alguém baixar e executar a Box o serviço já esteja instalado e devidamente configurado. Sendo assim, seguindo a regra do Versionamento Semântico a imagem será versionada como 20200213.1.0. Lembre-se de que falei dessa nomenclatura mais acima.

A estrutura de diretórios agora está da seguinte forma:

/var/www/html/vagrant/
├── boxes
│   └── centos-base-image
│       ├── v20200213.0.0
│       │   ├── centos-base-image.box
│       │   └── centos-base-image.box.sha256
│       └── v20200213.1.0
│           ├── centos-base-image.box
│           └── centos-base-image.box.sha256
└── index.json

4 directories, 5 files

E o arquivo index.json ficará da seguinte forma:

{
    "name": "centos-base-image",
    "description": "This box contains CentOS 7.7.1908 (Core) 64-bit.",
    "versions": [
      {
        "version": "20200213.0.0",
        "providers": [
          {
            "name": "virtualbox",
            "url": "http://repo.meudominio.local/boxes/centos-base-image/v20200213.0.0/centos-base-image.box",
            "checksum_type": "sha256",
            "checksum": "55dbddadfa7f169e569898bcfcef44c5cec3d679bf53fc0634fdcb2d11074700"
          }
        ]
    },{
        "version": "20200213.1.0",
        "providers": [
          {
            "name": "virtualbox",
            "url": "http://repo.meudominio.local/boxes/centos-base-image/v20200213.1.0/centos-base-image.box",
            "checksum_type": "sha256",
            "checksum": "55dbddadfa7f169e569898bcfcef44c5cec3d679bf53fc0634fdcb2d11031456"
          }]
    }]
}

É normal que a partir do momento em que vamos incrementando dados no arquivo index.json os requisitos de abrir e fechar } e ] fiquem confusos. Para checar a sintaxe, utilizo um serviço web sensacional chamado JSON formatter & Validator que faz um lint detalhado no conteúdo do arquivo JSON

Quando chamo no browser obtenho o seguinte.

Imagem 02Imagem com a visualização do repositório no browser

O “pulo do gato” aqui é o valor boleano da linha abaixo…

centos.vm.box_check_update = true

… que por estar true fará com que o Vagrant, no momento da execução do vagrant up, busque no repositório por atualizações e quando houver irá automaticamente executar o download da Box.

Missão cumprida. Analise se essa solução é útil pra você e em caso positivo desejo bom uso.

Abraço!

vagrantvagrantapache

Monitoramento do Proxmox Virtual Environment (PVE) com Prometheus

Criando sua própria Vagrant Box para o VirtualBox

comments powered by Disqus