Alura > Cursos de DevOps > Cursos de Automação de processos > Conteúdos de Automação de processos > Primeiras aulas do curso Scripting: automatizando tarefas com Bash e Docker

Scripting: automatizando tarefas com Bash e Docker

Construindo scripts de monitoramento - Apresentação

Boas-vindas a este curso de Scripting! Sou a Gabrielle Ribeiro, instrutora aqui da Alura.

Audiodescrição: Gabrielle se declara como mulher parda. Tem cabelo rosa e liso, um pouco abaixo da altura dos ombros. Veste uma camiseta preta e óculos de grau de armação redonda. No nariz, há dois piercings: um no septo e outro na aba direita; outro na parte inferior central da boca e na sobrancelha esquerda. Ao fundo, há uma parede iluminada nas cores vermelho, roxo e azul.

Se você possui experiência em DevOps e deseja aperfeiçoar suas habilidades na criação de scripts para automação de tarefas, este curso é ideal para você.

O que vamos aprender?

  1. Criar e executar scripts bash
  2. Usar condicionais e laços de repetição
  3. Criar imagens e containers Docker
  4. Disponibilizar imagens no Docker Hub

Durante o curso, você será capacitado a desenvolver e executar scripts bash, utilizar condicionais e laços de repetição, criar imagens e containers Docker, e fazer o upload dessas imagens no Docker Hub. Todo esse aprendizado será aplicado na prática, através da elaboração de scripts para o projeto Adopet, um site dedicado à adoção de animais.

Pré-requisitos

Para tirar o máximo proveito deste curso, é recomendado que você tenha concluído a formação "Começando em DevOps". Além dos vídeos, você pode aproveitar os recursos adicionais da nossa plataforma, como as atividades, o suporte do fórum e a interação com a nossa comunidade no Discord.

Vamos lá?

Construindo scripts de monitoramento - Criando um Script Bash

Contextualizando a motivação de usar scripts

Dentro do cenário de DevOps, é frequente o uso de sistemas operacionais Linux, ou mesmo ferramentas que emulam esses sistemas, como o WSL no Windows. Nesses ambientes, é comum empregar o terminal para realizar operações e tarefas diversas.

Apesar disso, às vezes utilizar o terminal para essas tarefas pode se tornar pouco eficiente e cansativo. Para lidar com essa questão, é possível recorrer ao uso de scripts, uma abordagem que permite automatizar e agilizar a execução dessas tarefas de forma mais eficiente.

Neste curso, iremos usar o WSL no Windows, tendo previamente instalado o sistema operacional Ubuntu. Para acessá-lo, basta buscar por "Ubuntu" na barra de pesquisa do Windows e abrir o terminal do WSL. Neste ambiente, é possível executar todos os comandos típicos de um sistema Linux.

Além disso, se você utiliza qualquer sistema operacional baseado em Linux, pode ficar tranquilo, pois as ações realizadas neste curso são compatíveis com sua máquina.

Vamos explorar como os comandos são executados em um terminal Linux.

Explorando comandos no terminal

Para isso, usaremos o comando curl para verificar o status de um servidor, garantindo assim que uma aplicação que colocamos em produção esteja funcionando corretamente.

Primeiramente, é importante garantir que o curl está instalado em nossa máquina. Podemos fazer isso executando o comando sudo apt install curl, que solicitará nossa senha.

sudo apt install curl

Ao executarmos, obtemos a solicitação da senha:

[sudo] password for NomeDaPessoaUsuária:

No meu caso, já o havia instalado, mas talvez em sua máquina essa ferramenta ainda não esteja disponível.

O retorno abaixo foi parcialmente transcrito:

curl is already the newest version (7.81.0-1ubuntu1.15)

Após essa verificação, podemos prosseguir com a execução do nosso comando. Digitamos "Ctrl + L" para limpar o terminal.

Digitamos curl, em seguida adicionaremos a flag --write-out para obter uma saída do nosso site. Dentro desta flag, especificaremos que desejamos o código HTTP da página, digitando %{http_code} entre chaves.

