{"id":18499549,"url":"https://github.com/gusinacio/nexxera-devops-test","last_synced_at":"2026-04-20T19:02:42.309Z","repository":{"id":71174076,"uuid":"279994847","full_name":"gusinacio/nexxera-devops-test","owner":"gusinacio","description":"DevOps test for joining Nexxera","archived":false,"fork":false,"pushed_at":"2020-07-16T18:43:45.000Z","size":21,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-05-14T05:38:30.583Z","etag":null,"topics":["ansible","docker","dockerfile","python"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/gusinacio.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2020-07-15T22:33:14.000Z","updated_at":"2023-02-10T17:56:19.000Z","dependencies_parsed_at":"2023-07-09T07:01:43.705Z","dependency_job_id":null,"html_url":"https://github.com/gusinacio/nexxera-devops-test","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/gusinacio/nexxera-devops-test","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gusinacio%2Fnexxera-devops-test","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gusinacio%2Fnexxera-devops-test/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gusinacio%2Fnexxera-devops-test/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gusinacio%2Fnexxera-devops-test/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/gusinacio","download_url":"https://codeload.github.com/gusinacio/nexxera-devops-test/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gusinacio%2Fnexxera-devops-test/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32061251,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-20T11:35:06.609Z","status":"ssl_error","status_checked_at":"2026-04-20T11:34:48.899Z","response_time":94,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["ansible","docker","dockerfile","python"],"created_at":"2024-11-06T13:46:27.049Z","updated_at":"2026-04-20T19:02:42.271Z","avatar_url":"https://github.com/gusinacio.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Nexxera DevOps\n\nEste projeto tem como intuito de criar soluções a problemas propostos pela equipe de DevOps Nexxera. Você irá encontrar scripts de automção `Ansible` e informações de como replicar os experimentos. \n\n## 1. Deploy de Updates via FTP\n\nPara esse problema temos o objetivo de pegar um arquivo com recebimento diário em um `ftp_server` e fazer Deploy dessa aplicação em um `target_server`.\n\nO primeiro passo que devemos fazer é escolher onde iremos fazer a detecção de novos arquivos no FTP. Ela poderia ser feita de algumas maneiras\n\n- Cronjob em uma instância Linux\n    \n    O cronjob poderia ser fácilmente colocado junto com o FTP caso fosse um SFTP e tivessemos acesso a ele. No pior dos casos, existiria uma instância ligada pura e exclusivamente para isso. Essa solução seria ruim, pois estamos deixando a maior parte do recurso computacional e memória ocioso para algo que vai ser executado apenas 1 vez ao dia.\n\n- AWS Lambda + AWS Cloudwatch Events\n\n    O problema da solução anterior é resolvido com uma execução Serverless. Neste caso estou usando AWS Lambda + AWS Cloudwatch Events como exemplo, mas poderia ser qualquer serviço que execute esse propósito: executar uma aplicação, cobrar apenas pela execução e dar meios de executar periódicamente. Com isso economizamos recursos computacionais e consequentemente financeiros.\n\n- Job periódico no CI/CD (Jenkins/Gitlab CI/ouutros)\n\n    A terceira opção é utilizar um CI/CD que, preferencialmente, já está instalado e é usado para outras operações e com isso apenas adicionamos um Job. O CI/CD ficará encarregado de executar nosso script diáriamente e com isso utilizamos recursos que já estão disponíveis pronto para esse tipo de execução.\n\nAlgumas perguntas que devemos responder é: `Essa aplicação pode ficar fora do ar por um breve momento?` Se a resposta for não, temos que responder `Posso executar duas instâncias dessa aplicação ao mesmo tempo por um breve momento?`.\n\nTemos que respondê-las para definir como será feita a atualização. Normalmente para uma aplicação não-crítica iremos desligar a aplicação que está rodando, realizar a update e reiniciar a aplicação. Porém, existe um tipo de deployment chamado blue/green(também chamado de red/black) onde em um determinado momento temos as duas versões rodando (antiga e nova) e se tudo ocorreu bem, desativamos a versão antiga assim ficando apenas com a nova. Esse tipo de update geralmente é feita em aplicações que tem um balanceador de carga na frente para não perder nenhuma requisição nesse meio tempo.\n\nNesse caso irei considerar que a aplicação `NÃO` é crítica e/ou o deploy ocorrerá em um horário que a aplicação não é necessária.\n\nCom o problema de quando e onde vai ser a execução, temos que definir como vai ser o empacotamento da aplicação recebida pelo FTP. Primeiro de tudo, iremos criar uma imagem de Docker para essa aplicação ou não? Quero dizer, podemos executar a aplicação de forma direta nomeando o processo, ou até mesmo através do `systemctl` do Linux e transformar a aplicação em um serviço mas, na minha opinião, a melhor forma é fazer uma imagem `Docker` e executar em `containers`.\n\nAlém de ser uma maneira muito mais fácil pois não é necessário se preocupar em qual ambiente está sendo executado o container, também é muito simples utilizar orquestradores de container e configurar detalhes como quantidade de réplicas de uma maneira simples.\n\n### Ferramenta utilizada\n\nEu poderia utilizar Shell Script como maneira de automatizar esse processo, porém eu prefiro utilizar a ferramenta `Ansible` que além de executar um script ela tenta manter o estado que o script está, ou seja, se em algum momento algo for alterado ela volta ao estado desejado. \n\n### Solução\n\nCom `Ansible` irei conectar no servidor destino, instalar Docker, criar uma imagem e instalar o container.\n\n### Pré-requisitos\n\n- Instalar Ansible\n- Configurar dados do servidor destino em `hosts`\n- Instalar roles externas com o comando ```ansible-galaxy install -r requirements.yml```\n### Variáveis:\n\n- `app_name`: nome da aplicação\n- `file_name`: nome do arquivo (poderia ser facilmente estendido para *prefix_file_name*)\n- `ftp_url`: link para ftp. ex: ftp://user:password@ftpserver/\n\nPara mudar as variáveis, você pode alterar direto no arquivo ou sobreescreve-las adicionando o parametro no comando abaixo `--extra-vars='\u003cvar_name1\u003e=\u003cvar1\u003e \u003cvar_name2\u003e=\u003cvar2\u003e'`\n\n### O que o script faz:\n\n1. Conecta ao servidor destino\n2. Faz download do arquivo de update do FTP\n3. Instala o Docker\n4. Cria uma imagem docker com o arquivo\n5. Cria/atualiza um container com a imagem nova\n6. Limpa containers e imagens\n\nPara executar o script é só digitar os seguintes comandos:\n```\n$ ansible-playbook -i hosts main.yml\n```\n\nApós fazer uma update em `hello_word_java`, commitei e enquanto rodava o script tirei print do que acontecia nas logs:\n\n![](https://i.imgur.com/WTJuAun.png)\n\n## 2. Openshift Deploy Nginx\n\nPrimeiro de tudo é necessário instalar o Minishift e isso depende de qual sistema operacional você está usando.\n\nNo meu caso, eu uso Arch Linux, porém irei linkar os tutoriais de instalação caso seu sistema operacional seja diferente.\n\n1. Configurar ambiente de virtualização\n\n    Siga os passos em: https://docs.okd.io/3.11/minishift/getting-started/setting-up-virtualization-environment.html dependendo do seu OS.\n\n    No final do processo, inicie o `libvirtd`:\n    ```\n    $ sudo systemctl start libvirtd\n    ```\n\n    Esse ultimo passo é necessário sempre que for iniciar o Minishift a não ser que você habilite o serviço a iniciar junto com o computador. Se você desejar fazer isso é só digitar ``` sudo systemctl enable libvirtd```\n\n2. Instalar Minishift.\n   \n   Siga as instruções em https://docs.okd.io/3.11/minishift/getting-started/installing.html.\n\n   No geral, você irá instalar o pacote `minisfhit` no seu gerenciador de pacotes.\n\n3. Iniciando o Minishift.\n    \n    Para iniciar a máquina virtual, digite o seguinte comando:\n    ```\n    $ minishift start\n    ```\n    Ele irá checkar todos os pacotes, configurar a aplicação, docker, a maquina virtual, openshift, rede, etc. Caso ocorra algum erro, verifique se tudo foi instalado corretamente, e todos os pré-requisitos estão rodando normalmente.\n\n    Após a inicialização, você vai querer utilizar o comando `oc` para se comunicar com o Openshift. Para fazer isso basta executar o seguinte comando:\n    ```\n    $ eval $(minishift oc-env)\n    ```\n    Com isso, ele irá configurar o PATH na sessão do terminal que você ta rodando e assim permitir você ir para os próximos passos.\n\n4. Iniciando o container com Nginx.\n   \n   Resolvi criar um Dockerfile nesse respositório que adiciona o arquivo `info.json` no root do nginx. Por esse motivo, fica fácil de criar um container usando o Github.\n\n   Para criar um projeto e uma nova aplicação rodando nginx com o website estático, rode o seguinte comando:\n    ```\n    $ oc new-app https://github.com/flametuner/nexxera_devops.git --strategy=docker --context-dir=openshift --name=nexxera\n    ```\n    Podemos ver o serviço rodando usando os comandos ```oc status``` e ```oc get pods```. Porém para acessar ele, precisamos expor a porta, que no caso do Dockerfile é a 8081:\n    ```\n    $ oc expose svc nexxera --port=8081\n    ```\n    Com a porta exposta, a coisa mais simples a se fazer para acessar no navegador é digitar o seguinte comando e acessar o arquivo `info.json`:\n    ```\n    $ minishift openshift service nexxera --in-browser\n    ```\n\n    No meu caso, a URL ficou http://nexxera-myproject.192.168.42.232.nip.io/info.json\n\n    ![](https://i.imgur.com/TgyTpFp.png)\n\n## 3. Alertas via Email\n\nNormalmente em DevOps grande parte do trabalho se dá em monitoramento, e uma parte essencial do monitoramento é ser alertado quando algo estiver acontecendo.\n\nExistem ferramentas muito mais robustas e específicas pra isso. Eu, por exemplo, utilizaria uma combinação de Prometheus + Grafana. Com eles, o Prometheus funciona como uma espécie de agregador de dados e o Grafana apresenta esses dados e provém alertas.\n\nMas, decidido que seria uma aplicação, teria que ser escolhido como seria feito o serviço de email. Normalmente eu optaria por usar AWS SES ou SendGrid pois dá uma segurança maior.\n\nEu decidi por utilizar Python e o SMTP do Gmail pois são ferramentas fácies e qualquer um, seguindo esse repositório como tutorial, pode utiliza-las e enviar emails.\n\nPrimeiramente, por questões de segurança, é dificil utilizar a senha padrão do Google então siga este tutorial para conseguir uma senha de app: https://support.google.com/accounts/answer/185833?hl=pt-BR\n\nDepois é só executar o seguinte comando, digitar a URL da seção anterior, seu email e sua senha de app:\n\n```\n$ python send_email/alerts.py\n```\n![](https://i.imgur.com/mP20iUK.png)\n\n![](https://i.imgur.com/nTjnjdh.png)\n\nA aplicação checka a cada 15 segundos os status dos serviços e alerta via email caso o serviço mude de estado. A aplicação também salva o estado atual em um arquivo `info.json`. Assim, mesmo que a aplicação seja reiniciada, não será recebido alertas desnecessários.\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgusinacio%2Fnexxera-devops-test","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fgusinacio%2Fnexxera-devops-test","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgusinacio%2Fnexxera-devops-test/lists"}