Provisionamento de Aplicações

Agenda
1
Introdução ao DevOps
2
Infraestrutura como Código (IaC)
3
Conteinerização
4
Provisionamento de Aplicações
(Docker e Ansible)
5
Criação de Pipelines

#0 ApresentaçãoQuem sou?


#1 Introdução ao DevOps
Antes do DevOps - Deploy Tradicional
-
O que significa disponibilizar uma aplicação para uso em produção?
-
Arquitetura Tradicional
- Aplicação monolítica rodando diretamente no servidor físico ou máquina virtual.
- Dependência de ambientes de desenvolvimento/teste/produção iguais.


#1 Introdução ao DevOps
Antes do DevOps - Desafios
-
Inconsistência de ambientes: "Funciona na minha máquina, mas não no servidor."
-
Configuração manual: Necessidade de configurar servidores manualmente.
-
Gerenciamento de dependências: Pacotes e bibliotecas conflitantes.
-
Escalabilidade limitada: Difícil criar múltiplas instâncias rapidamente.


#1 Introdução ao DevOps
Antes do DevOps - Atividade 0
-
Preparação da máquina servidor
-
Instalem o Virtual Box
-
Baixe/Instalem a última versão LTS do Ubuntu (será disponibilizada)
-
-
Preparação servidor de aplicação
-
Instale uma versão do NGINX no sistema operacional do servidor
-
-
Aplicação
-
Na sua máquina gere uma distribuição da aplicação To Do em angular 17
-
Copie a aplicação utilizando SCP de sua máquina para o diretório de aplicação do NGINX normalmente na pasta /var/www/html no servidor Ubuntu
-
-
Por fim Envie a URL para o professor acessar


#1 Introdução ao DevOps
Antes do DevOps - Atividade 0
Quais foram os maiores desafios no processo?

O que aprendemos - Atividade 0
#1 Introdução ao DevOps -
1. Configuração do servidor:
- Instalação manual do sistema operacional e pacotes básicos.
- Configuração de firewall e rede.
-
2. Instalação das dependências da aplicação:
- Configuração de linguagens de runtime (ex.: Java, Python, Node.js).
- Instalação de bibliotecas e frameworks específicos (ex.: Django, Express).
-
3. Configuração do banco de dados:
- Instalação e configuração de MySQL ou PostgreSQL.
- Criação de usuários e bancos.
-
4. Transferência de código:
- Upload de arquivos via FTP/SCP ou integração com Git.
-
5. Iniciar a aplicação:
- Configuração de um servidor de aplicação (ex.: Apache, Nginx).
- Executar o código e monitorar erros.

O que aprendemos - Atividade 0
#1 Introdução ao DevOps # 1 - Instalar Máquina Virtual Ubuntu com Virtual Box
# 2 - Configurar VM e Redirecionamento de Portas entre HOST e CONVIDADO
# 3 - Acessar máquina por SSH
ssh <usuario>@<endereço_IP_ubuntu>
ssh -p 2222 ubuntu@127.0.0.1
# 4 - Atualizar Pacotes Ubuntu
sudo apt update
# 5 - Instalar NGINX, OpenSSH-Server
sudo apt install openssh-server
sudo apt install nginx
# 6 - Verificar IP da máquina Ubuntu
ip a
# 7 - Copiar arquivos para o servidor Ubuntu na pasta NGINX
scp -P <porta> <origem> <destino>
scp -P 2222 -r /caminho/dist ubuntu@127.0.0.1:/var/www/html
#1 Introdução ao DevOps
Antes do DevOps - Problemas comuns
-
Ambientes inconsistentes: Falta de compatibilidade entre o ambiente local e o servidor.
-
Configuração manual demorada: Repetitiva e sujeita a erros humanos.
-
Gerenciamento de versões: Dificuldade em manter controle sobre diferentes versões da aplicação.
-
Escalabilidade e replicação: Criar novas instâncias requer reconfigurações manuais.
-
Manutenção complexa: Atualizações ou mudanças na infraestrutura podem causar problemas.


#1 Introdução ao DevOps
Antes do DevOps e Docker
| Aspecto | Deploy Tradicional | Com Docker |
|---|---|---|
| Consistência de ambientes | Sujeito a diferenças no ambiente | Ambiente padronizado com containers |
| Tempo de configuração | Demorado | Rápido (Dockerfiles e imagens) |
| Escalabilidade | Manual e lento | Automático e ágil (Docker Compose) |
| Portabilidade | Limitada | Alta (funciona em qualquer host Docker) |

#1 Introdução ao DevOps
O que é DevOps?

O que é DevOps?
DevOps é um conjunto de práticas, ferramentas e filosofia cultural que integra as equipes de desenvolvimento de software e operações de TI
#1 Introdução ao DevOps

O que siginifica DevOps?
Um composto de Dev (desenvolvimento) e Ops (operações), o DevOps é a união de pessoas, processos e tecnologias para fornecer continuamente valor aos clientes.
#1 Introdução ao DevOps

Surgimento do DevOps
O movimento do DevOps começou a tomar forma entre 2007 e 2008, quando as operações de TI e as comunidades de desenvolvimento de software passaram a expressar o que acreditavam ser um nível fatal de disfuncionalidade no setor.
#1 Introdução ao DevOps

DevOps - A guerra
Desenvolvimento de Software
X
Operações / infraestrutura
#1 Introdução ao DevOps
Unidade
Unidade
DevOps
Unidade
O Desenvolvimento constrói produtos que são instalados em servidores, computadores e nuvens mantidos pelas unidades de Operação.

O começo do fim da Guerra
As equipes atuavam em silos preocupadas apenas com o próprio escopo, horas mais longas de trabalho, versões problemáticas e clientes insatisfeitos. Elas tinham certeza de que deveria ter um jeito melhor. Assim, as duas comunidades se uniram e começaram a conversar, com pessoas como Patrick Dubois, Gene Kim e John Willis conduzindo o debate.
#1 Introdução ao DevOps

Surgimento do DevOps
Patrick Debois, administrador de sistemas, gerente de projetos e especialista em desenvolvimento, propõe discutir métodos sobre como solucionar os eternos conflitos entre as áreas de desenvolvimento e operações de TI. Essa palestra foi feita na Conferência de Agile, em Toronto (você pode ver aqui a apresentação feita no evento).
#1 Introdução ao DevOps

Conceituando DevOps
O DevOps aborda todas as fases do ciclo de vida de desenvolvimento e operações. Do planejamento e criação ao monitoramento e iteração, o DevOps reúne as habilidades, os processos e as ferramentas de todas as facetas de uma organização de engenharia e TI.
#1 Introdução ao DevOps

Conceituando DevOps
#1 Introdução ao DevOps


#1 Introdução ao DevOps Com DevOps teremos:
-
Colaboração e confiança
-
Libere versões mais rapidamente e trabalhe de modo mais inteligente
- Acelere o tempo de resolução
- Gerencie melhor o trabalho não planejado
Benefícios DevOps

