Paulo Henrique Rodrigues Pinheiro

Um blog sobre programação para programadores!


Trabalhando com uma versão atualizada de Perl no OpenShift

Uma forma de trabalhar com uma instalação Perl atualizada rodando no OpenShift, válido também para a GetupCloud.

Camelo voador

OpenShift

O OpenShift é o OpenStack funcionando em máquinas com RedHat na Amazon.

Ele tem sido uma ferramenta indispensável para meu trabalho. Geralmente ao iniciar um novo projeto, é com ele que começo.

Está tudo à mão. Repositório para o código, banco de dados, devops, backup, logs. E toda a configuração, após ter uma conta criada lá, pode ser feita pela linha de comando com o utilitário rhc.

A criação de conta é gratuita, o produto oferecido no menor pacote oferece uma configuração razoável, sem vencimento, e os limites são apenas de recursos. A assinatura não tem validação com cartão de crédito.

Trata-se de um ambiente perfeito para uma demonstração ou protótipo, em um ambiente que pode ser facilmente compartilhado (é possível formar uma equipe com privilégios diferenciados), com certificado SSL válido.

Sua aplicação funciona em um servidor Linux com acesso shell por ssh, e o melhor de tudo, um compilador gcc. Combine-se isso com o cartridge DIY (Do It Yourself), e podemos ter o que quisermos lá dentro.

Um servidor Apache se comunica através da porta 8080 com sua instância, não importa o que seja, desde que converse HTTP.

Linguagens e suas versões

Quando se configura um novo ambiente (aplicação), deve-se escolher o que ela vai rodar. Os cartridges WEB podem ser uma linguagem (Perl, Python, PHP, NodeJS), ou uma aplicação já instalada junto com a linguagem (como o WordPress com PHP, ou o Ghost com NodeJS) ou um banco de dados. Combinando-se vários cartridges, construimos a estrutura para nossa aplicação.

Há, atualmente, uma trinca de linguagens que se acha quase em qualquer máquina Unix: Perl, Python e Ruby. Mais recorrente é ter que instalar um compilador C do que uma dessas linguagens.

Então não há muito o que pensar nem justificar. Instalar pacotes, bibliotecas ou módulos é fácil em qualquer uma delas.

Você não encontrará, no OpenShift, as versões mais atualizadas do que gosta, mas encontrará estabilidade e usabilidade. Então, se quiser um servidor escrito em PyPy3, ou em Perl6, ou na versão dev de sua linguagem preferida, é só compilar e usar.

Existem alguns cartridges mantidos pela comunidade, mas apenas são um pouco menos atrasados que os oficiais. Quer controle, faça você mesmo!

Perl

O que fiz em Perl, pode ser feito com qualquer linguagem que compile num RedHat. Se pretende usar OpenShift e não quer ficar preso a versões não atualizadas de sua linguagem preferida, compile sua linguagem e inicie um servidor HTTP na porta indicada pela variável de ambiente $OPENSHIFT_DIY_PORT, no endereço OPENSHIFT_DIY_ADDRESS.

No momento em que esse texto está sendo escrito, o Perl no OpenShift é a versão 5.10, e a versão atual é 5.22, que contém inúmeras melhorias.

Mãos à obra

Nosso objetivo é ter o Perl mais recente, sem gambiarras (a não ser a de instalar um mais novo onde há um antigo).

Para executar esse trabalho, vamos usar ferramentas padrão do Perl. Há um excelente guia em inglês sobre como ter um Perl atualizado no OpenShift, mas fazendo algumas gambiarras, o que pretendo evitar. Mas foi a partir dessas instruções que aprendi o necessário.

Usaremos as seguintes ferramentas:

Vamos instalar o PerlBrew e compilar a mais recente versão disponível Perl (ele cuida de verificar isso), vamos configurar o ambiente para que quando nos loguemos via shell, facilmente iniciemos o ambiente com a nova versão (ou muito mais antiga, se precisar). E finalmente, vamos configurar nossos scripts de start e stop para trabalharem com o Perl novo.