Também vamos adicionar a flag --silent e --output, especificando /dev/null, para que o comando curl retorne apenas o código HTTP. Se não utilizarmos a flag --silent e redirecionarmos a saída para /dev/null, o terminal exibirá um HTML extenso da página, mas desejamos apenas o status HTTP.

curl --write-out %{http_code} --silent --output /dev/null

Vamos começar testando a aplicação Adopet.

Na atividade "Preparando o ambiente", compartilhamos o link desta aplicação, e agora vamos abri-la no navegador no endereço adopet-frontend-cypress.vercel.app.

Agora, estamos visualizando a aplicação AdoPet, um site dedicado à adoção de animais, onde podemos verificar os pets disponíveis para adoção clicando no botão "Ver pets disponíveis para adoção" na parte central da tela. Esta aplicação está online e qualquer pessoa pode acessá-la utilizando a URL que acabamos de copiar.

adopet-frontend-cypress.vercel.app/home

Retornamos ao terminal.

Adicionamos a URL ao final do comando curl para especificar que desejamos que ele traga um retorno desse site específico.

curl --write-out %{http_code} --silent --output /dev/null https://adopet-frontend-cypress.vercel.app/home

Ao pressionarmos "Enter", o terminal exibirá o código 200, indicando que a página está funcionando corretamente.

200

Para recapitular os status HTTP, o código 200 significa que tudo está funcionando bem. Existem também outros códigos, como o 500, que indica um erro interno do servidor, e o 404, que ocorre quando a página não é encontrada, entre outros.

Agora vamos criar um script que poderemos usar no futuro para verificar se nossa aplicação está funcionando. Copiamos o comando que utilizamos anteriormente utilizando "Ctrl + Shift + C" e abrimos um editor de texto.

No meu caso, usarei o Vim, mas você pode escolher o editor de texto que preferir, como o Nano ou qualquer outro. Daremos um nome ao nosso script: monitoramento-servidor.sh.

vim monitoramento-servidor.sh

Definimos o nome do nosso script como monitoramento-servidor.sh. Após isso, pressionamos "Enter" para abrir o editor e a tecla "A" para editar o documento. O início do script incluirá o que chamamos de "shebang".

O shebang é representado pelo símbolo de hashtag (cerquilha) e uma exclamação: #!. Ele é utilizado para especificar qual interpretador será utilizado para interpretar o código do script.

Quando executamos aquele comando no terminal, usamos o interpretador bash, um dos mais populares em sistemas Linux, embora haja outros interpretadores disponíveis.

Após o shebang, definimos o interpretador que desejamos usar, que no nosso caso é o bash. Para isso, digitamos /bin/bash.

#!/bin/bash

Se outros interpretadores forem usados, o shebang será diferente. Deixaremos uma atividade para explorar mais esse tema.

Inserimos uma linha em branco e então criamos a variável codigo_http. Essa é a forma como se cria uma variável em um script bash.

#!/bin/bash

codigo_http

O objetivo é atribuir a essa variável a saída do comando que executamos no terminal.

Para isso, usaremos o sinal de igual e inseriremos o comando que copiamos anteriormente com "Ctrl + Shift + V".

#!/bin/bash

codigo_http=curl --write-out %{http_code} --silent --output /dev/null https://adopet-frontend-cypress.vercel.app/home

No entanto, como se trata de um comando cujo retorno desejamos capturar e armazenar apenas o valor de saída na nossa variável, precisamos envolver esse comando entre cifrões, seguido de parênteses, e ao final do comando, fechamos os parênteses.

#!/bin/bash