Cultura DevOps
#1 Introdução ao DevOps
O DevOps é uma abordagem ágil à mudança organizacional que busca conectar equipes tradicionais e em silos e estabelecer novos processos que facilitem uma maior colaboração.

#1 Introdução ao DevOps Sem a mentalidade, os rituais e a cultura certos, é difícil cumprir a promessa completa do DevOps.
Cultura DevOps

#1 Introdução ao DevOps Cultura DevOps

#1 Introdução ao DevOps Cultura DevOps
O centro do DevOps
- Aumento da transparência
- Comunicação
- Colaboração entre equipes
- Aprendizado
- Melhoria contínua
- Responsáveis pelo êxito ou falha de um produto

#1 Introdução ao DevOps Cultura DevOps
Você cria, você gerencia.
Supervisionar, testar, controle qualidade
Objetivos empresariais do sistema, definir as necessidades operacionais com o desenvolvimento

#1 Introdução ao DevOps Cultura DevOps
Autonomia das equipes:
- Tomar decisões e implementar mudanças
- Não exista medo de falhar
- Utilizar processos e as ferramentas para tomar decisões
- Atuar em níveis de risco para o cliente.

#1 Introdução ao DevOps Cultura DevOps - Case
Por exemplo, uma equipe é prejudicada por requisitos como ter que abrir um ticket com uma equipe de operações separada para realizar uma alteração trivial na infraestrutura, como uma nova entrada de DNS. Uma tarefa que deveria ser realizada em segundos acaba levando dias ou semanas. Uma equipe autônoma é capaz de implementar essas alterações por conta própria, seja por ter alguém na equipe que tenha as habilidades e a experiência corretas ou acesso a ferramentas de autoatendimento.

#1 Introdução ao DevOps Cultura DevOps - Case
Em um ambiente em que as equipes de desenvolvimento e operações estão em silos isolados, muitas vezes há lentidão no recebimento do feedback sobre o desempenho e a estabilidade do software aplicativo em produção pela equipe de desenvolvimento, quando chega até ela.

#1 Introdução ao DevOps Cultura DevOps
A integração e a entrega contínuas (CI/CD) são consideradas necessárias para uma cultura de DevOps.

#1 Introdução ao DevOps Cultura DevOps


#1 Introdução ao DevOps Cultura DevOps
Empresas que praticam o DevOps afirmam que lançam entregáveis de maior qualidade (61%), com maior frequência de implementação e tempo de disponibilização no mercado mais rápido (49%). E não são apenas as empresas que têm vantagens: profissionais dizem que aprenderam novas habilidades (78%) e receberam aumentos (48%).
Fonte: Atlassian

#1 Introdução ao DevOps Um DevOps
O DevOps é um generalista de TI que deve ter um amplo conhecimento de desenvolvimento e operações, incluindo codificação, gerenciamento de infraestrutura, administração de sistemas e cadeias de ferramentas de DevOps. Os engenheiros de DevOps também devem ter habilidades interpessoais, pois trabalham nos silos da empresa para criar um ambiente mais colaborativo.


#1 Introdução ao DevOps Um DevOps
- Comunicação e colaboração
- Administração do sistema
- Experiência com ferramentas de DevOps
- Gerenciamento de configurações (Chef, Puppet ou Ansible)
- Contêineres e orquestração de contêineres
- Integração e implementação contínuas
- Arquitetura e provisionamento do sistema
- Familiaridade com codificação e scripts
- Habilidades de gestão colaborativa

#1 Introdução ao DevOps Como fazer DevOps?
- Escolha o componente (aplicação)
- Considere a adoção de alguma metodologia ágil como o Scrum
- Utilize controle do código-fonte baseado em Git
- Integre o controle do código-fonte ao rastreamento do trabalho
- Escreva testes
- Crie o processo de IC/CD (Integração/Implementação contínuas) para implementar o componente
- Adicione monitoramento, alarmes e instrumentação

#1 Introdução ao DevOps Como fazer DevOps - Teste


#2 Infraestrutura como Código (IaC)O que é IaC?

#2 Infraestrutura como Código (IaC)O que é IaC?
Infraestrutura como código (IaC) refere-se ao gerenciamento e provisionamento da infraestrutura por meio de códigos, em vez de processos manuais. A sigla vem do termo em inglês, "Infrastructure as Code".


O que é IaC?
#2 Infraestrutura como Código (IaC)
-
Automatização: a IaC permite a automação de tarefas repetitivas e manuais, o que economiza tempo e reduz o risco de erro humano.
-
Agilidade: a IaC permite a criação rápida e fácil de novas infraestruturas, permitindo que as equipes de TI sejam mais ágeis e respondam às necessidades do negócio com mais rapidez.
-
Escalabilidade: a IaC permite a escalabilidade da infraestrutura, possibilitando que ela cresça ou diminua de acordo com a demanda, sem a necessidade de intervenção manual.
-
Consistência: a IaC garante que a infraestrutura seja consistente em todas as instâncias, evitando erros causados por diferenças de configuração.
#2 Infraestrutura como Código (IaC)Por que IaC?

-
A abordagem declarativa define o estado desejado do sistema, incluindo os recursos necessários, as propriedades que eles precisam ter e uma ferramenta de IaC para configurá-lo.
-
Ferramentas como Terraform e CloudFormation da AWS são exemplos que utilizam este método.
#2 Infraestrutura como Código (IaC)IaC declarativa e imperativa


-
Este código declara uma instância AWS EC2 desejada, especificando o tipo de instância e a imagem de máquina da Amazon (AMI) a ser usada. O Terraform se encarrega de realizar as etapas necessárias para alcançar esse estado.
#2 Infraestrutura como Código (IaC)IaC declarativa e imperativa
Exemplo de Terraform:
hcl (HashiCorp Configuration Language)
resource “aws_instance” “example” {
ami = “ami-0c55b159cbfafe1f0”
instance_type = “t2.micro”
}
-
A abordagem imperativa define os comandos específicos necessários para alcançar a configuração desejada. Depois, esses comandos precisam ser executados na ordem correta.
#2 Infraestrutura como Código (IaC)IaC declarativa e imperativa
Exemplo de Ansible:
yaml (Yet Another Markup Language)
– name: Instala Apache
yum:
name: httpd
state: present


-
O provisionamento de infraestrutura sempre foi um processo manual, caro e demorado. Agora, o gerenciamento de infraestrutura migrou do hardware físico em datacenters (ainda que eles ainda sejam um componente da sua organização) para virtualização, containers e cloud computing.
-
Com a cloud computing, o número de componentes de infraestrutura aumentou, mais aplicações são colocadas em produção diariamente e as infraestruturas precisam ser flexíveis para as frequentes alterações, escalas e desativações. Hoje em dia, sem a implementação de uma prática de IaC, fica cada vez mais difícil gerenciar a escala da infraestrutura.
#2 Infraestrutura como Código (IaC)IaC benefícios

