Não reinvente a roda você também

Preâmbulo: Recentemente coloquei no ar o FollowUpTime, que como já disse em outros posts é um sistema de monitoração para redes e servidores. Como podem imaginar, um bocado de linhas de código está envolvida num sistema assim e a conta só do engine principal passa das 90 mil linhas. Isso sem incluir templates, javascripts, etc. O sistema é composto de duas partes: Uma que roda num servidor principal gerenciando a maior parte das tarefas e as “probes”. As probes são pequenos scripts que recebem instruções sobre hosts a serem testados e respondem para o servidor principal com o tempo de resposta, um OK ou um FAIL. Simples assim. São essas probes que temos espalhados por vários cantos do planeta. Porém quando recebi a probe dos desenvolvedores me vi com um pequeno, mas incoveniente problema. Os desenvolvedores realmente optaram pelo princípio KISS. Eles me entregaram uma excelente probe que fazia o que era necessário. E nada mais. Eu tinha nas mãos um daemon que rodava em foreground e jogava mensagens para stdout e stderr e nada mais. Eu não me demorei e ataquei o problema da forma errada, pensando como um programador e não como um administrador Unix. E acabei reinventado a roda. Introdução – O problema Quando percebi o que eu tinha nas mãos logo pensei nos problemas que eu precisava resolver: Preciso iniciar o daemon sempre que der boot na máquina Preciso ser capaz de rodar em daemon em background, ou vai me zoar a seqüencia de boot Posso precisar parar/reiniciar/iniciar manualmente este daemon Se o processo morrer eu tenho que ser notificado e que, de preferência, ele seja reiniciado automaticamente E sim, esse processo não deve rodar como root Já velhaco de Linux logo pensei num script para ser colocado em /etc/init.d/ que ia resolver boa parte dos meus problemas. Com uma combinação bonita de bash scripting, várias ferramentas e comandos Linux que só se conhece depois de muito tempo de casa (como nohup, pidof, &) e gambiarras na crontab eu consegui. Consegui reinventar a roda. Não vou entrar em detalhes da solução que fiz, pois apesar de 100% funcional não era nem de perto tão bonita quanto: A solução – Daemontools Nosso caro amigo D.J.B, autor do famoso Qmail também já passou por um problema parecido com o meu, mas ao invés de criar um solução simples para resolver um problema pontual ele foi mais longe. Ele criou uma solução global que atende o problema dele, o meu e provavelmente também o seu. Na página oficial do daemontools tem uma tabela, que traduzo abaixo, comparando a ferramenta dele com outras abordagens (incluindo a minha, que utilizava init.d): <td width="86" align="center" bgcolor="#2300dc"> <strong><em><span style="font-family: Verdana; color: #ffffff;">inittab</span></em></strong> </td> <td width="86" align="center" bgcolor="#2300dc"> <strong><em><span style="font-family: Verdana; color: #ffffff;">ttys</span></em></strong> </td> <td width="86" align="center" bgcolor="#2300dc"> <strong><em><span style="font-family: Verdana; color: #ffffff;">init.d</span></em></strong> </td> <td width="86" align="center" bgcolor="#2300dc"> <strong><em><span style="font-family: Verdana; color: #ffffff;">rc.local</span></em></strong> </td> <td style="border-right: 1px solid #000000;" width="86" align="center" bgcolor="#2300dc"> <strong><em><span style="font-family: Verdana; color: #ffffff;">/service</span></em></strong> </td> <td style="border: 1px solid #000000;" align="center"> <span style="font-family: Verdana;">Não</span> </td> <td style="border: 1px solid #000000;" align="center"> <span style="font-family: Verdana;">Não</span> </td> <td style="border: 1px solid #000000;" align="center"> <span style="font-family: Verdana;">Sim</span> </td> <td style="border: 1px solid #000000;" align="center"> <span style="font-family: Verdana;">Não</span> </td> <td style="border: 1px solid #000000;" align="center"> <span style="font-family: Verdana;">Sim</span> </td> <td style="border: 1px solid #000000;" align="center"> <span style="font-family: Verdana;">Não</span> </td> <td style="border: 1px solid #000000;" align="center"> <span style="font-family: Verdana;">Não</span> </td> <td style="border: 1px solid #000000;" align="center"> <span style="font-family: Verdana;">Não</span> </td> <td style="border: 1px solid #000000;" align="center"> <span style="font-family: Verdana;">Não</span> </td> <td style="border: 1px solid #000000;" align="center"> <span style="font-family: Verdana;">Sim</span> </td> <td style="border: 1px solid #000000;" align="center"> <span style="font-family: Verdana;">Sim</span> </td> <td style="border: 1px solid #000000;" align="center"> <span style="font-family: Verdana;">Sim</span> </td> <td style="border: 1px solid #000000;" align="center"> <span style="font-family: Verdana;">Não</span> </td> <td style="border: 1px solid #000000;" align="center"> <span style="font-family: Verdana;">Não</span> </td> <td style="border: 1px solid #000000;" align="center"> <span style="font-family: Verdana;">Sim</span> </td> <td style="border: 1px solid #000000;" align="center"> <span style="font-family: Verdana;">Não</span> </td> <td style="border: 1px solid #000000;" align="center"> <span style="font-family: Verdana;">Não</span> </td> <td style="border: 1px solid #000000;" align="center"> <span style="font-family: Verdana;">Não</span> </td> <td style="border: 1px solid #000000;" align="center"> <span style="font-family: Verdana;">Não</span> </td> <td style="border: 1px solid #000000;" align="center"> <span style="font-family: Verdana;">Sim</span> </td> <td style="border: 1px solid #000000;" align="center"> <span style="font-family: Verdana;">Sim</span> </td> <td style="border: 1px solid #000000;" align="center"> <span style="font-family: Verdana;">Sim</span> </td> <td style="border: 1px solid #000000;" align="center"> <span style="font-family: Verdana;">Não</span> </td> <td style="border: 1px solid #000000;" align="center"> <span style="font-family: Verdana;">Não</span> </td> <td style="border: 1px solid #000000;" align="center"> <span style="font-family: Verdana;">Sim</span> </td> <td style="border: 1px solid #000000;" align="center"> <span style="font-family: Verdana;">Não</span> </td> <td style="border: 1px solid #000000;" align="center"> <span style="font-family: Verdana;">Não</span> </td> <td style="border: 1px solid #000000;" align="center"> <span style="font-family: Verdana;">Não</span> </td> <td style="border: 1px solid #000000;" align="center"> <span style="font-family: Verdana;">Não</span> </td> <td style="border: 1px solid #000000;" align="center"> <span style="font-family: Verdana;">Sim</span> </td> Dá para perceber que o cara pensou em tudo e não tem porquê reinventar a roda. Vamos utilizar o daemontools! ...

