Criando imagens personalizadas com Packer para Google Cloud Platform

Criando imagens personalizadas com Packer para Google Cloud Platform

Olá pessoal, hoje no blog da 4Linux, vamos falar dessa ferramenta sensacional que é o Packer da HashiCorp. Bora lá.

O que é o Packer

O Packer é uma ferramenta de automação de criação de imagens desenvolvida pela HashiCorp. Ele permite criar imagens de máquinas virtuais ou contêineres de forma automatizada, garantindo a criação de imagens consistentes e prontas para serem implantadas em diferentes plataformas.

Com o Packer, você pode definir as configurações da imagem em um arquivo de configuração declarativo, especificando o sistema operacional, as dependências, as configurações do aplicativo e outras personalizações desejadas. Em seguida, o Packer cria a imagem executando esse arquivo de configuração, provisionando e configurando uma instância temporária da máquina virtual ou do contêiner e, em seguida, capturando essa instância em uma imagem final.

O Packer suporta várias plataformas de virtualização, como Amazon Web Services (AWS), Microsoft Azure, Google Cloud Platform (GCP), VMware, Docker e outros. Ele também é extensível e permite que você crie seus próprios plugins para suportar plataformas adicionais.

Instalação

Linux

Ubuntu/Debian:

Adicione a GPG Key da HashiCorp:

curl -fsSL https://apt.releases.hashicorp.com/gpg | sudo apt-key add -

Adicione o repositório oficial HashiCorp Linux:

