alisonbuss / coreos-packer

Projeto de criação de imagens CoreOS para múltiplas plataformas (Amazon EC2, Google GCE, DigitalOcean, VirtualBox).

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Translation for: English.

Status do Projeto: (Finalizado).

Projeto de criação de imagens CoreOS
para múltiplas plataformas
(Amazon EC2, Google GCE, DigitalOcean, VirtualBox)

Inspirado nos projetos:

Dependência de ferramentas:

⚠️ Nota:

  • É necessário ter instalado as dependências citadas acima, para que o projeto funcione.
  • A execução desse projeto foi feita através de um Desktop Ubuntu 17.10 (Artful Aardvark).

Documentação de apoio:

Objetivo:

Fornecer um projeto de "Infrastructure as Code (IaC)" usando Packer Templates e Shell Script para provisionar uma imagem básica para as múltiplas plataformas (Amazon EC2, Google GCE, DigitalOcean, VirtualBox).

Plataformas Suportadas:

  • [Digital Ocean] - ❌ Não Implementado...
  • [Amazon EC2 AMI] - ❌ Não Implementado...
  • [VirtualBox e Vagrant Box] - ✔️ Implementado.
  • [Google Cloud Compute Engine (GCE)] - ❌ Não Implementado...

Imagem Packer:

  • CoreOS Stable 1688.5.3
    • kernel: v4.16.3
    • systemd: v238
    • ignition: v0.24.0
    • rkt: v1.30.0
    • docker: v18.04.0
    • docker-compose: v1.19.0
    • etcd v2.3.8
    • etcd v3.2.15
    • flannel v0.10.0
    • active-python: v2.7.13

Para o pré-provisionamento básico da imagem CoreOS, será através dos arquivos de Shell Script:

./pre-provision/shell-script/download-support-files.sh
./pre-provision/shell-script/install-python.sh
./pre-provision/shell-script/install-rkt.sh
./pre-provision/shell-script/install-docker.sh
./pre-provision/shell-script/install-docker-compose.sh
./pre-provision/shell-script/install-etcd.sh
./pre-provision/shell-script/install-flannel.sh
./pre-provision/shell-script/provide-basic-security.sh
./pre-provision/shell-script/provide-image-finalization.sh

⚠️ Nota:

Estrutura do Projeto:

Descrição dos arquivos e diretorios do projeto:

coreos-packer................................Pasta do projeto.
├── packer-templates.........................Pasta dos templates Packer.
│   ├── coreos-all-platforms-template.json...Template para todas as plataformas.
│   ├── coreos-aws-template.json.............Template para a plataforma Amazon EC2 AMI.
│   ├── coreos-digitalocean-template.json....Template para a plataforma Digital Ocean.
│   ├── coreos-google-template.json..........Template para a plataforma Google Cloud Compute Engine (GCE).
│   └── coreos-virtualbox-template.json......Template para a plataforma VirtualBox e Vagrant Box.
├── packer-variables.........................Variáveis Packer.
│   ├── credential...........................Variáveis das credenciais de autorizações das plataformas.
│   │   ├── aws.json.........................Credencial de autorização Amazon.
│   │   ├── digitalocean.json................Credencial de autorização Digital Ocean.
│   │   └── google.json......................Credencial de autorização Google Cloud Compute Engine.
│   ├── custom.json..........................Variável de customizações geral, "Irá sobrescrever as demais variáveis".
│   ├── global.json..........................Variável global.
│   ├── operational-system...................Variáveis do tipo de sistema operacional.
│   │   └── coreos.json......................Variável do sistema operacional CoreOS.
│   └── platform.............................Variáveis específicas de cada plataforma.
│       ├── aws.json
│       ├── digitalocean.json
│       ├── google.json
│       └── virtualbox.json
├── pre-provision............................Pasta dos arquivos de pré-provisionamento da imagem Packer.
│   ├── container-linux-config...............Pasta onde se encontra os "Container Linux Config" para ser convertidos em "ignitions".
│   │   ├── examples.........................Pasta de exemplos "Container Linux Config".
│   │   │   ├── basic-ignition.yml
│   │   │   ├── does-everything.yml
│   │   │   └── vagrant-ignition.yml
│   │   └── keys-to-underworld.yml...........Arquivo principal de "Container Linux Config" será convertido em "ignitions".
│   ├── ignitions............................Pasta onde será armazenados os "Container Linux Config" convertidos em "ignition".
│   │   ├── keys-to-underworld-for-digitalocean.json
│   │   ├── keys-to-underworld-for-ec2.json
│   │   ├── keys-to-underworld-for-gce.json
│   │   ├── keys-to-underworld-for-vagrant-virtualbox.json
│   │   └── keys-to-underworld.json
│   ├── shell-script.........................Scripts de pré-provisionamento da imagem Packer.
|   |   ├── download-support-files.sh
│   │   ├── install-docker-compose.sh
│   │   ├── install-docker.sh
│   │   ├── install-etcd.sh
│   │   ├── install-flannel.sh
│   │   ├── install-python.sh
│   │   ├── install-rkt.sh
│   │   ├── provide-basic-security.sh
│   │   └── provide-image-finalization.sh
│   ├── vagrant_insecure_private_key.........Chave privada do Vagrant.
│   └── vagrant_insecure_public_key.pub......Chave publica do Vagrant.
├── build-image.sh...........................Shell Script responsavel pelo build do projeto "coreos-packer".
├── LICENSE..................................Licença (MIT).
├── Makefile.................................Arquivo principal de start do projeto "coreos-packer".
├── Makefile.test............................Arquivo de teste do Makefile.
├── README_DOC.md............................Documentação Técnica do Projeto "coreos-packer"
├── README_LANG_EN.md........................Arquivo de tradução do README.md
└── README.md................................Documentação Geral do Projeto "coreos-packer"