Primeiro, entre no shell de sua aplicação com o seguinte comando rhc ssh NOME_APP. Então verifique a versão do Perl padrão com o comando perl -V:


This is perl, v5.10.1 (*) built for x86_64-linux-thread-multi

Copyright 1987-2009, Larry Wall

Perl may be copied only under the terms of either the  Artistic License or the
GNU General Public License, which may be found in the Perl 5 source kit.

Complete documentation for Perl, including FAQ lists, should be found on
this system using "man perl" or "perldoc perl".  If you have access to the
Internet, point your browser at http://www.perl.org/, the Perl Home Page.

PerlBrew

É preciso alterar o local padrão da nova instalação:


$ echo 'export PERLBREW_ROOT=$OPENSHIFT_DATA_DIR/perlbrew' >> $OPENSHIFT_DATA_DIR/.bash_profile
$ echo 'export PERLBREW_HOME=$OPENSHIFT_DATA_DIR/.perlbrew' >> $OPENSHIFT_DATA_DIR/.bash_profile
$ echo 'alias perlbrew=$PERLBREW_ROOT/bin/perlbrew' >> $OPENSHIFT_DATA_DIR/.bash_profile
$ source $OPENSHIFT_DATA_DIR/.bash_profile
$ echo 'export PERL_CPANM_HOME=$OPENSHIFT_DATA_DIR/.cpanm' >> $OPENSHIFT_DATA_DIR/.bash_profile

O que fizemos até aqui foi dizer onde queremos que o PerlBrew seja instalado bem como seu local de trabalho, no diretório com permissão de escrita (e que mantém o conteúdo entre deploys): $OPENSHIFT_DATA_DIR, já que o $HOME do OpenShift é read-only).

Agora é baixar e instalar:


$ wget -O - http://install.perlbrew.pl | bash

Depois de instalado, pode-se verificar que versões de Perl estão disponíveis para compilação:

Perl

$ perlbrew available
perl-5.22.0
perl-5.20.2
perl-5.18.4
perl-5.16.3
perl-5.14.4
perl-5.12.5
perl-5.10.1
perl-5.8.9
perl-5.6.2
perl5.005_04
perl5.004_05
perl5.003_07

E finalmente, instalar o Perl mais atual (ou, simplesmente, o mais adequado):


 $ perlbrew install --notest --noman perl-5.22.0
 Fetching perl 5.22.0 as /var/lib/openshift/55e5156a7628e1d752000132/app-root/data//perlbrew/dists/perl-5.22.0.tar.bz2
 Download http://www.cpan.org/src/5.0/perl-5.22.0.tar.bz2 to /var/lib/openshift/55e5156a7628e1d752000132/app-root/data//perlbrew/dists/perl-5.22.0.tar.bz2
 Installing /var/lib/openshift/55e5156a7628e1d752000132/app-root/data//perlbrew/build/perl-5.22.0 into /var/lib/openshift/55e5156a7628e1d752000132/app-root/data//perlbrew/perls/perl-5.22.0

 This could take a while. You can run the following command on another shell to track the status:

 tail -f /var/lib/openshift/55e5156a7628e1d752000132/app-root/data//perlbrew/build.perl-5.22.0.log

Após compilar e instalar, pode-se verificar se está tudo certo:


 $ perlbrew list
 perl-5.22.0

Criar um apelido para essa versão:


 $ perlbrew alias create perl-5.22.0 production
 $ perlbrew list
 perl-5.22.0
 production (5.22.0)