July 1, 2009 · Eri

Backup LMV via rede (GOA)

Isso é um artigo GOA – Gambiarra Oriented Architecture – Siga sob seu próprio risco. A situação é a seguinte: Você tem uma partição LVM que precisa ser backupeada ASAP em outro servidor na rede. Você tem pouco espaço disponível e precisa disso para ontem. Nào tema! O pré-requisito é que seu volume group deve ter de espaço livre o mesmo ou mais do que o uso real da partição. ...

June 24, 2009 · Eri

Desafio do Beakman – Resposta

As respostas no post e via email que o pessoal deu foram boas, mas só o Silvio chegou perto da respostas certa. Em algum curso por onde passei um professor/instrutor disse: Não se automatiza o caos. Primeiro arrume as coisas e depois automatize-as. O problema aqui é essa zona de senhas. O correto é que cada pessoa tenha seu próprio usuário e senha e virar root seja feito utilizando-se o sudo. Como um quebra-galho enquanto eu preparo o ambiente para mudanças mais profundas o meu scriptzin mesmo quebra o galho. Mas jamais caia na tentação de automatizar totalmente o caos. Porquê ai fica cômodo demais. E se está cômodo, porquê mexer? ...

June 18, 2009 · Eri

Novo trampo – primeiras impressões

E hoje comecei no Canadian Trampo 3.0 e as primeiras impressões são muito boas. A infra-estrutura proporcionalmente ao tamanho da empresa é bem grande. Como fazemos host de aplicações para clientes e o número de clientes é grande acaba que temos mais servidores do que funcionários na empresa. 🙂 Com exceção de dois servidores Windows 2003 (que até o momento não me arrisquei a perguntar quem é o “pai”, mas acho que sou eu mesmo) o resto é tudo nosso good old fellow, o Linux. ...

June 8, 2009 · Eri

Discos SCSI a quente no Linux

Hoje precisei adicionar um disco numa máquina e fiquei pensando que talvez desligar a máquina não fosse necessário. Dito e feito. Ta aí o procedimento, desde que o harware suporte, lógico. Eu sabia que o novo disco ia estar na mesma controladora que o primeiro, então: Tadááá… só mandar um fdisk e mkfs e o disco está pronto para usar. ...

May 6, 2009 · Eri

Ainda não consigo acostumar