-
Redução de custos
-
Aumento na velocidade das implantações
-
Redução de erros
-
Melhoria na consistência da infraestrutura
-
Eliminação de desvios de configuração
#2 Infraestrutura como Código (IaC)IaC benefícios

#2 Infraestrutura como Código (IaC)IaC Ferramentas








-
Gestão de infraestrutura como código para múltiplos provedores de nuvem
-
Alguns comandos/ações que o terraform pode realizar:
- Init - Prepare seu diretório de trabalho para outros comandos
- Validate Verifique se a configuração é válida
- Plan - Mostrar alterações necessárias pela configuração atual
- Apply - Criar ou atualizar infraestrutura
- Destroy - Destruir infraestrutura criada anteriormente
#2 Infraestrutura como Código (IaC)IaC Ferramenta - Terraform



-
Ferramenta que automatiza tarefas com foco em atingir o estado desejado em um sistema. Uma tarefa pode ser algo tão simples quanto definir um pacote que precisa ser instalado, declarar configurações de servidor web ou até mesmo configurar uma orquestração de implantação completa.
#2 Infraestrutura como Código (IaC)IaC Ferramenta - Ansible




-
O AWS CloudFormation é um serviço que ajuda você a modelar e configurar seus recursos da AWS para que você possa gastar menos tempo gerenciando esses recursos e mais tempo focando em seus aplicativos que são executados na AWS. Você cria um modelo que descreve todos os recursos da AWS que você deseja (como instâncias do Amazon EC2 ou instâncias do Amazon RDS DB), e o CloudFormation cuida do provisionamento e da configuração desses recursos para você.
#2 Infraestrutura como Código (IaC)IaC Ferramenta - AWS CloudFormation



#2 Infraestrutura como Código (IaC)IaC Ferramenta - Comparativo



| Características | Terraform | Ansible | AWS CloudFormation |
|---|---|---|---|
| Tipo de IaC | Declarativa | Declarativa (com alguns aspectos imperativos) | Declarativa |
| Linguagem | HCL (HashiCorp Configuration Language) | YAML/INI para playbooks; Python para módulos | JSON ou YAML |
| Provedores de Nuvem Suportados | Multicloud (AWS, Azure, GCP, outros) | Multicloud, servidores locais e containers | Exclusivo para AWS |
| Foco Principal | Provisionamento de infraestrutura | Configuração e gerenciamento de sistemas | Provisionamento de infraestrutura na AWS |
| Curva de Aprendizado | Moderada | Moderada a baixa | Moderada, especialmente para recursos complexos |
| Automação de Configuração | Não nativo (requer integração com outras ferramentas) | Sim, via módulos e playbooks | Limitada (principalmente para infraestrutura) |
| Controle de Estado | Sim (arquivo de estado gerenciado pelo Terraform) | Não | Sim (gerenciado automaticamente pela AWS) |
| Execução Local ou Remota | Local ou remoto | Remoto (via SSH) ou local | Remoto (via serviços AWS) |
| Custo | Gratuito (open-source); Enterprise com custos adicionais | Gratuito (open-source); custos de suporte opcional | Gratuito (mas dependente do custo dos serviços AWS) |
| Exemplo de Comando | terraform apply |
ansible-playbook site.yml | Integração via AWS Console ou CLI (aws cloudformation deploy) |

- Terraform: Melhor escolha para ambientes multicloud e provisionamento de infraestrutura em grande escala. Ideal quando é necessário controlar estados e aplicar mudanças incrementalmente.
- Ansible: Ótimo para automação de configurações, instalação de softwares e gerenciamento de servidores em diferentes ambientes (cloud, local, containers). Mais indicado para tarefas de configuração pós-provisionamento.
- AWS CloudFormation: Ideal para quem usa exclusivamente o ecossistema AWS e deseja aproveitar a integração nativa e o gerenciamento simplificado dos recursos da nuvem AWS.
#2 Infraestrutura como Código (IaC)IaC Ferramenta - Recomendações




-
Curva de aprendizado: a IaC é uma metodologia complexa que requer conhecimentos de programação e infraestrutura. Isso pode exigir uma curva de aprendizado para equipes de TI que não estão familiarizadas com a metodologia.
-
Configuração incorreta: se a configuração de um arquivo de código estiver incorreta, pode haver efeitos negativos na infraestrutura, incluindo a possibilidade de paralisações no serviço.
-
Mudanças frequentes: como o código é usado para gerenciar a infraestrutura, mudanças frequentes no código podem impactar a infraestrutura em tempo real, o que pode exigir cuidados extras e precauções para evitar erros.
#2 Infraestrutura como Código (IaC)Desafios da IaC?

O Vagrant é uma ferramenta de automação para a criação e gerenciamento de ambientes virtuais. Ele simplifica o uso de máquinas virtuais, garantindo consistência e portabilidade para desenvolvedores e equipes. Com o Vagrant, é possível configurar ambientes de desenvolvimento de forma rápida, padronizada e sem dependências complexas no sistema host.
#2 Infraestrutura como Código (IaC)Vagrant


- Box: Imagem base para criar a máquina virtual (ex.: Ubuntu, CentOS).
- Provisionamento: Automatiza a configuração da VM usando scripts Shell, Ansible, Puppet, entre outros.
- Sincronização de pastas: Compartilha diretórios entre o host e a VM.
- Portabilidade: Vagrantfiles podem ser compartilhados para replicar ambientes.
- Suporte a múltiplos provedores: Compatível com VirtualBox, VMware, AWS, Docker, etc.
#2 Infraestrutura como Código (IaC)Vagrant - Características


#2 Infraestrutura como Código (IaC)Vagrant - Instalação

# Verifique se a instalação ocorreu executando:
vagrant --version # Output: Vagrant 2.4.6
# Nos exemplos utilizaremos o provedor Virtual Box,
# então garanta que o mesmo já está instalado.
#2 Infraestrutura como Código (IaC)Fluxo do Vagrant


#2 Infraestrutura como Código (IaC)Vagrant - Boxes
Link para boxes disponíveis: https://portal.cloud.hashicorp.com/vagrant/discover


