
Nesta primeira aula explicarei o funcionamento do curso, a estrutura dos conteúdos propostos e o objetivo central, que é utilizar as ferramentas DevOps de forma prática e assertiva.
Entenda como o DevOps surgiu, quais são os seus principais motivadores e como essa metodologia se tornou tão popular em diversas empresas pelo mundo.
A vantagem no uso do Vagrant para criação de máquinas virtuais, em conjunto com as metodologias de DevOps, torna a combinação perfeita para acriação de servidores virtuais de forma rápida, automatizada e segura. Seja um sysadmin, seja um desenvolvedor, o Vagrant tem um papel fundamental na metodologia DevOps.
Alguns conceitos do Vagrant serão abordados nesta aula. Um deles é o uso de boxes pré-configurados. Além disso, serão apresentadas também funcionalidades de networking.
Atenção! Não pular essa aula!
O vbguest é um importante plugin, que deve ser instalado no ambiente. Sem ele podem ocorrer problemas no nosso laboratório.
Venha aprender...
Quais são os pontos de atenção para instalação do VirtualBox e Vagrant.
Como criar Vagrantfile via vagrant init.
Como Configurar port forward.
De que maneira utilizar o script de provisionamento.
Como instalar Apache na máquina virtual e subir arquivos HTML para o guest.
Facilitadores do vbguest
Como port forward é configurado
Detalhes do compartilhamento de disco
1. Introdução ao Git
2. Conceitos e comandos básicos:
git init, add, commit, status, push, pull, etc.
Venha aprender:
Como criar uma conta no github
Instalando o Git no seu computador
Como inicializar um repositório
Como adicionar uma origem remota
Adicionando arquivos ao repositório local
Agora você vai aprender como criar token de acesso pessoal ou PAT: Private Access Token. Após a criação do token o commit para o repo remoto será executado com sucesso.
Conheça a arquitetura do Ansible e saiba quais são os principais componentes e motivadores para utilizá-lo como ferramenta de Infraestrutura como código.
Nessa aula vamos conferir arquitetura do laboratório Ansible e detalhar:
A arquitetura do laboratório.
As funcionalidades do Vagrant: nfs, private network e port forward.
A estrutura de diretórios.
O passo a passo de configuração do control node: instalação do Ansible, configuração do inventário.
Testar a conectividade entre os hosts
Aqui você vai criar a estrutura de diretórios necessária para o laboratório, bem como o primeiro arquivo de configuração Vagrant para instalação do control node para o Ansible.
O provisionamento é uma ferramenta importante quando pensamos em DevOps. Neste laboratório vamos continuar com essa prática, provisionando a instalação do control node na forma automatizada, sem a necessidade de executar passos manuais.
Configure o servidor responsável por hospedar a aplicação Java utilizada nesse laboratório. Nesta aula será realizado ainda o teste de comunicação entre o servidor app01 com control node para validar se a rede privada está funcionando corretamente.
A máquina de banco de dados será a última a ser provisionada via vagrant no nosso lab.
Aprendendo como configurar o arquivo de inventário do Ansbile, com detalhes de como o control node acessa os managed hosts remotamente, via ssh.
Aqui você vai configurar a relação de confiança entre hosts e melhorar um pouco mais o script de provisionamento. E ainda:
Como criar chave privada e pública.
Como estabelecer relação de confiança (acesso sem senha) entre servidores.
Ajustar script de provisionamento - adicionar autorized_keys no momento de criação dos servidores.
Obs.: Caso seja necessário utilizar os arquivos de configuração anexos (ansible-lab.tar.gz) lembre-se que a chave pública não vai funcionar. É necessário executar os passos de criação de chave privada e pública explicados nesta aula. Substitua nos arquivos de provisionamento (provision.sh) a última linha referente à atualização do arquivo authorized_keys.
Os playbooks são a base para o estudo do Ansible, pois tudo que é configurado nos managed hosts utiliza playbooks com o passo a passo de cada comando a ser executado remotamente, a partir do control node.
Veja a estrutura básica de diretórios para construção dos playbooks, tendo como exemplo a primeira role do ansible customizada para reutilização de código.
Nessa aula vamos exemplificar como externalizar variáveis dos playbooks, utilizando novamente a boa prática de reaproveitamento (se necessário) em compartilhar as mesmas variáveis para diversos playbooks.
O reuso de módulos da comunidade muitas vezes se faz necessário para evitar retrabalho. Por isso a relevância de aprender como utilizar o Galaxy a favor do time de DevOps. Também está sendo demonstrado a importância do uso do --check, a execução em modo dry run, que simula a execução do playbook, bem como demonstra seus falsos positivos.
A instalação do MySQL via Ansible reutilizando código da comunidade é muito mais transparente e limpa, conforme demonstrado nesta aula prática de instalação de um banco de dados. Apresento ainda um pouco do troubleshooting na execução de scripts Ansible.
Veja a estratégia de deploy de uma aplicação Java passo a passo, detalhando as tasks a serem criadas no playbook de app.
A importância de ler a documentação do código fonte da aplicação faz parte do dia a dia do time de DevOps. Analisar os pré-requisitos do playbook antes de começar a escrever é uma boa prática que será aqui detalhada.
Vamos escrever passo a passo o playbook de aplicação java, bem mais complexo que a camada de banco de dados.
Veja os temas abordados neste tópico:
Definição de variáveis.
Configuração hosts – Lab Ansible.
Utilização de role – config básica de S.O (compartilhada).
Adicionar usuário APP.
Instalação do Maven / Java – JDK 8.
Criação de estrutura de diretórios para Aplicação.
Clone do repositório git.
Como Configurar arquivo de propriedades (utilizando templates).
Geração do pacote.
Como registrar versão do pacote (utilizando o register).
A abordagem finaliza o playbook de deploy da app Java, mostrando conceitos de criação de serviços via Systemd, templates e o uso de handlers.
Vamos colocar em prática a primeira tentativa de execução do nosso script, simulando a vida real executando o troubleshooting do playbook criado na aula anterior.
A continuação do troubleshooting prossegue com ajustes ao playbook, bem como a substituição de comandos que poderiam funcionar no passado, mas que podem ser modificados de acordo com a demanda atual do ambiente.
Nesta última parte do conteúdo sobre troubleshooting é demonstrado como ajustar o último erro no playbook e finalmente efetuar o deploy da aplicação Java no servidor app01.
Por conta de alguns alunos apresentarem problemas na compilação do pacote via maven, subi essa video aula com o objetivo de contornar o erro apresentado no momento da geração do arquivo .jar via mvn.
Nesta parte do curso você confere o conceito de DRY - Don't Repeat Yourself - expressão bem conhecida em design de programação, que demonstra o quanto é importante evitar duplicação de código. Em seguida finalizamos o laboratório com o commit no github dos novos arquivos criados para a aula de Ansible. Também foi criada uma nova configuração: o arquivo .gitignore, impedindo que determinados arquivos subam para o github, o que evita poluir o repositório.
O teste funcional da aplicação é de grande importância, pois valida se os artefatos disponibilizados no ambiente realmente foram configurados corretamente. Vamos aprender um pouco sobre como testar uma aplicação REST via linha de comando, e validar se o dado cadastrado via aplicação foi gravado no banco de dados com sucesso.
Veja o que vamos aprender neste tópico que fala sobre os conceitos de arquitetura do Docker:
O que é e para que serve o docker?
Vantagens do modelo tradicional de virtualização.
Arquitetura do docker: images, container, registry.
Conceitos básicos: docker files, comandos de build, run e download de images.
Nesta aula vamos executar a criação do:
Vagrantfile para lab do Docker.
Script de provisionamento.
Primeiro Dockerfile.
A montagem do Dockerfile pode conter dependências que impedem a compilação da imagem. Vamos aprender juntos como resolver problemas comuns, como falta de arquivos para compilação da imagem, além de alguns comandos de sys admin bastante utilizados no dia a dia de operações:
vagrant upload
vagrant ssh-config
scp - copia de arquivos remotos
Na aula anterior foi demonstrado como criar um Dockerfile sem utilizar a compilação do Java no procedimento de geração da imagem Docker. A ideia é comparar a complexidade entre os dois modelos, bem como o tamanho da imagem gerada. Nessa primeira parte vamos aprender como:
Instalar e configurar pacotes do sistema operacional.
Trabalhar com variáveis de ambiente.
Executar comandos ENV, RUN, WORKDIR do Dockerfile.
A compilação do código fonte via Docker é finalizado nesta aula. Aqui você confere como alguns ajustes de permissionamento e variáveis de ambiente foram abordados como temas de troubleshooting.
Na aula anterior foi constatado que o build de uma aplicação Java requer diversos componentes instalados no container para que a compilação do código fonte seja realizada com sucesso. Sabemos que mais pacotes e dependências aumentam o tamanho da imagem Docker consideravelmente. Como contornar esse problema? O uso do multi stage build será apresentado como solução, confira!
Vamos ver juntos uma breve introdução que preparei para a criação de uma nova aplicação baseada em NodeJS, que faz a comunicação com o Redis, um servidor de chave-valor bem comum no mercado, muitas vezes utilizado como camada de cache. A ideia principal é exercitar outras linguagens de programação e formatos de armazenamento de dados, diferentemente do modelo tradicional de banco de dados.
Agora vamos escrever um código bem simples em NodeJs, que receberá uma chamada via request http. Essa chamada contabiliza a quantidade de visitas recebidas e atualiza esse dado no Redis.
Após o build do Dockerfile que embarca nossa aplicação NodeJs, será iniciado o container para validar se nossa aplicação está ok.
Por definição o Docker não permite a comunicação direta entre containers. Para que containers possam se comunicar é necessário criar uma rede de comunicação que seja previamente configurada, permitindo assim que a nossa aplicação NodeJS consuma os serviços do Redis, localizado em outro container.
O uso de volumes no Docker se torna fundamental quando precisamos persistir arquivos, mesmo após o restart / crash do container. Nesta aula vamos aprender a montar um volume em uma instância Docker, criar um arquivo a partir do container e validar se foi gravado com sucesso no host.
O Docker Compose é uma ferramenta de grande valor quando pensamos em automatizar a criação de containers Docker. Além de estar aderente às técnicas de DevOps (como IaC), pode ser um facilitador para a criação de ambientes temporários, muito utilizados em testes de integração.
Veja a abordagem prática de instalação e criação do primeiro artefato do docker-compose.
E acesse os anexos contendo os scripts de instalação do docker-compose.
A alta disponibilidade em ambientes produtivos é fundamental para manter a saúde das aplicações, promovendo uma experiência satisfatória para o usuário final. Ambientes que sofrem com manutenções – programadas ou não – podem tornar a experiência do usuário frustrante. Manter aplicações up and running sempre será um desafio. Para isso o Docker Swarm nos ajuda criando uma camada de software que gerencia o cluster de servidores Docker de forma prática e transparente.
O Vagrantfile já se mostrou bastante útil na criação de máquinas virtuais para o nosso laboratório. Porém, o formato utilizado de diversos Vagrantfiles para cada máquina virtual pode ser ruim quando pensamos em uma estrutura de máquinas dependentes entre si. No laboratório do Docker Swarm será empregado somente um Vagrantfile para instalar três máquinas virtuais, o que facilita a organização do código fonte, deixando a estrutura de diretórios mais simples e limpa.
É necessário executar alguns comandos para a configuração do cluster Swarm para que o manager node tenha conhecimento dos nodes que vão compor o ambiente. Nesta aula também serão listados os comandos para a criação de um service.
A montagem do cluster Swarm é feita de forma simples através de dois comandos, o init para iniciar o cluster e o join para adicionar nodes ao Swarm cluster. Confira na prática como vamos executar a instalação do cluster, além de alguns testes iniciando containers com alta disponibilidade por meio do comando service.
A importância da revisão para fixação dos comandos é sempre bem-vinda. Vamos revisar os comandos executados nas aulas anteriores, conforme a lista a seguir:
docker build
docker run
docker network
docker ps
docker rm
docker logs
docker rmi
docker system prune
Adicionar análise estática de código no pipeline de DevOps é prática altamente recomendada. Com auxílio dessa ferramenta podemos evitar subidas de aplicações para produção com bugs ou até mesmo falhas de segurança. Então vamos aprender sobre a arquitetura do Sonarqube, funcionalidades e benefícios que o time de desenvolvimento pode ter com o uso dessa ferramenta.
A configuração do laboratório será feita a partir de uma máquina vagrant, porém, toda instalação do Sonarqube vai ser baseada em bash script por meio do provision.sh. O objetivo desta aula vai um pouco além da instalação do Sonarqube, demonstrando passo a passo como instalar um produto a partir de comandos bash, configurando serviços no systemd, manipulando arquivos, variáveis de ambiente, dentre outros comandos fundamentais para o dia a dia de um profissional de operações.
Dando continuidade à aula anterior, após a instalação do sonarqube via provision, vamos agora instalar o utilitário sonar scanner, responsável por enviar o código-fonte para o servidor do sonar. A instalação vai seguir o mesmo modelo do Sonarqube, utilizando scripts bash através do provisionamento do vagrant.
O primeiro acesso ao Sonarqube solicita o reset da senha default, por motivos de segurança. O próximo passo é criar um projeto que vai receber os códigos-fontes a serem analisados. Nesse lab vamos utilizar a aplicação redis-app, criada no lab do Docker Compose como exemplo de análise de código.
A aplicação NodeJS criada no lab do docker compose foi escolhida para ser analisada pelo Sonarqube nesta aula. Vamos gerar um Bug e corrigir logo em seguida para validar o comportamento da ferramenta, com exemplos práticos da análise e correção de código, utilizando o Sonarqube também como fonte de resolução de problemas.
Na aula introdutória ao Jenkins vamos falar da importância do Jenkins no que diz respeito ao CI/CD, formato de trabalho (master e slave multi plataforma), dependência de ferramentas e plugins, como git e maven, e os passos iniciais de configuração do produto.
A configuração do laboratório do Jenkins será feita por meio do provisionamento do vagrant, utilizando bash script para instalação do Jenkins, docker e docker-compose. A configuração inicial de plugins também será demonstrada.
Aqui você vai entender os pré-requisitos necessários para a criação do nosso primeiro pipeline DevOps. A criação de um repositório no github será o primeiro passo.
Vamos reutilizar a aplicação redis-app criada no laboratório do docker-compose, reaproveitando o código já existente.
Veja na prática como criar o repositório git com os artefatos necessários para a geração do nosso primeiro pipeline no Jenkins.
A criação do primeiro pipeline, que você confere aqui, está focada na apresentação da integração contínua, desde o checkout do código-fonte, passando pelo build da imagem docker até os testes da aplicação. Será demonstrado como utilizar a linguagem de pipeline, de forma simples e objetiva, através da criação do Jenkinsfile.
Os ajustes finais da primeira versão do pipeline serão executados nesta aula, fique de olho!
A ideia de exercitar bash script está sendo aplicada no decorrer do curso, com exemplos práticos que se encaixam nas atividades de forma natural. Vamos criar um script bash um pouco mais avançado agora, que executa um teste GET na nossa aplicação Node e verifica se o serviço está no ar.
É fundamental automatizar todos os passos do ciclo de vida do software em uma esteira de DevOps. Nas aulas anteriores aprendemos como instalar, configurar e analisar um código-fonte em Python no SonarQube, de forma manual. O objetivo dessa seção é integrar o Jenkins ao Sonarqube, automatizando a tarefa de análise estática de código, bem como a segurança da nossa aplicação.
É fundamental automatizar todos os passos do ciclo de vida do software em uma esteira de DevOps. Nas aulas anteriores aprendemos como instalar, configurar e analisar um código-fonte em Python no SonarQube, de forma manual. O objetivo dessa seção é integrar o Jenkins ao Sonarqube, automatizando a tarefa de análise estática de código, bem como a segurança da nossa aplicação.
A configuração do sonar scanner é necessária para que o Jenkins execute a análise estática do código por meio do nosso Pipeline DevOps. Essa chamada vai ocorrer toda vez que um novo commit no Github for criado, melhorando a qualidade do nosso código, evitando subidas indevidas para o ambiente produtivo.
Vamos aprender a configurar a segunda parte do plugin do sonar scanner? E ainda, alterar o pipeline DevOps adicionando os steps do Sonarqube. Confira!
Percebemos na aula anterior que nosso código não possui testes unitários. Na política default do Sonar os testes unitários devem cobrir pelo menos 80% do código. Então vamos aprender como configurar o Custom Quality Gate para atender às necessidades do nosso laboratório.
É uma boa prática pensar em um armazenamento centralizado dos artefatos gerados pelo pipeline de DevOps. Nesta aula vamos aprender como utilizar o Nexus, gerenciador de repositório muito popular que vai nos auxiliar na atividade aqui proposta.
Neste laboratório vamos utilizar uma imagem docker pré-configurada para subir o serviço do Nexus no nosso ambiente, que será utilizado futuramente pelo pipeline DevOps por meio do Jenkins.
Vamos agora configurar o serviço de registry do Docker no Nexus. Também é necessário criar um usuário para o Jenkins conectar ao Nexus.
Após iniciar o container docker com o Nexus é necessário executar alguns passos administrativos para finalizar a configuração do Nexus. A criação do usuário Jenkins e a configuração do registry Docker também serão vistas neste momento.
A importância de validar a execução do script antes da alteração do pipeline já elimina a possibilidade de suspeita de erro de configuração do lado do Nexus. Vamos executar o build, a tag e o push da imagem docker para o registry do Nexus.
O passo final na cadeia de integração contínua será o upload da imagem docker para o Nexus. Saiba como integrar o Jenkins ao Nexus utilizando boas práticas, evitando uso de URLs fixas no código, senhas hardcoded, o que mantém o código limpo, reutilizável e em conformidade com os requisitos de segurança recomendados.
O gerenciamento de containers pode ser caótico quando o volume e a complexidade do ambiente aumentam. O Kubernetes nasceu dessa necessidade: de gerenciar containers de forma transparente e automatizada para os operadores de infraestrutura. Conheça alguns conceitos de arquitetura e veja as funcionalidades do Kubernetes.
Apresento neste tópico a distribuição kubernetes chamada k3s, muito mais leve e de simples configuração, sempre bem-vinda em laboratórios, pois é homologada para funcionar da mesma forma que um cluster k8s.
Demonstrar a instalação do cluster é um passo importante como experiência de primeiro contato com a ferramenta. Seria perfeitamente possível automatizar a instalação via provisionamento, porém nessa aula vamos fazer um pouco diferente e agregar mais experiência com a instalação do zero do cluster K3s.
O uso constante do terminal pode ser cansativo, principalmente quando as linhas de comando são extensas ou executadas com muita frequência. Para evitar retrabalho, vamos apresentar atalhos (ou autocomplete) que facilitam o nosso dia a dia e aumentam a produtividade. Além disso é recomendado instalar os utilitários já conhecidos para troubleshooting, como telnet, net-tools (netstat) para nos auxiliar na montagem do laboratório.
Saiba como configurar um registry docker privado. Ou seja, como utilizar o registry configurado no Nexus como repositório docker para o cluster k3s.
Arquivos YAML na vida de um profissional DevOps é algo tão natural quanto tomar café. Vamos criar o primeiro deployment, feito manualmente, sem copiar templates? Justamente para passar por problemas comuns de erros de digitação, falta de identação, entre outros obstáculos comuns para quem trabalhar com K8s. Para isso a ideia é empregar o exemplo de deployment utilizando redis como nosso primeiro deploy no kubernetes.
Nem sempre o retorno de sucesso (objeto criado) do kubectl necessariamente quer dizer que o deploy foi executado com sucesso. Confira uma lista de comandos necessários para o troubleshooting e para encontrar informações referentes ao objeto recém-criado.
A criação de um novo objeto chamado Service é necessária para que os containers possam se falar. O Service trabalha na camada de networking e será o componente responsável por expor a porta do container para a rede K8s, para que outras aplicações estabeleçam conexão com a aplicação em questão.
Problemas de comunicação são comuns em ambientes complexos. Quando falamos de k8s precisamos entender que a edição manual de arquivos yaml pode gerar erros de configuração, principalmente se alguma parte referente à camada de rede for esquecida, como o expose de uma porta. Veja como fazer um troubleshooting na camada de redes, validando se nosso Redis está configurado corretamente para receber conexões de outros pods.
O deploy completo de uma aplicação web no k8s será apresentado nesta aula. Vamos mostrar na prática como criar uma configuração do zero, os erros comuns de execução e possíveis problemas que podem ocorrer em um ambiente real. Vamos aprender como configurar:
Deployment
Service
Ingress
A continuação do deploy é focada em validar o deploy, verificar se os serviços estão responsivos e bem configurados. Nesta aula finalizamos o deploy ponta a ponta de uma aplicação no kubernetes, desde a configuração do deployment até o Ingress, expondo a aplicação para fora do cluster k8s.
O curso DevOps - Mão na massa! foi criado para atender a demanda de profissionais de T.I que já estão no mercado e desejam uma visão geral do que é DevOps no dia a dia. Esse curso foi inspirado pela necessidade de aprender diversas ferramentas que muitas vezes estão conectadas, porém a literatura ou cursos dificilmente as conectam. O objetivo não é ser especialista em todas as ferramentas citadas, mas sim ter uma visão geral de como é trabalhar com DevOps e servir como um guia para os profissionais que desejam embarcar nessa área tão importante nos dias de hoje.
A abordagem do curso, como o nome mesmo diz, é focar na prática o aprendizado, onde cada comando é executado passo a passo e visualizado pelo aluno de forma detalhada e simples.
O curso aborda de forma macro os principais tópicos listados abaixo:
Uma pequena apresentação dos conceitos DevOps
Uso do Vagrant como plataforma de gerenciamento de máquinas virtuais para Lab.
Introdução ao git: comandos básicos de criação de repositórios, gerenciamento da árvore, exemplos práticos de manipulação de arquivos.
Ansible: laboratório 100% prático com exemplos de como configurar o managed host, criar playbooks e efetuar o deploy de uma aplicação Java com banco de dados MySQL.
Docker: Introdução de instalação e configuração do Docker, exemplos de comandos mais utilizados e por fim como criar uma imagem docker e exemplo de uso do Docker compose como ferramenta de orquestração de containers.
Jenkins: O coração do pipeline DevOps. Nesse tópico serão abordados temas de instalação e configuração do Jenkins, criação de pipelines que vão desde a compilação de códigos fonte, startup de containers, testes integrados, build de imagens Docker e como aplicar o git flow no pipline CI/CD.
Sonarqube: Melhore a segurança e a qualidade de código com Sonarqube. Entenda o funcionamento integrado do Sonar com o Jenkins, configurando um pipeline DevOps ainda mais completo.
Kubernetes: Aprenda como instalar e configurar o K3s, distribuição mais leve do Kubernetes utilizada em nosso laboratório. O k3s será utilizado na esteira DevOps o passo de CD (Deployment continuo) disponibilizando uma aplicação funcional em NodeJs e Redis.
Observability: Entenda como instalar configurar o Prometheus, ferramenta de observability muito popular para monitoria de containers e ambientes baseados em microsserviços. Configure dashboards conectados ao Prometheus com o Grafana, ferramenta opensource muito utilizada para visualização de dados e gráficos.