Estou supondo que essa pergunta pareça incrivelmente trivial para alguns leitores, mas como alguém que é desenvolvedor, mas com pouca experiência em implantar aplicativos em algo que não seja um manual, acerte e espere uma maneira, espero que você entenda que é bastante assustador ver o número de diferentes abordagens e ferramentas que existem, para que eu pudesse seguir alguns conselhos para começar na direção certa.
Sou desenvolvedor, agora apenas no meu tempo livre, que é limitado. Até agora, eu trabalhei com Java, construindo webapps e fiquei razoavelmente feliz em implantar um arquivo de guerra em um ambiente Tomcat que mantém as coisas bem encapsuladas.
Agora estou trabalhando em Python e Django, mas à medida que me aproximo do ponto em que preciso implantar, desejo configurar um fluxo de trabalho de devops sólido para automatizar o máximo possível e garantir que seja possível implantar de maneira confiável, mas, considerando que meu Caso de uso seja relativamente simples, desejo evitar o aprendizado de um grande conjunto de ferramentas com excesso de engenharia para minhas necessidades e que exige um grande investimento de tempo. Prefiro usar a codificação do meu aplicativo.
Portanto, estou procurando um meio termo que permita implantar e gerenciar meus aplicativos de maneira confiável, sem investir muito tempo configurando e aprendendo um grande ecossistema de devops.
Mais alguns detalhes ...
Contexto
- Desenvolvo em um Mac, usando PyCharm para criar o Django 2, Python 3.
- Eu uso o git (mas não no github) para gerenciar a versão do software.
- Eu me sinto confortável com outras linguagens e linguagens de script e escrevi alguns scripts bash (provavelmente bastante amadores), embora eu não goste do bash. Eu também me envolvi com o Perl, que percebi que não é realmente um idioma para se envolver (ou seja, você precisa gastar tempo aprendendo adequadamente)
- Pretendo implantar em um ambiente VPS, provavelmente DigitalOcean.
- Meu aplicativo não é de missão crítica, mas é importante que eu saiba se o site está inoperante e, se isso acontecer, preciso recuperar de maneira confiável, seja reiniciando o aplicativo, reiniciando o servidor ou movendo-se para outro servidor ( ou outro).
Requisitos Específicos
Capacidade de configurar um novo ambiente para receber o aplicativo.
Até o momento, enquanto estou aprendendo, isso tem sido manual e, toda vez que o faço, comecei do zero com um novo Droplet. Eu gostaria que isso fosse muito mais simples (automatizado), para que, se eu tiver que configurar um novo ambiente em uma emergência, eu possa fazê-lo de maneira confiável.
Capacidade de implantar o aplicativo em um ambiente de armazenamento temporário o mais idêntico possível ao vivo, idealmente como um processo automatizado acionado por um push git usando uma abordagem de integração contínua (o que nunca fiz antes).
Capacidade de "pressionar o botão" quando estiver satisfeito com o aplicativo no ambiente de preparação para enviar automaticamente para um ambiente ao vivo.
Maneira de monitorar o site (basta fazer uma pesquisa em uma página)
Maneira de mudar o site ativo para outro servidor se eu precisar me recuperar de uma falha de aplicativo ou servidor no site ativo. Eu acho que talvez uma abordagem azul-verde funcione para mim?
O que eu tentei ou considerei?
Configuração manual do ambiente ao vivo com o aplicativo Django e copie manualmente uma nova base de código para ele quando houver uma alteração. Isso parece propenso a erros humanos e temo cometer um erro em uma implantação, causando uma falha irrecuperável.
Docker. Admito que, quando descobri sobre o Docker, parecia um sonho tornado realidade, mas depois de um pouco de experiências e pesquisas, fico assustada com o quanto preciso aprender e saber para colocar isso em funcionamento e gerenciá-lo. Pode ser que valha a pena, porque, uma vez que está funcionando, é um risco muito baixo, mas no momento parece um investimento maior do meu tempo do que eu esperava.
Scripts Bash. Use-os para configurar o ambiente original e para tarefas específicas, como atualizar o aplicativo. Minha preocupação com isso é que os scripts serão códigos que precisam ser testados e temo que levaria muito tempo para criar um conjunto de ferramentas confiável dessa maneira.
Examinei as opções da Digital Ocean para endereços IP flutuantes e a capacidade de ter dois servidores para uma abordagem "verde azul" que parece bastante sensata. Se eu seguir esse caminho, ainda preciso automatizar a implantação.
Então ... Estou procurando conselhos sobre uma abordagem de devops que encontre o equilíbrio certo entre minimizar o risco (por exemplo, o risco de interromper o aplicativo ao vivo com uma atualização ou o risco de não conseguir se recuperar de uma falha) e minimizar o tempo investimento que preciso fazer para configurar os ambientes e o fluxo de trabalho.
fonte
As respostas postadas foram muito úteis para que eu pudesse repensar meu problema e várias abordagens. Ainda não implementei uma solução, mas decidi por uma abordagem, por isso estou documentando e selecionando-a como resposta. Em resumo, é o seguinte:
Minha abordagem escolhida
Considerações que conduziram essa abordagem
Docker: Eu decidi contra. Embora eu leve a sério as respostas (obrigado @Levi e @Dan) que dizem que eu deveria voltar a visitar e que não deveria ser tão ruim, tive muitas experiências no passado ao embarcar em algo novo e perceber que caí por uma toca de coelho que consome tempo e leva uma idade para continuar. Eu acho que seria diferente se eu estivesse trabalhando com outra pessoa, mas como alguém trabalhando completamente sozinho a cada minuto é precioso.
Máquinas virtuais: eu realmente não tinha pensado nisso até começar a trabalhar com alguns dos tutoriais do Docker que usam VMs para demonstrar a funcionalidade Swarm. A idéia de poder criar um ambiente totalmente novo, do qual tenho controle total, é muito atraente.
Criação de scripts: solicitado pela resposta útil de @ AnoE Eu fiz um pouco mais de pesquisa e parece que o Python é reconhecido como uma opção viável para criação de scripts. para aprender algo novo para o meu script, será um conhecimento que eu possa usar ao escrever meu aplicativo)
Eu atualizarei uma vez que tenha feito algum progresso nisso e, se der terrivelmente errado, reconhecerei que talvez tenha feito a escolha errada!).
Atualização em 20 de outubro de 2018.
Decidi escrever um script Python, mas isso geralmente envolvia invocar um comando bash do Python e, em seguida, obter a resposta novamente. Achei isso bastante adicionado ao tempo de desenvolvimento. Depois de algumas semanas de progresso lento, procurei em outro lugar. Admito que posso ter me aproximado errado, mas precisava de algo que fosse mais rápido.
Acabei optando pelo Vagrant / Ansible / VirtualBox e, depois de mais meses do que eu gostaria de admitir, conseguiu algo que funcionou bem, mas depois de muito trabalho aprendendo algumas novas habilidades (o Vagrant e o Ansible eram completamente novos para mim). Em seguida, apliquei o script Ansible para provisionar um DigitalOcean Droplet e constatei que isso funcionava muito bem. Tornei-me fã do Ansible, mas, embora concorde (com os revisores) que é relativamente fácil de usar, ainda é um novo paradigma e uma curva de aprendizado bastante acentuada.
No momento da redação deste artigo, provisionei duas gotículas separadas no DigitalOcean em uma configuração azul esverdeada, usando os endereços IP flutuantes do DO para alternar entre as duas, e em cada um o aplicativo está dentro de uma cópia de trabalho do git, então só preciso atualizar o Mestre para atualizar um ambiente.
Estou com um problema para fazer com que os IPs flutuantes funcionem como eu esperava, mas espero resolver isso em breve e depois terei um ambiente de DevOps funcional.
A grande vantagem dessa abordagem é que, da maneira como o Ansible funciona, depois de ter algo funcionando, é relativamente fácil fazê-lo funcionar em um ambiente diferente e isso pode não ser tão fácil de obter com um script python (ou pelo menos você precisa criar isso é trabalho extra).
Eu acho que a grande lição é que as coisas demoram mais do que eu esperava e aprender uma nova tecnologia sempre traz incógnitas desconhecidas. Isso não deveria ser uma surpresa para mim - mas sempre é e, como desenvolvedor solitário, isso acontece muito comigo.
fonte