#2 Infraestrutura como Código (IaC)VagrantFile
# Configuração básica do Vagrant para uma VM Ubuntu
Vagrant.configure("2") do |config|
# Define a box que será usada (Ubuntu 20.04)
config.vm.box = "ubuntu/focal64"
# Configuração de rede (redireciona a porta 22 da VM para a porta 2222 do host)
config.vm.network "forwarded_port", guest: 22, host: 2222
# Provisionamento da máquina (instala o OpenSSH server)
config.vm.provision "shell", inline: <<-SHELL
apt-get update
SHELL
# Configuração do provedor VirtualBox
config.vm.provider "virtualbox" do |vb|
vb.name = "UbuntuSSH_VM" # Nome da VM no VirtualBox
vb.memory = "1024" # Memória RAM (em MB)
vb.cpus = 2 # Número de CPUs
end
end
#2 Infraestrutura como Código (IaC)VagrantFile
# Configuração básica do Vagrant para uma VM Ubuntu
Vagrant.configure("2") do |config|
# Define a box que será usada (Ubuntu 20.04)
config.vm.box = "ubuntu/focal64"
# Configuração de rede (redireciona a porta 22 da VM para a porta 2222 do host)
config.vm.network "forwarded_port", guest: 22, host: 2222
# Provisionamento da máquina (instala o OpenSSH server)
config.vm.provision "shell", inline: <<-SHELL
apt-get update
apt-get install -y openssh-server
systemctl enable ssh
systemctl start ssh
SHELL
# Configuração do provedor VirtualBox
config.vm.provider "virtualbox" do |vb|
vb.name = "UbuntuSSH_VM" # Nome da VM no VirtualBox
vb.memory = "1024" # Memória RAM (em MB)
vb.cpus = 2 # Número de CPUs
end
end
Atividade 1 - Vagrant
- Crie um VagrantFile que automatize a criação de uma máquina virtual Ubuntu que possua o servidor HTTP Nginx
- Além do mais deve ser copiado um index.html customizado para a máquina criada.
#2 Infraestrutura como Código (IaC)
#2 Infraestrutura como Código (IaC)VagrantFile
# Configuração básica do Vagrant para uma VM Ubuntu
Vagrant.configure("2") do |config|
# Define a box que será usada (Ubuntu 20.04)
config.vm.box = "ubuntu/focal64"
# Configuração de rede (redireciona a porta 22 da VM para a porta 2222 do host)
config.vm.network "forwarded_port", guest: 22, host: 2222
config.vm.network "forwarded_port", guest: 80, host: 88
# Provisionamento da máquina (instala o OpenSSH server)
config.vm.provision "shell", inline: <<-SHELL
apt-get update
apt-get install -y openssh-server
apt-get install -y nginx
chmod -R 777 /var/www/html
systemctl enable ssh
systemctl start ssh
SHELL
# Pastas sincronizadas
config.vm.synced_folder "./site", "/var/www/html"
# Configuração do provedor VirtualBox
config.vm.provider "virtualbox" do |vb|
vb.name = "UbuntuSSH_VM" # Nome da VM no VirtualBox
vb.memory = "1024" # Memória RAM (em MB)
vb.cpus = 2 # Número de CPUs
end
end
#2 Infraestrutura como Código (IaC)VagrantFile - Subindo VMS
# Arquivo Vagrantfile-vms
vms = {
'master3' => { 'memory' => '512', 'cpus' => 1, 'ip' => '30' },
'master2' => { 'memory' => '1024', 'cpus' => 1, 'ip' => '20' },
'master1' => { 'memory' => '256', 'cpus' => 1, 'ip' => '10' }
}
Vagrant.configure("2") do |config|
config.vm.box = "bento/ubuntu-20.04"
config.vm.box_check_update = false
vms.each do |name, conf|
config.vm.define name do |k|
k.vm.hostname = "#{name}.k8s.cluster"
k.vm.network 'private_network', ip: "172.27.11.#{conf['ip']}"
k.vm.provider 'virtualbox' do |vb|
vb.memory = conf['memory']
vb.cpus = conf['cpus']
vb.name = name
end
k.vm.provision "shell", inline: <<-SHELL
apt-get update -y
apt-get install -y curl
SHELL
end
end
end
#2 Infraestrutura como Código (IaC)VagrantFile - Acessando VMS

# Visualizando configurações ssh das máquinas para um vagrantfile fora do nome padrão
VAGRANT_VAGRANTFILE=Vagrantfile-vms vagrant ssh-config
# Output
Host master3
HostName 10.211.55.16
User vagrant
Port 22
UserKnownHostsFile /dev/null
StrictHostKeyChecking no
PasswordAuthentication no
IdentityFile /Users/vanilton/provisionamento_ambiente_etech/.vagrant/machines/master3/parallels/private_key
IdentitiesOnly yes
LogLevel FATAL
PubkeyAcceptedKeyTypes +ssh-rsa
HostKeyAlgorithms +ssh-rsa
Host master2
HostName 10.211.55.17
User vagrant
Port 22
UserKnownHostsFile /dev/null
StrictHostKeyChecking no
PasswordAuthentication no
IdentityFile /Users/vanilton/provisionamento_ambiente_etech/.vagrant/machines/master2/parallels/private_key
IdentitiesOnly yes
LogLevel FATAL
PubkeyAcceptedKeyTypes +ssh-rsa
HostKeyAlgorithms +ssh-rsa
Host master1
HostName 10.211.55.18
User vagrant
Port 22
UserKnownHostsFile /dev/null
StrictHostKeyChecking no
PasswordAuthentication no
IdentityFile /Users/vanilton/provisionamento_ambiente_etech/.vagrant/machines/master1/parallels/private_key
IdentitiesOnly yes
LogLevel FATAL
PubkeyAcceptedKeyTypes +ssh-rsa
HostKeyAlgorithms +ssh-rsa# Acessando VM por ssh via chave privada
ssh vagrant@172.27.11.20 -i .vagrant/machines/master2/virtualbox/private_key
# ou
VAGRANT_VAGRANTFILE=Vagrantfile-vms vagrant ssh master2
# Senha padrão "vagrant"
# Output
vagrant@master2:~$ 
#2 Infraestrutura como Código (IaC)Vagrant - Comandos
# Provisionar a máquina
vagrant up
# Acessar a máquina por ssh
vagrant ssh
# Verificar configurações SSH das máquina
vagrant ssh-config
# Desligar VM
vagrant halt
# Destruir máquina
vagrant destroy -f
# Instalar plugin para utilizar scp com vagrant
vagrant plugin install vagrant-scp
# Exemplo copiando arquivo para a máquina virtual
vagrant scp arquivo.txt :/home/vagrant/
Atividade 2 - Vagrant
- Crie um VagrantFile que automatize a criação de uma máquina virtual Ubuntu que possua o servidor banco de dados postgreSQL.
- Deve existir uma base criada com o nome etech
- Na máquina a porta 5435 deve estar disponível para conexão com o banco de dados.
- Deve ser possível conectar ao banco com:
- usuário: professor
- senha: 123456
#2 Infraestrutura como Código (IaC)
DevOps
Atividade 3
- Em grupos de 5 discutir o que acham que DevOps pode trazer de benefícios e desafios para uma empresa.
- Cada grupo apresenta as conclusões ao final.

30 Minutos

#2 Infraestrutura como Código (IaC)O que é Conteinerização?
#3 Conteinerização
O que é Conteinerização?
Conteinerização é o empacotamento do código de software com todos os componentes necessários, como bibliotecas, frameworks e outras dependências, para que fiquem isolados em seu próprio "container".
#3 Conteinerização
História da Conteinerização
#3 ConteinerizaçãoInício
Chroot (1979): Introduzido no Unix pela Bell Labs, o comando chroot permite criar um ambiente isolado no sistema de arquivos, direcionando um processo para uma raiz específica. Isso foi uma base primitiva para o isolamento de processos.
1970