codigo_http=$(curl --write-out %{http_code} --silent --output /dev/null https://adopet-frontend-cypress.vercel.app/home)

Pulamos uma linha e exibimos a informação armazenada nessa variável no terminal. Para isso, podemos usar o comando echo, que funciona como o "print" em outras linguagens de programação. Para acessar o valor armazenado em uma variável em diferentes partes do código, como no comando echo, utilizamos o sinal de cifrão seguido pelo nome da variável, que é codigo_http.

#!/bin/bash

codigo_http=$(curl --write-out %{http_code} --silent --output /dev/null https://adopet-frontend-cypress.vercel.app/home)
echo $codigo_http

Podemos clicar em "ESC", digitar ":x" para salvar o nosso arquivo e limpar o terminal.

Gerenciando permissões de execução

Em seguida, vamos tentar executar o nosso script com ./monitoramento-servidor.sh.

./monitoramento-servidor.sh

Recebemos uma mensagem de erro informando que a permissão foi negada.

bash: ./monitoramento-servidor.sh: Permission denied

Para executar um script bash, é necessário conceder permissão de execução usando chmod +x seguido do nome do script: monitoramento-servidor.sh. Após conceder permissão, podemos executá-lo com o comando ./monitoramento-servidor.sh no terminal.

chmod +x monitoramento-servidor.sh

Executamos o comando chmod. Logo após, executamos:

./monitoramento-servidor.sh

Ao fazer isso, obtemos a saída esperada.

200

Obtemos o mesmo retorno de quando rodamos o comando no terminal. Voltamos para o editor de texto com o comando vim monitoramento-servidor.sh.

Recapitulando

Para recapitular o processo, criamos scripts bash com extensão .sh. A primeira linha do script contém o shebang para definir o interpretador (bash, neste caso), seguido pelos comandos que desejamos que sejam executados.

Construindo scripts de monitoramento - Monitorando o uso de disco

Vamos pensar em um cenário específico: estamos integrados em um time de DevOps e recebemos a solicitação de desenvolver um script para monitorar o uso do disco. Essa funcionalidade é essencial para verificar a disponibilidade de espaço em nossas partições e sistemas de arquivos.

Monitorando o uso de disco

Para iniciar o desenvolvimento do script, abrimos o terminal e criamos um arquivo chamado monitoramento-disco.sh.

vim monitoramento-disco.sh

Usamos o editor de texto Vim para começar a editar o script, adicionando o Shebang #!/bin/bash no início para definir que se trata de um script em Bash.

#!/bin/bash

Antes de prosseguirmos com a escrita dos comandos do script, é prudente testá-los no terminal. Vamos seguir esse procedimento: fechar o arquivo, salvá-lo com ":x", limpar o terminal e revisar nossa tarefa, que é monitorar o uso de disco em nossa máquina.

No contexto dos sistemas Linux, dispomos de um comando altamente útil para essa finalidade, o df, que pode ser utilizado com a flag -h.

df -h

Ele fornece detalhes sobre os sistemas e as partições, incluindo seus tamanhos (Size), a quantidade de memória utilizada (Used), a disponibilidade de espaço (Avail), a porcentagem de uso e o ponto de uso (Use%) de cada sistema.

Para obter informações específicas da partição C do Windows, C:\, vamos aplicar um filtro para selecionar apenas a linha desejada.

Linha indicada pela instrutora:

FilesystemSizeUsedAvailUse%Mounted on
C:\237G216G22G92%/mnt/c

Podemos utilizar o comando Grep do Linux, que aceita uma string como argumento e realiza essa filtragem para nós.

Utilizando o comando Grep

Identificamos que a linha referente à partição C: apresenta um padrão de texto repetido com outra partição que não é relevante para nós. Para resolver isso, podemos procurar por uma única parte dessa linha. Por exemplo, a montagem da nossa partição C: é representada como /mnt/c.

Podemos realizar a cópia desse trecho, uma vez que ele é único e específico para nossa necessidade. Para isso, vamos limpar a tela e executar novamente o comando df -h, concatenando-o com o comando grep por meio do operador pipe, representado pela barra vertical. Em seguida, digitamos o comando grep seguido da string que desejamos buscar dentro de todas as informações exibidas pelo df -h.

df -h | grep /mnt/c

Ao pressionarmos "Enter", observamos que a linha de interesse foi filtrada.

C:\237G216G22G92%/mnt/c

Agora, buscamos a porcentagem de uso de disco nessa seção. Temos diversas colunas disponíveis, sendo a quinta coluna a que contém a informação desejada. Para extrair essa informação, podemos utilizar o comando awk no Linux.

Utilizando o comando awk

Vamos reunir todos os comandos que já especificamos até agora (df -h | grep /mnt/c). Digitaremos o operador de pipe (|) novamente e acrescentaremos o comando awk. Com o awk, indicamos qual coluna desejamos extrair.

Para isso, usaremos aspas simples, abriremos chaves e dentro delas colocaremos print $5, fechando as chaves.

df -h | grep /mnt/c | awk '{print $5}'

Essa parte do código determina de forma precisa qual coluna estamos interessados em buscar informações.

Vamos verificar se funcionou. Ao executar o comando, o terminal exibiu os 92%, que era a informação que buscávamos.

92%

Assim, obtivemos os dados sobre o uso do disco com esse comando específico. Agora, vamos copiar esse comando com "Ctrl + Shift + C" e voltar ao nosso script de monitoramento de disco para inseri-lo com vim monitoramento-disco.sh.

Agora, vamos ativar a edição no editor e criar uma variável chamada uso_disco. Atribuiremos o resultado desse comando a essa variável, utilizando "Ctrl + Shift + V". É importante lembrar que, como se trata de um comando, precisamos envolvê-lo com $().

Na próxima linha, vamos usar o comando echo para exibir a mensagem "Uso de disco em tantos por cento". Para inserir um texto usando o echo, utilizamos aspas duplas e escrevemos o texto desejado entre essas aspas.

O valor que desejamos mostrar está armazenado na variável uso_disco. Para acessar esse valor, utilizamos $uso_disco.

uso_disco=$(df -h | grep /mnt/c | awk '{print $5}')
echo "Uso de disco em $uso_disco"

Agora, podemos salvar nosso script e executá-lo para verificar o resultado.

Lembrando, antes de executar o nosso script, vamos dar permissão para execução com chmod +x monitoramento-disco.sh. Com a permissão concedida, agora podemos executar o nosso script com ./monitoramento-disco.sh.

Obtemos a nossa mensagem desejada:

Uso de disco em 92%

Vamos retornar ao editor de texto, limpar o terminal e abrir novamente o script com o comando vim monitoramento-disco.sh para fazer uma melhoria na organização do código.

Ao utilizar o comando grep, definimos /mnt/c como o ponto de montagem. No entanto, é possível que você esteja usando um sistema operacional distinto do meu, ou que seu sistema possui configurações diferentes. Isso implica que a string que você precisa utilizar pode ser distinta da minha.

Para melhorar a legibilidade e reutilização do código, é sugerido extrair essa informação para uma variável separada.

Logo abaixo do Shebang, vamos criar uma variável denominada ponto_montagem e atribuir a ela a string /mnt/c. Para isso, utilizamos aspas duplas ao redor da string. Em seguida, podemos remover a string anteriormente usada no comando grep e substituí-la pela nossa nova variável $ponto_montagem.

#!/bin/bash

ponto_montagem="/mnt/c"

uso_disco=$(df -h | grep $ponto_montagem | awk '{print $5}')
echo "Uso de disco em $uso_disco"

Após fazer essas alterações, salvamos o script e o executamos para garantir que continua funcionando corretamente.

Uso de disco em 92%

Conclusão e Próximos Passos

Encerramos esta parte relacionada à verificação do uso de disco. No entanto, foi solicitado que aprimorássemos o script para que ele também criasse logs com essas informações de uso de disco. Esse desenvolvimento será abordado na próxima etapa!

Sobre o curso Scripting: automatizando tarefas com Bash e Docker

O curso Scripting: automatizando tarefas com Bash e Docker possui 159 minutos de vídeos, em um total de 61 atividades. Gostou? Conheça nossos outros cursos de Automação de processos em DevOps, ou leia nossos artigos de DevOps.

Matricule-se e comece a estudar com a gente hoje! Conheça outros tópicos abordados durante o curso:

Aprenda Automação de processos acessando integralmente esse e outros cursos, comece hoje!

Conheça os Planos para Empresas