Arquivo principal do projeto Makefile.

#-----------------------|DOCUMENTATION|-----------------------#
# @descr: Makefile for project construction.
# @example:
#       $ make plan compile validate build
#   OR
#       $ make build-force
#   OR
#       $ make clean
#   OR
#       $ make plan compile build install-box PACKER_ONLY="virtualbox-iso"
#   OR
#       $ make uninstall-box
#-------------------------------------------------------------#

# DEFAULT VARIABLES - Structural
WORKING_DIRECTORY         ?= .
#WORKING_DIRECTORY        ?= `pwd`

# DEFAULT VARIABLES - Packer!!!
PACKER_TEMPLATE           ?= coreos-virtualbox-template.json
PACKER_VARIABLES          ?= global.json /operational-system/coreos.json /platform/virtualbox.json custom.json
PACKER_ONLY               ?= virtualbox-iso

PACKER_TEMPLATES_PATH     ?= $(WORKING_DIRECTORY)/packer-templates
PACKER_VARIABLES_PATH     ?= $(WORKING_DIRECTORY)/packer-variables

# DEFAULT VARIABLES - Ignition For CoreOS
IGNITION_SOURCE_FILE      ?= $(WORKING_DIRECTORY)/pre-provision/container-linux-config/keys-to-underworld.yml
IGNITION_COMPILATION_PATH ?= $(WORKING_DIRECTORY)/pre-provision/ignitions
IGNITION_PLATFORMS        ?= vagrant-virtualbox digitalocean ec2 gce

# DEFAULT VARIABLES - Vagrant
VAGRANT_BOX_NAME          ?= packer/coreos-vagrant-box
VAGRANT_BOX_PATH          ?= $(WORKING_DIRECTORY)/builds/image-coreos-vagrant.box

# DEFAULT VARIABLES - Compile, validate and build image files for Project Packer.
BUILD_IMAGE_CMD           ?= $(WORKING_DIRECTORY)/build-image.sh

plan: 
    @echo "The default values to be used by this Makefile:";
    @echo "";
    @echo "    --> MAKECMDGOALS: make $(MAKECMDGOALS)";
    @echo "    --> WORKING_DIRECTORY: $(WORKING_DIRECTORY)";
    @echo "";
    @echo "    --> PACKER_TEMPLATE: $(PACKER_TEMPLATE)";
    @echo "    --> PACKER_VARIABLES: [$(PACKER_VARIABLES)]";
    @echo "    --> PACKER_ONLY: $(PACKER_ONLY)";
    @echo "    --> PACKER_TEMPLATES_PATH: $(PACKER_TEMPLATES_PATH)";
    @echo "    --> PACKER_VARIABLES_PATH: $(PACKER_VARIABLES_PATH)";
    @echo "";
    @echo "    --> IGNITION_SOURCE_FILE: $(IGNITION_SOURCE_FILE)";
    @echo "    --> IGNITION_COMPILATION_PATH: $(IGNITION_COMPILATION_PATH)";
    @echo "    --> IGNITION_PLATFORMS: $(IGNITION_PLATFORMS)";
    @echo "";
    @echo "    --> VAGRANT_BOX_NAME: $(VAGRANT_BOX_NAME)";
    @echo "    --> VAGRANT_BOX_PATH: $(VAGRANT_BOX_PATH)";
    @echo "";
    @echo "    --> BUILD_IMAGE_CMD: $(BUILD_IMAGE_CMD)";
    @echo "";