História da Conteinerização
#3 Conteinerização
História da Conteinerização
#3 ConteinerizaçãoAvanço com a virtualização leve
-
FreeBSD Jails (2000): Um aprimoramento significativo em relação ao
chroot, os jails permitem isolar não apenas o sistema de arquivos, mas também redes e usuários. Cada jail opera como um sistema independente dentro do host. -
Linux VServer (2001): Introduziu o conceito de particionar recursos como CPU e memória em ambientes isolados no Linux.
2000

História da Conteinerização - Jail x Chroot
#3 Conteinerização

Comparando o Jail com o Chroot, observa-se que o segundo não separa a pilha TCP/IP ou controla os acessos de forma tão rígida como o Jail. Quando se usa Jail, o kernel do sistema operacional individualiza as áreas de rede, memória, processos, usuários e arquivos.
O Jail cria um verdadeiro container, o que abre um leque de possibilidades para um ambiente de produção, homologação ou desenvolvimento

História da Conteinerização
#3 ConteinerizaçãoOpenVZ (2004): Focado em servidores Linux, trouxe isolamento e virtualização a partir de um único kernel, sendo uma forma inicial de "containers".
Cgroups e Namespaces (2006-2008): O kernel Linux introduziu tecnologias fundamentais:
- Namespaces: Para isolar recursos como processos, redes, e IDs de usuário.
- Cgroups: Para controlar e limitar recursos como CPU, memória e I/O.
Esses dois componentes são a base dos containers modernos.
2004-2008

História da Conteinerização
#3 ConteinerizaçãoO lançamento do Docker revolucionou a conteinerização:
- Interface simplificada: Tornou a tecnologia mais acessível ao encapsular aplicações e suas dependências em unidades portáteis e replicáveis.
- Base em LXC: Inicialmente, o Docker usava Linux Containers (LXC), mas logo desenvolveu seu próprio mecanismo de runtime.
- Imagens e registries: Introduziu o conceito de imagens versionadas e armazenadas em registries como o Docker Hub.
2013

História da Conteinerização -
Virtualização x Containers
#3 Conteinerização
- A virtualização permite que seus sistemas operacionais (Windows ou Linux ) sejam executados simultaneamente em um único sistema de hardware.
- Os contêineres compartilham o mesmo kernel do sistema operacional e isolam os processos do aplicativo do resto do sistema. Por exemplo: sistemas ARM Linux executam contêineres ARM Linux, sistemas x86 Linux executam contêineres x86 Linux, sistemas x86 Windows executam contêineres x86 Windows. Os contêineres Linux são extremamente portáteis, mas devem ser compatíveis com o sistema subjacente.

História da Conteinerização
#3 Conteinerização- OCI (Open Container Initiative, 2015): Criada para padronizar runtimes e formatos de imagens de containers, promovendo interoperabilidade entre ferramentas.
- Runtimes alternativos:
- runc: Uma implementação de referência de containers compatível com OCI.
- Podman e CRI-O: Alternativas ao Docker, projetadas para Kubernetes.
- Runtimes alternativos:
- Kubernetes (2015): Popularizou a orquestração de containers, estabelecendo-se como o padrão para gestão de aplicações em larga escala.
2015

História da Conteinerização - Hoje
#3 Conteinerização- Containers são amplamente usados para:
- Desenvolvimento ágil: Isolamento de ambientes.
- DevOps e CI/CD: Integração contínua e entrega contínua.
- Computação em nuvem: Escalabilidade e portabilidade em ambientes heterogêneos.
A evolução da conteinerização continua, com foco em segurança, desempenho e integração mais profunda com arquiteturas de computação distribuída.

Atividade 4
QUIZ

#3 Conteinerização#4 Provisionamento de Aplicações


#4 Provisionamento de Aplicações


#4 Provisionamento de Aplicações


#4 Provisionamento de Aplicações


O que é Docker?
O Docker é uma plataforma de software que permite criar, testar e implantar aplicativos rapidamente, empacotando software em unidades padronizadas chamadas contêineres
#4 Provisionamento de Aplicações

História do Docker
- 2013
- Lançado como código aberto
- Colaboração Red Hat (Fedora, RHEL, OpenShift)
- 2014
- 34º projeto GitHub mais discutido
- Tecnologia aberta mais inovadora
- A DotCloud foi renomeada para Docker Inc., focando exclusivamente na tecnologia de containers.
- 2015 - Docker Compose (ambientes multi-containers) e o Docker Swarm (orquestração nativa) começaram a ser desenvolvidas, expandindo as possibilidades do Docker.
- 2017+ - Docker e Kubernetes
#4 Provisionamento de Aplicações

O que é container
- Container <> VM
- Isolado
- SO Compartilhado e Libs
#4 Provisionamento de Aplicações


Container Docker
- Embalagem padronizada para software e dependências
- Isolamento de aplicativos uns dos outros
- Compartilha o mesmo kernel do sistema operacional
- Funciona para todas as principais distribuições Linux e também
no Windows
#4 Provisionamento de Aplicações


Imagens Docker
Imagens dockers são aplicações completas construídas por meio de comandos isolados ou organizados em um Dockerfile
#4 Provisionamento de Aplicações


Imagens Docker
#4 Provisionamento de Aplicações


Componentes do Docker
#4 Provisionamento de Aplicações
- Docker Engine: É o núcleo do Docker que é responsável por construir, executar e gerenciar contêineres. Ele inclui um servidor, uma REST API e uma interface de linha de comando (CLI) que facilita a comunicação com o daemon do Docker.
- Docker Compose: é uma ferramenta para definir e executar aplicativos Docker multi-container. Ele usa um arquivo YAML para configurar os serviços, redes e volumes do aplicativo, permitindo o gerenciamento fácil de configurações complexas de multi-container.
- Docker Daemon (dockerd): escuta solicitações da API do Docker e gerencia objetos do Docker, como imagens, contêineres, redes e volumes. Um daemon também pode se comunicar com outros daemons para gerenciar serviços do Docker e é executado no sistema operacional host.

Componentes do Docker
#4 Provisionamento de Aplicações
- Docker Client (docker): é a principal maneira pela qual muitos usuários do Docker interagem com o Docker. Quando você usa comandos como docker run, o cliente envia esses comandos para dockerd, que os executa. O comando docker usa a API do Docker. O cliente Docker pode se comunicar com mais de um daemon.
- Docker Host: é usado para fornecer um ambiente para executar aplicativos. Ele contém o daemon do docker, imagens, contêineres, redes e armazenamentos.
- Docker Networking: O Docker fornece uma gama de opções de rede para conectar contêineres, permitindo que eles se comuniquem entre si ou com redes externas. O Docker cria redes de ponte padrão, mas os usuários podem definir redes personalizadas conforme necessário.