Eu perdi a conta do número de projetos envolvendo grandes migrações de sistema que participei. Como eu trabalhava no time de transição de projetos de outsource de uma grande empresa de IT isso faz todo sentido, óbvio. Então deixa eu explicar como funciona um projeto, não importa se grande ou pequeno, numa empresa assim – e consequentemente como eu estava acostumado: Um grupo de arquitetos de soluções conversa com o cliente para entender as necessidades, o ambiente atual e os objetivos Os TSA (Technical Solution Architects) montam o budget, estimam as horas necessárias, tamanho da equipe e tecnologias a serem usadas O Executivo da conta fazia uma requisição para o time de outsourcing pedindo um gerente de projetos, que por sua conta entra em contato com cada gerente de área e avisa quantos recursos vai precisar e quantas horas de cada para o projeto. É marcada uma reunião de kickoff interna onde o gerente de projetos e os TSA explicam o projeto. O GP escolhe um dos profissionais técnicos (de qualquer uma das áreas) para ser o líder técnico. Todos os envolvidos passam seus contatos para o GP (incluindo telefone celular e de casa). Uma lista telefonica pro projeto é criada e distribuida a todos os envolvidos. Todo mundo sabe o seu papel e o papel dos outros. Qualquer problema deve ser endereçado diretamente entre os técnicos, exceto em caso de dificuldades maiores ou pendência de decisão, situações onde pode-se envolver o GP. Todas as N fases do projeto pré-migração são executadas Duas semanas antes da migração final o GP, o líder técnico e todos os técnicos envolvidos no projetos tem que comparecer a uma reunião com o time de change management e risk management. Sabatina é o termo que me vem à cabeça. Experimenta não ter algo definido ou ter alguma coisa pendente e você vai ser publicamente execrado, seu gerente contactado e adeus bônus (best case scenario) ou adeus emprego (worst case scenario) No dia da migração você sabe quando começa, mas não quando termina. Enquanto a migração não tiver sido 100% concluída ninguém volta pra casa, ninguém dorme, ninguém escapa. Dê um beijo na esposa e lembre-a que não adianta ligar perguntando que hora você volta. No máximo pode perguntar que dia. Numa dessas eu varei 32 horas acordado, trabalhando. Se algum time termina a parte deles e vai embora e você percebe que tem algo faltando ou errado, não interessa que o nego passou 58 acordado trabalhando. Ele pode ter acabado de chegar em casa e deitado na cama, mas você vai ligar pro celular dele, depois pra casa dele e depois pro gerente dele até conseguir falar com o cara. Se nem o gerente do cara conseguir falar com ele, ele vai ter que parir um outro técnico que conheça o sistema e esteja familiarizado com o projeto. Fod**-se. Problema dele. O Projeto termina, todo mundo ganha prêmio, bônus, almoço em churrascaria e é publicamente parabenizado durante as reuniões departamentais ou nas “all hands meetings” Acelera para os dias atuais. ...

March 26, 2009 · Eri

Restringindo acesso via SFTP

Restringir acesso de um usuário a seu diretório home usando o ProFTP já virou carne-de-vaca, então vou colocar um dica diferente aqui: Como manter seus usuários restritos usando SFTP. Atenção: Não estou falando de FTPS (FTP over SSL). O primeiro requisito é ter um servidor OpenSSH pelo menos na versão 4.9p1. Tanto meu Ubuntu 8.10 quanto meu OpenSuSE 11.1 vieram com pacotes superiores a essa versão, mas infelizmente o Red Hat Enterprise 5.3 não. ...

March 5, 2009 · Eri

100% seguro

Talvez os 3 leitores não-geeks deste blog (de um total de 5 leitores) não saibam, mas quando você apaga um arquivo do seu computador na verdade você não apagou nada. Ele continua lá, do mesmo jeito que estava. A única diferença é que a partir de agora o espaço que ele ocupava agora é visto como disponível pelo computador, de forma que quando você precisar criar um novo arquivo ele pode eventualmente usar o mesmo espaço que estava sendo utilizado pelo que foi removido. ...

February 19, 2009 · Eri

Código de status

Uma vez, ainda no Brasil, recebi uma ligação de uma usuária falando que estávamos com problema no servidor. Ela foi tão categórica na afirmação que até me surpreendi, já que ela era uma auxiliar de RH e não uma pessoa técnica. Mas mesmo assim perguntei o que estava acontecendo e como ela chegou a essa conclusão. – Ué… Tem uma mensagem na tela falando que o servidor interno está com erro. ...

February 17, 2009 · Eri

Reclamação anual

Sexta-feira antes de ir embora cliquei no ícone de updates do Ubuntu. Quase 50 atualizações pendentes, apesar de eu executar semanalmente os upgrades necessários. Tudo bem, atualizar é preciso. Inclusive eu tinha um atualização de kernel instalada fazia umas três semanas, mas ainda não tinha dado boot. Aproveitei o fiz. Fui embora na sexta com a máquina 100% atualizada. Cá chego eu hoje de manhã e dou de cara com isso: ...

February 16, 2009 · Eri