Infra - Linux

Login automático com SSH e Automatização da instalação (deploy) e atualização de sites com Git

Veja neste artigo como criar um login automático com ssh no Linux e fazer a automatização do deploy, além de atualizar seus sites com Git.

por Thiago Belem



Um recurso muito útil para quem trabalha com sites e servidores, é o SSH (Secure Shell), que é uma forma de você acessar, remotamente, a linha de comando de um servidor e com isso fazer modificações e instalações direto no servidor, sem usar uma interface gráfica ou um painel de controle como o cPanel.

O SSH é como se fosse um acesso VNC (Virtual Network Connection) diretamente na linha de comando do servidor.

Esse recurso parece inútil quando você cuida de um site simples… Mas quando você trabalha com sites mais robustos, que precisam de modificações no servidor, instalações de plugins e módulos e etc. é muito bom usar o SSH.

Para acessar o SSH de um servidor normalmente usamos o seguinte comando:

$ ssh usuario@dominio

Após isso, é perguntado a sua senha de acesso do servidor e você está dentro e pode executar comandos do Linux para trabalhar na máquina.

A questão aqui é que a senha do SSH deve ser extremamente segura, e lembar de uma senha de 20 caracteres com letras, símbolos e números não é fácil. O que você pode fazer, é configurar o servidor para aceitar logins automáticos da sua máquina.

Vamos chamar a sua maquina de cliente (a máquina que você está usando) e servidor a máquina que você quer acessar.

Criando a chave pública no cliente

No cliente, vá até a linha de comando e digite:

$ ssh-keygen -t rsa

Você verá a seguinte resposta:

Generating public/private dsa key pair.
Enter file in which to save the key (/home/usuario/.ssh/id_dsa):

Dê ENTER sem digitar nada

Enter passphrase (empty for no passphrase):

Dê ENTER sem digitar nada

Enter same passphrase again: 

Dê ENTER sem digitar nada

Your identification has been saved in /home/usuario/.ssh/id_dsa.
Your public key has been saved in /home/usuario/.ssh/id_dsa.pub.
The key fingerprint is:
01:e0:d4:57:44:a5:5d:7c:f3:ed:bb:0d:fc:cb:2d:eb usuario@cliente
The key's randomart image is:
+--[ DSA 1024]----+
|    oo.  ++....  |
|   o  ...  o ....|
|    .  .. . .  .+|
|         .      o|
|        S      . |
|             .  .|
|              o .|
|              o+o|
|             .E**|
+-----------------+

Feito isso, você criou uma chave pública e esse arquivo ~/.ssh/id_dsa.pub pode ser enviado para o servidor ao qual você deseja se conectar que, quando você tentar fazer login, ele irá ler o arquivo e te identificar, permitindo o login automático.

Enviando a sua chave pública para o servidor

Você pode usar sFTP (FTP via SSH) ou SCP para enviar a chave pública para o servidor, veja um exemplo utilizando SCP:

$ scp ~/.ssh/id_dsa.pub USUARIO_REMOTO@SERVIDOR:/home/USUARIO_REMOTO/.ssh/

Lembrando que a parta USUARIO_REMOTO@SERVIDOR são os mesmos dados que você utiliza para login.

Feito isso, você precisa habilitar a chave pública.

Habilitando a sua chave pública no servidor

Faça login via SSH no seu servidor, e execute os seguintes comandos:

$ cd ~/.ssh/
$ cat id_dsa.pub >> authorized_keys
$ chmod 644 authorized_keys

Se o arquivo authorized_keys já existir, você pode criar o authorized_keys2 ouauthorized_keys3.

Feito isso, é so você deslogar do servidor e, da próxima vez que você tentar fazer o login [via SSH] já entrará automaticamente, sem digitar a senha!

Vale lembrar que essas instruções servem apenas para acessar servidores Linux utilizando uma outra máquina Linux.

Automatizando a instalação (deploy) e atualização de sites com Git

Repositório local

Se você já possui um repositório local, pule para o pŕoximo passo.

Tudo começa com a criação de um repositório Git simples:

$ mkdir website && cd website
$ git init
Initialized empty Git repository in /home/thiagobelem/website/.git/
$ echo 'Olá, mundo!' > index.html
$ git add index.html
$ git commit -q -m "Iniciando o repositório"

Agora que seu repositório local está pronto, o index.html foi criado e o primeiro commit feito, vamos criar o repositório remoto no ambiente de produção (servidor onde o site está/vai rodar).

Repositório remoto

Partindo do princípio que o seu site vai rodar em um servidor que você possui acesso SSH facilitado , vamos criar o repositório lá que será uma cópia do servidor local:

$ mkdir website.git && cd website.git
$ git init --bare
Initialized empty Git repository in /home/thiagobelem/website.git/

Agora começa a parte interessante.. Você acabou de criar um repositório bare!

Um repositório bare é um repositório que tem apenas os arquivos versionados, mas não inclui a pasta .git e todos os arquivos de informações e configurações do repositório. Não é um working copy directory.

Agora vamos começar a criar o git-hook que será responsável por copiar todos os arquivos - do repositório bare - para a pasta onde o site vai rodar, no ambiente de produção:

$ cat > hooks/post-receive
#!/bin/sh
GIT_WORK_TREE=/var/www/meusite.com.br git checkout -f
$ chmod +x hooks/post-receive

O git-hook post-receive será ativado sempre que o seu repositório receber atualizações (que você enviará da sua máquina) e executará os commandos que você definiu.

Veja que primeiro definimos a variável de ambiente GIT_WORK_TREE como a raíz do site e depois executamos um git checkout -f que irá mover os arquivos sem nenhum vestígio do seu repositório Git.

Agora é só voltar para a sua máquina e adicionar o repositório remoto:

$ git remote add web ssh://meusite.com.br/home/thiagobelem/website.git
$ git push web +master:refs/heads/master

Esses dois comandos irão adicionar o repositório externo ao repositório local e enviar os arquivos locais para o servidor.

Após os dois comandos o servidor vai conter uma cópia dos arquivos locais.

Atualizando os arquivos

À medida que você for trabalhando no site e quiser atualizar o servidor no ar, é so rodar o comando (após fazer o commit):

git push web

Isso irá enviar as modificações feitas para o repositório remoto.

Finalizando…

Agora você consegue atualizar o seu site no servidor de produção sem abrir FTP, sem abrir arquivos ou arrastar pastas pelo cliente de FTP… Sem nem abrir o SSH e fazer algo parecido. É só rodar o git push web e tá tudo certo!

Artigo originalmente publicado por Thiago Belem: Automatizando a instalação (deploy) e atualização de sites com Git e Login automático no SSH (no Linux)

Login automático com SSH e Automatização da instalação (deploy) e atualização de sites com Git
Thiago Belem

Thiago Belem - Tenho 23 anos e trabalho com Desenvolvimento WEB há mais de 10 anos. Atualmente moro no Rio de Janeiro e, além de trabalhar como Freelancer, sou Professor no Assando Sites, meu curso online de CakePHP.