Componentes do Docker
#4 Provisionamento de Aplicações
- Docker Volume: Os volumes do Docker fornecem armazenamento persistente para contêineres. Eles permitem que os dados sejam compartilhados entre o host e o contêiner, bem como entre contêineres diferentes. Os volumes são uma maneira de gerenciar e persistir dados gerados por contêineres do Docker.
- Docker Hub / Registry:
- O registry Docker gerencia e armazena a imagem do Docker.
- Existem dois tipos de registros no Docker:
- Registro público: também chamado de hub do Docker.
- Registro privado: é usado para compartilhar imagens na empresa.

Dockerfile
#4 Provisionamento de Aplicações
- Crie imagens automaticamente usando um script de compilação: «Dockerfile»
- Pode ser versionado em um sistema de controle de versão como Git, junto com todas as dependências
- O Docker Hub pode criar imagens automaticamente com base em dockerfiles no Github

Instalação - Windows
#4 Provisionamento de Aplicações


Instalação - Windows - Video
#4 Provisionamento de Aplicações

Contrato de Serviço de Assinatura Docker
#4 Provisionamento de Aplicações
Aqui está um resumo dos pontos principais:
- O Docker Desktop é gratuito para pequenas empresas (menos de 250 funcionários e menos de US$ 10 milhões em receita anual), uso pessoal, educação e projetos de código aberto não comerciais.
- Caso contrário, é necessária uma assinatura paga para uso profissional.
- Assinaturas pagas também são necessárias para entidades governamentais.
- As assinaturas Docker Pro, Team e Business incluem o uso comercial do Docker Desktop.

#5 Provisionamento de Aplicações
Verificando docker instalado
docker --version
docker run hello-world


#5 Provisionamento de Aplicações
Teste agora com este container
docker run -d -p 80:80 --name inicio_docker docker/getting-started

#5 Provisionamento de Aplicações
Criando/Acessando um container
# Criar e acessar de modo interativo
docker run -i -t ubuntu bash
# Criar container e eliminar após execução
docker run --rm -i -t ubuntu bash
# Ativar/Parar um container parado
docker start/stop <CONTAINER ID ou NOME>
# Acessar um container em execução (Exemplo gettind started)
docker exec -it <CONTAINER ID ou NOME> sh/bash
docker exec -it inicio_docker sh
#5 Provisionamento de Aplicações
Listando containers e images
# Listando imagens
docker images
# Listar containers ativos e inativos
docker container ls
docker ps -a
# Listando e filtrando containers
docker ps | grep ubuntu

#5 Provisionamento de Aplicações
Logs de containers
# Acessando logs
docker logs <CONTAINER_ID ou NOME>
# Acompanhando logs
docker logs todo-etFPFtech --follow
# Incluindo o timestamp
docker logs todo-etFPFtech --follow --timestamps
#5 Provisionamento de Aplicações
Volume Docker
# Criação de volume
docker volume create todo-db
# Listar volumes criados
docker volume ls
# Inspecionar um volume criado
docker volume inspect <nome_volume>
# Remover volume
docker volume rm <nome_volume>


#5 Provisionamento de Aplicações
Criando container com Volume
# Criando volume persistente
docker run -dp 3000:3000 -v todo-db:/etc/todos meu_todocontainer
volume

Agora se criarmos registros, remover o container e recriálo, manteremos os dados que foram persistidos.
# Remover container
docker rm -f <container-id>Baixe o projeto: Link

#5 Provisionamento de Aplicações
Criando container com Volume
# Compartilhando com docker
docker run -d --name meu-nginx -p 8080:80 -v $(pwd)/nginx-content:/usr/share/nginx/html nginx
# Exemplo utilizando a aplicação TO DO
docker run -dp 3000:3000 -w /app -v "$(pwd):/app" node:18-alpine sh -c "yarn install && yarn run dev"
# Verifique o log do container
docker logs -f <container-id>container
host

Agora que está com o volume refletindo o código fonte presente no host altere o título da página web conforme a imagem ao lado e veja se reflete na aplicação em execução.


#5 Provisionamento de Aplicações
Copiando conteúdo de/para container
# Copie um arquivo local para o contêiner
docker cp ./some_file CONTAINER:/work
# Copie os arquivos do contêiner para o caminho local
docker cp CONTAINER:/var/logs/ /tmp/app_logs
Atividade 5
#5 Provisionamento de Aplicações
- Crie um container nginx que seja capaz de executar a aplicação angular no link
- A porta de acesso deve ser 8888

#5 Provisionamento de Aplicações
Buscando imagens
# Buscará imagens no Docker Hub
docker search nginx

#5 Provisionamento de Aplicações
Docker criando imagem
# Dockerfile
FROM node:18-alpine
WORKDIR /app
COPY . .
RUN yarn install --production
CMD ["node", "src/index.js"]# Comando para construção de uma imagem padrão (Dockerfile)
docker build -t my_getting_started .
Baixe o projeto: Link


#5 Provisionamento de Aplicações
Outro exemplo de criação de imagem
# Script shell que será executado
#!/bin/sh
echo "Iniciando o script..."
echo "Olá, Docker Compose!"# Dockerfile
FROM alpine:latest
RUN apk add --no-cache bash
COPY script.sh /usr/local/bin/script.sh
RUN chmod +x /usr/local/bin/script.sh
CMD ["/usr/local/bin/script.sh"]# Comando para construção de uma imagem padrão (Dockerfile)
docker build -t script-runner .
# Criar container e eliminar após execução
docker run --rm script-runner
#5 Provisionamento de Aplicações
Criando imagem com Docker compose
version: '3.8'
services:
script-runner:
build:
context: .
dockerfile: Dockerfile
container_name: script-runner-container# Criar e executar compose
docker compose up --build
#5 Provisionamento de Aplicações
Docker compose
O Docker Compose é uma ferramenta que foi desenvolvida para ajudar a definir e compartilhar aplicativos multi-contêineres. Com o Compose, podemos criar um arquivo YAML para definir os serviços e, com um único comando, podemos girar tudo para cima ou para baixo.

#5 Provisionamento de Aplicações
Docker compose - vantagem
A grande vantagem de usar o Compose é que você pode definir sua pilha de aplicativos em um arquivo, mantê-la na raiz do repositório do seu projeto (agora é controlada por versão) e facilmente permitir que outra pessoa contribua para seu projeto. Alguém só precisaria clonar seu repositório e iniciar o aplicativo Compose.