Ativar a nova versão e verificar:


 $ perlbrew switch production

 A sub-shell is launched with production as the activated perl. Run 'exit' to finish it.

 bash-4.1$ perl -v

 This is perl 5, version 22, subversion 0 (v5.22.0) built for x86_64-linux
 (with 1 registered patch, see perl -V for more detail)

 Copyright 1987-2015, Larry Wall

 Perl may be copied only under the terms of either the Artistic License or the
 GNU General Public License, which may be found in the Perl 5 source kit.

 Complete documentation for Perl, including FAQ lists, should be found on
 this system using "man perl" or "perldoc perl".  If you have access to the
 Internet, point your browser at http://www.perl.org/, the Perl Home Page.

 bash-4.1$

E finalmente temos nosso novo Perl!

Mas espere, é preciso mais... Precisamos instalar nossos módulos preferidos, com o CPAN. Prefiro o cpanm ao invés do gerenciador padrão.

CPANM

Basta estar no ambiente com a nova versão instalada, e usá-la para instalar o pacote:


 bash-4.1$ curl -L https://git.io/cpanm | perl - App::cpanminus
 PERL_CPANM_HOME=/var/lib/openshift/55e5156a7628e1d752000132/app-root/data//.cpanm
 bash-4.1$ curl -L https://git.io/cpanm | perl - App::cpanminus
 % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
 Dload  Upload   Total   Spent    Left  Speed
 100  296k  100  296k    0     0  1162k      0 --:--:-- --:--:-- --:--:-- 5205k
 --> Working on App::cpanminus
 Fetching http://www.cpan.org/authors/id/M/MI/MIYAGAWA/App-cpanminus-1.7039.tar.gz ... OK
 Configuring App-cpanminus-1.7039 ... OK
 Building and testing App-cpanminus-1.7039 ... OK
 Successfully installed App-cpanminus-1.7039
 1 distribution installed

Agora é possível atualizar os pacotes necessários. Para nossa aplicação exemplo, vou usar o Web::Simple:


bash-4.1$ cpanm --notest Web::Simple Starman

Depois de algumas (muitas) dependências instaladas, o trabalho no servidor acabou, agora já é possível trabalhar apenas localmente, usando o git.

Duas tarefas ainda restam:

  1. Escrever uma pequena aplicação em Perl para verificar se tudo está OK.
  2. Alterar os scripts que controlam a inicialização e finalização do serviço.
A Aplicação

Esta é uma livre adaptação do exemplo na página do módulo Web::Simple (uma boa explicação sobre esse módulo está nesse artigo do Renato Cron):


 #!/usr/bin/env perl

 package Server;
 use Web::Simple;

 sub dispatch_request {
    GET => sub {
        [ 200, [ 'Content-type', 'text/plain' ], [ 'This is the article: http://www.sysincloud.it/trabalhando-com-perl-no-openshift/' ] ]
    },
   '' => sub {
        [ 405, [ 'Content-type', 'text/plain' ], [ 'Method not allowed' ] ]
    }
 }

 Server->run_if_script;

Salvei como Server.pm na raiz de meu diretório com o clone do projeto (Trabalhando com git no OpenShift).

No diretório .openshift/action_hooks, dentro do clone do projeto, existem os arquivos start e stop.

O start deve ficar assim:


 #!/bin/bash

 source $OPENSHIFT_DATA_DIR/.bash_profile
 source ${PERLBREW_ROOT}/etc/bashrc

 perlbrew switch production

 cd $OPENSHIFT_REPO_DIR/
 nohup starman -l $OPENSHIFT_DIY_IP:$OPENSHIFT_DIY_PORT --workers 5 --pid $OPENSHIFT_DATA_DIR/server.pid Server|& /usr/bin/logshifter -tag diy &

E o stop assim:


 #!/bin/bash
 source $OPENSHIFT_CARTRIDGE_SDK_BASH

 PID=$OPENSHIFT_DATA_DIR/server.pid

 if [ ! -f $PID ]
 then
     client_result "Application is already stopped"
 else
     kill `cat $PID`
 fi

Comita, dá push e acessa:

http://diy-sysincloudit.rhcloud.com