`sudo apt-add-repository "deb [arch=amd64] https://apt.releases.hashicorp.com $(lsb_release -cs) main"

Atualize o repositório e faça a instalação:

sudo apt-get update && sudo apt-get install packer

Validando instalação*

 packer
Usage: packer [--version] [--help] <command> [<args>]

Available commands are:
    build           build image(s) from template
    console         creates a console for testing variable interpolation
    fix             fixes templates from old versions of packer
    fmt             Rewrites HCL2 config files to canonical format
    hcl2_upgrade    transform a JSON template into an HCL2 configuration
    init            Install missing plugins or upgrade plugins
    inspect         see components of a template
    validate        check that a template is valid
    version         Prints the Packer version

Criando imagem personalizada

Vamos criar a nossa imagem personalizada com o Docker já instalado nela. Para isso, primeiro vamos criar um arquivo chamado docker.sh da seguinte forma:

docker.sh

sudo apt-get update -y
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
echo \
  "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update -y
sudo apt-get install docker-ce docker-ce-cli containerd.io -y

Posteriormente, vamos criar nosso arquivo Packer com o seguinte conteúdo e no formato JSON.

ubuntu-docker.json

{
  "builders": [
    {
      "type": "googlecompute",
      "project_id": "seu-id-do-projeto",
      "source_image_family": "ubuntu-1804-lts",
      "zone": "us-central1-a",
      "ssh_username": "emerson",
      "image_name": "ubuntu-docker",
      "image_family": "ubuntu-1804-lts",
      "disk_size": "10",
      "tags": ["docker"],
      "metadata": {
        "4labs": "dev"
      }
    }
  ],

"provisioners": [
        {
  "type": "shell",
  "script": "docker.sh"
        }
]    

}

Para entender melhor o nosso arquivo do Packer:

type: tipo de builder, no caso vamos suar a GCP.

project_id: Id do projeto na GCP.

source_image_family: Versão do S.O escolhido como imagem base.

zone: Região da imagem

ssh_username: Usuário que vai ser criado.

image_name: Nome da imagem personalizda que será criada.

image_family: Label para definir se a imagem é do Debian, Ubuntu, RHEL, etc.

disk_size: Tamanho do disco da imagem.

Por fim temos os parametros referente ao provisioners:

type: Tipo de de provisionamento, por exemplo, ShellScript script: Nome do Script

Construindo nossa imagem

Após criação do nosso arquivo Packer e o Script para inicializar o Docker nessa imagem personalizada, vamos validar nossas configurações com o seguinte comando:

$ packer validate ubuntu-docker.json 
The configuration is valid.

Pronto. Bora fazer o nosso deploy. Antes, faça o login na GCP e ative as APIS abaixo em sequência:

gcloud auth application-default login

gcloud services enable sourcerepo.googleapis.com

gcloud services enable compute.googleapis.com

gcloud services enable servicemanagement.googleapis.com

gcloud services enable storage-api.googleapis.com

gcloud services enable compute

Build da nossa imagem:

packer build ubuntu-docker.json

Output:

googlecompute: output will be in this color.

==> googlecompute: Checking image does not exist...
==> googlecompute: Creating temporary RSA SSH key for instance...
==> googlecompute: Using image: ubuntu-1804-bionic-v20230605
==> googlecompute: Creating instance...
    googlecompute: Loading zone: us-central1-a
    googlecompute: Loading machine type: n1-standard-1
    googlecompute: Requesting instance creation...
    googlecompute: Waiting for creation operation to complete...
    googlecompute: Instance has been created!
==> googlecompute: Waiting for the instance to become running...
    googlecompute: IP: 34.172.43.120
==> googlecompute: Using SSH communicator to connect: 34.172.43.120
==> googlecompute: Waiting for SSH to become available...
==> googlecompute: Connected to SSH!
==> googlecompute: Provisioning with shell script: docker.sh

Nesse processo de Build, o Packer vai criar uma Instância na GCP e criar a nossa imagem personalizada com o script que criamos.

Se acessarmos https://console.cloud.google.com/compute/images?tab=images&authuser=4&hl=pt-br&project=ID_do_PROJETO vamos visualizar nossa imagem criada(Insira o ID do seu projeto no final da URL).

Por hoje é só pessoal! E assim conseguimos criar uma imagem personalizada para a GCP usando o Packer. Em breve volto com mais possibilidades com ele. Não esqueça de compartilhar esse artigo em suas redes sociais.

Até breve.

Referências:

https://www.packer.io/

https://www.packer.io/use-cases/automated-machine-images

https://developer.hashicorp.com/packer/tutorials/docker-get-started/get-started-install-cli

https://cloud.google.com/build/docs/building/build-vm-images-with-packer?hl=pt-br

 

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 Crie sua própria Wiki: Guia passo a passo para instalação e uso
Próxima A lenda do arquivo perdido. Domine a busca de arquivos no Linux com o comando find!

About author

Emerson Silva
Emerson Silva 13 posts

Desenvolvedor de Infraestrutura e Monitoramento, atua como Engenheiro DevOps na 4Linux, entusiasta DevOps e apaixonado por software livre

View all posts by this author →

Você pode gostar também

Desenvolvimento

Guia Completo: Como Utilizar o Vagrant para Gerenciar Máquinas Virtuais

Introdução Vagrant é uma ferramenta para criação e gerenciamento de máquinas virtuais de forma automatizada. Ele é usado principalmente para fins de desenvolvimento, permitindo que seja criado um ambiente de

Infraestrutura TI

Segurança e Boas Práticas na Criação e Geração de Imagens Docker: Do Dockerfile ao Deploy com Hadolint, SonarQube e Trivy

A conteinerização revolucionou a forma como desenvolvemos e implantamos aplicações, oferecendo consistência e escalabilidade. No entanto, com essa evolução, a segurança se torna uma preocupação crucial. Neste post, vamos explorar as melhores práticas para criar imagens Docker seguras, desde a elaboração do Dockerfile utilizando boas práticas e ferramentas como Hadolint e SonarQube, até a implementação de uma pipeline de deploy com Trivy.   Por Que a Segurança em Imagens Docker é Essencial? Imagens Docker comprometidas podem expor aplicações a vulnerabilidades, afetando a integridade dos sistemas e a confidencialidade dos dados. Implementar medidas de segurança desde a concepção do Dockerfile até o deploy é fundamental para mitigar riscos.   Boas Práticas na Criação do Dockerfile  1. Utilize Imagens Base Oficiais e

Desenvolvimento

Descubra o Redis: a solução open source para armazenamento de dados

Administradores de sistemas e desenvolvedores provavelmente em algum momento já precisaram de alguma solução para armazenar dados temporários – como token de sessão – que sejam acessíveis de um ponto