#5 Provisionamento de Aplicações
Exemplo de compose Postgres
# Exemplo Compose para subir um Postgres
version: '3.4'
services:
postgres:
image: postgres-etech
container_name: postgres-etech
ports:
- "5433:5432"
environment:
- POSTGRES_USER=postgres
- POSTGRES_PASSWORD=postgres
- POSTGRES_DB=etech
volumes:
- postgres-data:/var/lib/postgresql/data
volumes:
postgres-data:Para utilizar o compose crie um arquivo "docker-compose.yml", nome padrão, na sua máquina/projeto.
Para executar faça:
# Criar os serviços em background
docker compose up -d
# Criar os serviços sem backgroud
# (neste você verá os logs dos serviços no terminal)
docker compose up
# Caso crie um docker-compose com o nome fora do padrão
# pode definir o arquivo conforme abaix:
docker compose -f docker-compose-nome-diferente.yml up 
#5 Provisionamento de Aplicações
Multi-containeres
Cada contêiner deve fazer uma coisa e fazê-la bem. Alguns motivos:
- Há uma boa chance de você ter que dimensionar APIs e front-ends de forma diferente dos bancos de dados.
- Contêineres separados permitem que você controle e atualize versões isoladamente.
- Embora você possa usar um contêiner para o banco de dados localmente, você pode querer usar um serviço gerenciado para o banco de dados em produção. Você não quer enviar seu mecanismo de banco de dados com seu aplicativo então.
- Executar vários processos exigirá um gerenciador de processos (o contêiner inicia apenas um processo), o que adiciona complexidade à inicialização/desligamento do contêiner.

#5 Provisionamento de Aplicações
Multi-containeres

Case do aplicativo Todo conectando ao banco de dados MySQL
Lembre-se de que os contêineres, por padrão, são executados isoladamente e não sabem nada sobre outros processos ou contêineres na mesma máquina. Para isso teremos que criar uma network.

#5 Provisionamento de Aplicações
Multi-containeres

Criando rede e o container do banco de dados MySQL + Volume
# Criando a rede
docker network create todo-app# Criando o container do MySQL
docker run -d \
--network todo-app --network-alias mysql \
-v todo-mysql-data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=secret \
-e MYSQL_DATABASE=todos \
mysql:8.0Perceba que existe um volume todo-mysql-data, neste caso foi declarado e o docker sabendo que não existe cria automaticamente este volume, pode realizar a checagem utilizando docker volume ls.

#5 Provisionamento de Aplicações
Multi-containeres

Testando conexão com o banco
# Conectando a base no MySQL
docker exec -it <mysql-container-id> mysql -p# Liste as bases do MySQL
mysql> SHOW DATABASES;Perceba que existe um volume todo-mysql-data, neste caso foi declarado e o docker sabendo que não existe cria automaticamente este volume, pode realizar a checagem utilizando docker volume ls.


#5 Provisionamento de Aplicações
Multi-containeres
Agora vamos executar nossa aplicação conectando ao banco
docker run -dp 3000:3000 \
-w /app -v "$(pwd):/app" \
--network todo-app \
-e MYSQL_HOST=mysql \
-e MYSQL_USER=root \
-e MYSQL_PASSWORD=secret \
-e MYSQL_DB=todos \
node:18-alpine \
sh -c "yarn install && yarn run dev"
# Verifique o log do container
docker logs <container-id>Perceba que a aplicação, a direita, já utiliza as variáveis de ambiente que foram definidas no container.



#5 Provisionamento de Aplicações
Multi-containeres
Agora teste se os registros serão salvos na base
# Conectando a base todos
docker exec -it <mysql-container-id> mysql -p todos
# Consultando tabela com registros
mysql> select * from todo_items;

#5 Provisionamento de Aplicações
Multi-containeres com Compose
services:
app:
image: node:18-alpine
command: sh -c "yarn install && yarn run dev"
ports:
- 3000:3000
working_dir: /app
volumes:
- ./:/app
environment:
MYSQL_HOST: mysql
MYSQL_USER: root
MYSQL_PASSWORD: secret
MYSQL_DB: todos
mysql:
image: mysql:8.0
volumes:
- todo-mysql-data:/var/lib/mysql
environment:
MYSQL_ROOT_PASSWORD: secret
MYSQL_DATABASE: todos
volumes:
todo-mysql-data:
#5 Provisionamento de Aplicações
Exemplo compose Wordpress
version: '3.1'
services:
wordpress:
image: wordpress
restart: always
ports:
- 8080:80
environment:
WORDPRESS_DB_HOST: db
WORDPRESS_DB_USER: exampleuser
WORDPRESS_DB_PASSWORD: examplepass
WORDPRESS_DB_NAME: exampledb
volumes:
- wordpress:/var/www/html
db:
image: mysql:8.0
restart: always
environment:
MYSQL_DATABASE: exampledb
MYSQL_USER: exampleuser
MYSQL_PASSWORD: examplepass
MYSQL_RANDOM_ROOT_PASSWORD: '1'
volumes:
- db:/var/lib/mysql
volumes:
wordpress:
db:
#5 Provisionamento de Aplicações
Criando um Registry
# Criando um registry local
docker run -d -p 5001:5000 --name meu_registry registry:2
# Criando um registry com início automático
docker run -d -p 5001:5000 --name meu_registry --restart=always registry:2
#5 Provisionamento de Aplicações
Testando seu registry
# Baixando do Docker Hub
docker pull nginx
# Criando uma tag para sua imagem baseado na imagem do Docker Hub
docker tag nginx localhost:5001/meu-nginx
# Enviando a imagem para seu registry
docker push localhost:5001/meu-nginx
# Removendo a local baixada do Docker Hub
docker rmi nginx
# Removendo a imagem local enviada para seu registry
docker rmi localhost:5001/meu-nginx
# Agora testando se o registry tem a cópia salva da imagem
docker pull localhost:5001/meu-nginx
#5 Provisionamento de Aplicações
Docker Swarm

O Docker Swarm é uma ferramenta do Docker que permite criar e gerenciar clusters de contêineres:
- Organizar vários hosts Docker em um único cluster
- Escalar e gerenciar contêineres de forma mais simples
- Oferecer funcionalidades como balanceamento de carga, descoberta de serviços e escalabilidade automática

#5 Provisionamento de Aplicações
Docker Swarm

Para utilizar o Swarm faça o primeiro passo que é:
# Certifique-se de que o Swarm está ativado no host:
docker swarm init

#5 Provisionamento de Aplicações
Docker Swarm
Com o Swarm ativo agora vamos exercitar a criação dos serviços da aplicação To Do, para isso acesse a pasta do projeto e crie um arquivo chamado docker-stack.yml
version: '3.8'
services:
app:
image: node:18-alpine
command: sh -c "yarn install && yarn run dev"
restart: always
ports:
- 3005:3000
working_dir: /app
volumes:
- ./:/app
environment:
MYSQL_HOST: mysql
MYSQL_USER: root
MYSQL_PASSWORD: secret
MYSQL_DB: todos
deploy:
replicas: 1
restart_policy:
condition: any
mysql:
image: mysql:8.0
restart: always
volumes:
- todo-mysql-data:/var/lib/mysql
environment:
MYSQL_ROOT_PASSWORD: secret
MYSQL_DATABASE: todos
deploy:
replicas: 1
restart_policy:
condition: any
volumes:
todo-mysql-data:
#5 Provisionamento de Aplicações
Docker Swarm
Agora vamos criar e checar a stack de serviços
# Use o comando abaixo para implantar os serviços no Swarm:
docker stack deploy -c docker-stack.yml todo-app
# Após subir os serviços, use os comandos abaixo para monitorar:
## Listar stacks ativas:
docker stack ls
## Verificar o status dos serviços na stack:
docker stack services todo-app
## Verificar os logs dos serviços:
docker service logs todo-app_app
docker service logs todo-app_mysql
## Verificar o uso de recursos da stack
docker stats $(docker ps --filter "label=com.docker.stack.namespace=todo-app" -q)
#5 Provisionamento de Aplicações
Docker Swarm
Agora vamos criar e checar a stack de serviços
## Verificar o uso de recursos da stack
docker stats $(docker ps --filter "label=com.docker.stack.namespace=todo-app" -q)