compile: 
    @echo "Starting the compilation of the (IGNITION COREOS)..."; 
    @echo "--source file: $(IGNITION_SOURCE_FILE)"; 
    @echo "--compilation path: $(IGNITION_COMPILATION_PATH)"; 

    @bash $(BUILD_IMAGE_CMD) --action="compile" \
                             --source-file="$(IGNITION_SOURCE_FILE)" \
                             --compilation-path="$(IGNITION_COMPILATION_PATH)" \
                             --platforms="$(IGNITION_PLATFORMS)";

    @echo "Complete compilation!";

validate:
    @echo "Starting the validation of the template Packer..."; 
    @echo "--template file: $(WORKING_DIRECTORY)/packer-templates/$(PACKER_TEMPLATE)"; 

    @bash $(BUILD_IMAGE_CMD) --action="inspect" \
                             --template-file="$(PACKER_TEMPLATES_PATH)/$(PACKER_TEMPLATE)";

    @bash $(BUILD_IMAGE_CMD) --action="validate" \
                             --template-file="$(PACKER_TEMPLATES_PATH)/$(PACKER_TEMPLATE)" \
                             --variables="$(PACKER_VARIABLES)" \
                             --variables-path="$(PACKER_VARIABLES_PATH)";

build:
    @echo "Starting the BUILD of the template Packer..."; 
    @echo "--template file: $(WORKING_DIRECTORY)/packer-templates/$(PACKER_TEMPLATE)";

    @bash $(BUILD_IMAGE_CMD) --action="build" \
                             --template-file="$(PACKER_TEMPLATES_PATH)/$(PACKER_TEMPLATE)" \
                             --variables="$(PACKER_VARIABLES)" \
                             --variables-path="$(PACKER_VARIABLES_PATH)" \
                             --packer-only="$(PACKER_ONLY)" \
                             --working-directory="$(WORKING_DIRECTORY)";

build-force: clean compile validate build

clean:
    @echo "Initiating deletion of compilation files from the Project Packer...";
    @echo "--affected directory: $(WORKING_DIRECTORY)/builds";

    @rm -rf $(WORKING_DIRECTORY)/builds; sleep 2s;

    @echo "cleaning completed!"; 

# ----------------------------------------------------------------------
# THE CODES BELOW ARE INTENDED TO RUN THE TOOLS (Vagrant and VirtualBox)
# ----------------------------------------------------------------------
install-box:
    @echo "Starting the installation of the Vagrant Box generated by Packer..."; 
    @echo "--box name: $(VAGRANT_BOX_NAME)"; 
    @echo "--box path: $(VAGRANT_BOX_PATH)"; 

    @vagrant box list;

    @echo "--> Vagrant Box Installation..."; 
    @bash $(BUILD_IMAGE_CMD) --action="install-box" \
                             --box-name="$(VAGRANT_BOX_NAME)" \
                             --box-path="$(VAGRANT_BOX_PATH)";

    @vagrant box list;

    @echo "Complete Vagrant Box installation!";

publish-box:
    @echo "Starting the publish of the Vagrant Box on Vagrant Cloud generated by Packer..."; 
    @echo "--box name: $(VAGRANT_BOX_NAME)"; 
    @echo "--box path: $(VAGRANT_BOX_PATH)"; 

    @echo "--> Vagrant Box Publish..."; 
    @bash $(BUILD_IMAGE_CMD) --action="publish-box" \
                             --box-path="$(VAGRANT_BOX_PATH)";

    @echo "Complete Vagrant Box publish!";

uninstall-box:
    @echo "Starting the uninstallation of the Vagrant Box generated by Packer..."; 
    @echo "--box be uninstall: $(VAGRANT_BOX_NAME)"; 

    @vagrant box list;
    @vagrant global-status;

    @echo "--> Vagrant Box Uninstallation..."; 
    @bash $(BUILD_IMAGE_CMD) --action="uninstall-box" \
                             --box-name="$(VAGRANT_BOX_NAME)";

    @vagrant box list;
    @vagrant global-status;

    @echo "Uninstalling the completed Vagrant Box!";

