
Hello,
No post de hoje darei continuidade a série evolução, com uma breve introdução a ferramenta packer.
PACKER
Packer é uma ferramenta open source da hashicorp para criação de imagem/templates para varias plataformas (VMware, AWS, Azure, etc). Lembrar que, Imagem nada mais é que um ficheiro estático com OS pré instalado/configurado com pacotes de software já embutidos.
A prática de criação de imagens já é bastante comum, por exemplo no vSphere criamos templates para facilitar ou acelerar o provisionamento de servidores, o mesmo acontece com Vagrant que possui boxes e AWS possui Amazon Machine Image (AMI), que permite empacotar OS e software de forma a aumentar agilidade no deploy e versionamento ambientes.
Contudo o processo de criação e update destas imagens era manual e efectuado por ferramentas nativas ou internas de cada plataforma.
Com o Packer podemos automatizar este processo usando HCL “HashiCorp Configuration Language” ou JSON para criar templates “via code”, e o packer tem a vantagem de integrar-se de forma fácil com provisioners e configuration management como Ansible, puppet, terraform para instalação, configuração de pacotes e deploy.
Terminologia/componentes
Template: são ficheiros JSON que contém configuração dos vários componentes do Packer para criar uma ou mais imagens. Template JSON objecto que contem conjunto de configurações chaves dos vários componentes do Packer.
Builders: bloco Responsáveis por construir e indicar/direccionar imagens para várias plataformas. o builders contém uma matriz de todos os construtores que o Packer deve usar para gerar imagens. É no builders que definimos para quais plataformas estamos a gerar a imagem.
Exemplo de builders: VMware, AWS, Azure, Virtualbox, etc.
Provisioners: No provisionadores é onde podemos usar software interno “shell” e de terceiros para instalar e configurar a imagem da máquina após a inicialização ou boot.
O bloco provisioners é opcional e é usado para instalar e configurar software packages, patch, e executar varias ações no momento da criação/construção da imagem.
Exemplo de provisioners: Powershell, Ansible, puppet, Shell….
Post processor: A secção post-processor no template configura qualquer pós-processamento que será feito nas imagens construídas pelos builders, isto é, instruções a serem executadas depois de builders e provisioners.
Post processor é opcional e pode ser usado por exemplo para comprimir a imagem ou fazer upload num repositório.
Variables: Variáveis para ajudar a configurar/actualizar o template com parâmetros e variáveis de ambiente. Muito útil por exemplo para não expor passwords no ficheiro.
Vantagens
Portabilidade;
Multi plataforma (Virtual machine & Containers);
Rápido provisionamento, deploy de infra.
Hands On
Instalação manual
Para instalar packer manualmente é necessário baixar o binário Packer para OS que deseja, e colocar o binário num directório listado na variável $PATH para facilitar execução na linha de comando.
Download packer
https://www.packer.io/downloads
wget https://releases.hashicorp.com/packer/1.6.0/packer_1.6.0_linux_amd64.zip
#extrair no dir /usr/sbin/
unzip packer_1.6.0_linux_amd64.zip -d /usr/sbin/
#test
packer –version
Atenção a distros CentOS/RedHat já possue binário com nome packer (symbolic link de cracklib-packer) o que cria conflito, então é necessário remover o link ou renomear ou criar 1 symbolic link do hashicorp packer com um nome diferente.
Exemplo
Aqui partilharei este exemplo que:
Cria uma imagem AWS Linux “AMI”, usa provisioners (shell e ansible) para fazer update do OS, instalar apache e setup de uma página.
Outros exemplos “vsphere” podem encontrar no meu repo github: https://github.com/manuh-L/packer
ami.json
{
"builders": [
{
"type": "amazon-ebs",
"access_key": "",
"secret_key": "",
"region": "af-south-1",
"source_ami": "ami-0ec47ddb564d75b64",
"instance_type": "t3.micro",
"ssh_username": "",
"ami_name": "by-packer-{{timestamp}}",
"ami_description": "AMI by Manuh",
"tags": {
"Name": "Apache",
"Environment": "Dev",
"OS_Version": "Amazon Linux"
}
}
],
"provisioners": [
{
"type": "shell",
"script": "update.sh"
},
{
"type": "ansible",
"playbook_file": "apache.yml"
}
]
}
apache.yml
---
- name: webserver configuration
hosts: all
become: true
tasks:
- name: Install Apache
yum: name=httpd state=present
- name: Enable Apache Service on boot
service: name=httpd enabled=yes state=started
- name: Setting up web page
copy:
src: ./index.html
dest: /var/www/html/index.html
update.sh
#!/bin/bash
sudo yum update -y
index.html
<html>
<title>
<head>Hello Apache WebServer</head>
</title>
<body>
<div align="center">
<h1> Cockpit </h1>
<img src="https://manuh.s3.af-south-1.amazonaws.com/Cockpit+web+console.png">
</div>
</body>
</html>
#executar
packer build ami.json
OUTPUT:
Finalizando….
Packer é mais uma fantástica ferramenta IaC do ecossistema da hashicorp e usa HCL e JSON que considero mais prático ou fácil que YAML por causa de indentation.
O packer trás consigo a vantagem de ser multi-plataforma, pode acrescentar agilidade numa época de hybrid cloud e multi-cloud, em que podemos ter ambiente dev ou teste no DC on-premise e prod na cloud ou mesmo dev/Qa/prod em provedores public cloud diferentes, com packer podemos administrar vários ambientes/imagens e integrar no pipeline CI/CD.
Outro aspecto interessante, com esta ferramenta podemos atingir imutabilidade “immutable infrastructure”, uma abordagem de versionar a infraestrutura ou server e tornar “descartável em caso de servidores stateless” sem necessidade de upgrade do mesmo server durante o ciclo de vida da aplicação ou efectuar mudanças no servidor “em outras palavras, em termos de update/mudanças tornar o servidor ou infraestrutura versionada read-only”.
Bom caros, não resta mais nada a dizer além de exaltar a simplicidade de ferramentas como esta e encorajar a desenvolvermos skills de coding.
É hora de automatizar!