#5 Provisionamento de Aplicações
Docker Swarm
Aumentando o número de réplicas
# Para aumentar as réplicas de um serviço:
docker service scale todo-app_app=3Aqui:
- todo-app_app é o nome do serviço no formato stack_name_service_name.
- 3 é o número desejado de réplicas.


#5 Provisionamento de Aplicações
Docker Swarm
Outra forma de aumentar as réplicas
# Atualizar a stack conforme arquivo docker-stack.yml
docker stack deploy -c docker-stack.yml todo-app
O que Acontece Durante a Atualização?
- Apenas as partes alteradas no arquivo serão modificadas.
- Containers podem ser recriados para refletir as alterações (por exemplo, novos comandos, variáveis de ambiente ou imagens).
- O Swarm tentará manter o maior tempo de disponibilidade possível durante o processo de atualização.

#5 Provisionamento de Aplicações
Docker Swarm
Removendo stack
# Para remover a stack:
docker stack rm <nome_da_stack>
docker stack rm todo-appAqui:
- todo-app_app é o nome do serviço no formato stack_name_service_name.
- 3 é o número desejado de réplicas.


Pipeline
#5 Criação de Pipeline
O que é um Pipeline?
Um pipeline de software é uma sequência automatizada de etapas que transforma código-fonte em um software pronto para uso. Imagine uma linha de produção, mas para o desenvolvimento de software.
#5 Criação de Pipeline
Por que usar Pipelines
Pipelines automatizam tarefas repetitivas, garantem consistência nas entregas, reduzem erros e aceleram o ciclo de desenvolvimento.
#5 Criação de Pipeline
Criando um Pipeline no GitLab
Configurando o .gitlab-ci.yml
O arquivo .gitlab-ci.yml define as etapas do seu pipeline, como construir, testar e implantar seu código.
#5 Criação de Pipelinestages:
- lint
- test
# Job para verificar o estilo de código com flake8
flake8:
stage: lint
image: python:3.10
before_script:
- python -m pip install --upgrade pip
- pip install flake8
script:
- flake8
only:
- merge_requests
- main
# Job para rodar os testes unitários
unittest:
stage: test
image: python:3.10
before_script:
- python -m pip install --upgrade pip
- pip install -r requirements.txt
script:
- python -m unittest discover -s tests -p "*.py"
only:
- merge_requests
- main
Executando um Pipeline no GitLab
Após criar o arquivo .gitlab-ci.yml, GitLab automaticamente detecta e executa seu pipeline.
#5 Criação de Pipeline


Todo List - Aplicação Completa para Provisionamento
Uma aplicação completa de lista de tarefas desenvolvida para demonstrar conceitos de provisionamento de aplicações, incluindo backend Django, frontend Angular, banco de dados PostgreSQL, containerização com Docker e pipeline CI/CD com GitHub Actions.
#6 Provisionando uma aplicação

Visão Geral
Este projeto foi desenvolvido como um exemplo prático para ensino de provisionamento de aplicações modernas. A aplicação permite aos usuários:
•✅ Criar, editar e excluir tarefas
•🏷️ Organizar tarefas por categorias
•⚡ Definir prioridades (Alta, Média, Baixa)
•📅 Estabelecer datas de vencimento
•📊 Visualizar estatísticas das tarefas
•🔍 Filtrar e buscar tarefas
•👤 Sistema de autenticação de usuários
#6 Provisionando uma aplicação

🛠️ Tecnologias Utilizadas
Backend
•Python 3.11 - Linguagem de programação
•Django 5.2 - Framework web
•Django REST Framework - API REST
•PostgreSQL - Banco de dados
•psycopg2 - Driver PostgreSQL
•python-decouple - Gerenciamento de configurações
#6 Provisionando uma aplicação
Frontend
•Angular 18 - Framework frontend
•TypeScript - Linguagem de programação
•SCSS - Pré-processador CSS
•Angular Material - Componentes UI
•RxJS - Programação reativa
DevOps e Infraestrutura
•Docker - Containerização
•Docker Compose - Orquestração de containers
•Nginx - Servidor web para frontend
•GitHub Actions - CI/CD pipeline
•Make - Automação de tarefas
Ferramentas de Qualidade
•Black - Formatação de código Python
•Flake8 - Linting Python
•ESLint - Linting TypeScript
•Prettier - Formatação de código frontend
•Bandit - Análise de segurança Python
•CodeQL - Análise de segurança geral

📋 Pré-requisitos
Para executar este projeto, você precisa ter instalado:
•Docker (versão 20.10 ou superior)
•Docker Compose (versão 2.0 ou superior)
•Make (opcional, para usar comandos simplificados)
•Git (para clonar o repositório)
Para desenvolvimento local (opcional):
•Python 3.11+
•Node.js 20+
•PostgreSQL 15+
#6 Provisionando uma aplicação
#6 Provisionando uma aplicação
Arquitetura da solução
┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
│ Frontend │ │ Backend │ │ Database │
│ (Angular) │◄──►│ (Django) │◄──►│ (PostgreSQL) │
│ Port: 80 │ │ Port: 8000 │ │ Port: 5432 │
└─────────────────┘ └─────────────────┘ └─────────────────┘
│ │ │
└───────────────────────┼───────────────────────┘
│
┌─────────────────┐
│ Docker │
│ Containers │
└─────────────────┘

Referências
-
https://br.k21.global/transformacao-organizacional/devops-o-que-e
-
https://www.atlassian.com/br/devops/what-is-devops/history-of-devops
-
https://www.redhat.com/pt-br/topics/automation/what-is-infrastructure-as-code-iac
-
https://sensu.io/blog/implementing-infrastructure-as-code-with-ansible
-
https://aprovati.com/infraestrutura-como-codigo-iac-declarativa-e-imperativa/
-
https://www.redhat.com/pt-br/topics/cloud-native-apps/what-is-containerization


Referências

eTech - Provisionamento de Aplicações
By Vanilton Pinheiro
eTech - Provisionamento de Aplicações
Compreender e desenvolver a capacidade de aplicar os conceitos, técnicas, métodos e ferramentas para a manutenção dos artefatos relacionados ao desenvolvimento de software.
- 931