Executando o projeto.

⚠️ Nota:

  • A execução desse projeto foi feita através de um Desktop Ubuntu 17.10 (Artful Aardvark).
  • Suponho que você já tenha instalados as dependências do projeto citada acima.

Antes de sair executado o projeto pelo terminal, precisamos validar algumas dependências já instaladas no seu desktop, para poder assim executar o projeto.

Validando as dependências:

  • [VirtualBox] 4.3.10 ou superior...
    • Testar pelo terminal:
      $ VBoxManage -v
    • Resultado semelhante:
      5.2.8r121009
  • [Vagrant] 1.6.3 ou superior...
    • Testar pelo terminal:
      $ vagrant -v
    • Resultado semelhante:
      Vagrant 2.0.1
  • [Packer] 1.1.3 ou superior...
    • Testar pelo terminal:
      $ packer -v
    • Resultado semelhante:
      1.1.3
  • [Container Linux Config Transpiler] 0.5.0 ou superior...
    • Testar pelo terminal:
      $ ct -version
    • Resultado semelhante:
      ct v0.5.0
  • [GNU Make] 4.1 ou superior...
    • Testar pelo terminal:
      $ make -v
    • Resultado semelhante:
      GNU Make 4.1
      Compilado para x86_64-pc-linux-gnu
      Copyright (C) 1988-2014 Free Software Foundation, Inc.
      ...

PRONTO!!! se tudo funcionou como o esperado agora podemos executar o projeto coreos-packer.

⚠️ Nota:

  • Caso ocorra ERROS nas validações acima, Boa Sorte!!! "O Google é o seu pastor e nada te faltará..."

Executando o projeto "coreos-packer".

1ª) Vamos criar uma pasta que vai ser o nosso ambiente e fazer o download do projeto coreos-packer via terminal:

$ mkdir -p "my-project-IaC"
$ cd ./my-project-IaC

$ wget -O "coreos-packer.zip" "https://github.com/alisonbuss/coreos-packer/archive/master.zip"

$ ls
coreos-packer.zip

2ª) Vamos descompactar o projeto coreos-packer, entrar na pasta e exibir o plano de execução:

$ unzip "coreos-packer.zip"

$ clear
$ ls
coreos-packer-master  coreos-packer.zip

$ cd ./coreos-packer-master
$ ls
build-image.sh  Makefile       packer-templates  pre-provision  README_LANG_EN.md
LICENSE         Makefile.test  packer-variables  README_DOC.md  

$ make plan
The default values to be used by this Makefile:

    --> MAKECMDGOALS: make plan
    --> WORKING_DIRECTORY: .

    --> PACKER_TEMPLATE: coreos-virtualbox-template.json
    --> PACKER_VARIABLES: [global.json /operational-system/coreos.json /platform/virtualbox.json custom.json]
    --> PACKER_ONLY: virtualbox-iso
    --> PACKER_TEMPLATES_PATH: ./packer-templates
    --> PACKER_VARIABLES_PATH: ./packer-variables

    --> IGNITION_SOURCE_FILE: ./pre-provision/container-linux-config/keys-to-underworld.yml
    --> IGNITION_COMPILATION_PATH: ./pre-provision/ignitions
    --> IGNITION_PLATFORMS: vagrant-virtualbox digitalocean ec2 gce

    --> VAGRANT_BOX_NAME: packer/coreos-vagrant-box
    --> VAGRANT_BOX_PATH: ./builds/image-coreos-vagrant.box

    --> BUILD_IMAGE_CMD: ./build-image.sh

3ª) Pronto agora vamos executar o projeto coreos-packer e gerar uma imagem e o "Vagrant Box":

$ ls
build-image.sh  Makefile       packer-templates  pre-provision  README_LANG_EN.md
LICENSE         Makefile.test  packer-variables  README_DOC.md  

$ make plan compile validate build install-box
...

PRONTO!!! só isso para gerar uma imagem personalizado do CoreOS com um "Vagrant Box"

Resultado semelhante abaixo: print-packer

Sucesso!!! \O/

Pronto!!!
Agora você tem uma imagem personalizada CoreOS
Provisionado pela ferramenta Packer e Shell Script.

Referências:

Licença

About

Projeto de criação de imagens CoreOS para múltiplas plataformas (Amazon EC2, Google GCE, DigitalOcean, VirtualBox).

License:MIT License


Languages

Language:Shell 79.6%Language:Makefile 20.4%