martes, abril 08, 2014

Git sobre Linux EC2 Amazon

Introducción

La siguiente información se basa en la documentación de git-scm.com y se asume acceso exitoso a una instancia Linux EC2 Amazon.

Aquí haremos una secuencia diferente a la propuesta por la documentación de GIT, partiremos por el capítulo 4 de la documentación, teniendo como conocimiento básico el crear un repositorio, subir un cambio y clonar el proyecto localmente.

El objetivo a conseguir es poder iniciar un proyecto nuevo desde un repositorio remoto y trabajar en forma local desde cero. Donde "remoto" hará referencia al repositorio git en EC2 Amazon ("origin" en terminología git) y "local" hace referencia al repositorio en el ambiente de trabajo ("workspace").

Pasos a Seguir

De acuerdo a la documentación, de los cuatro protocolos, configuraremos el sistema para usar el protocolo SSH, esto porque es la forma principal de acceso a EC2 Amazon, mediante el uso del par de llaves pública y privada.

En el Capítulo 4.2, sección SSH Access, se indican tres posibles formas de establecer conexiones hacia Git. Una es usando LDAP, otra es crear múltiples usuarios en el servidor, pero eso implicaría mantener muchas cuentas. Y otra manera, que es la que configuraremos aquí, es tener un sólo usuario llamado "git" que es utilizada por otros usuarios. Aquí surge la pregunta: Si sólo existe un usuario "git", ¿cómo se diferenciará el aporte de cada usuario al proyecto? La respuesta radica en la configuración de git en cada usuario, esa es la información que viaja. Todos los usuarios pueden compartir la misma llave privada (no es la idea) o cada usuario genera su par de llaves pública y privada. El proceso será el siguiente:

1) Instalación básica de Git en Linix EC2 Amazon.
2) Se creará un usuario "git" en el servidor EC2 que utilice la misma llave de acceso del usuario por defecto de EC2.
3) Se creará un proyecto remoto vacío. Se clonará este proyecto desde el ambiente local. Se creará un archivo "readme.txt" que se agregará al repositorio. Se clonará el proyecto nuevamente en otro lugar para apreciar los cambios.
4) Se creará otro usuario de pruebas que se conecte al repositorio Git. Se deberá crear una llave privada y una pública. Al crear la llave, se puede decidir aquí qué formato de identificación tendrá cada usuario, si es que se quiere tener un estándar. Por ejemplo, identificar a cada usuario por su nombre, su email, su nombre.apellido, etc.
5) La llave pública se almacena como "llave autorizada" para el usuario Git en el servidor.
6) Se hará un cambio en el archivo del proyecto con el nuevo usuario.

Instalando Git

Ya que nos conectamos con el usuario por defecto a EC2, instalamos con "sudo" el paquete de git. Utilizamos "yum" por ser la opción en Linux EC2 Amazon.
sudo yum install git-core
Configuramos información básica para Git, en este caso, el administrador del repositorio remoto que creará el proyecto. Configuramos el nombre (user.name), el email (user.email) y luego verificamos la información. Ejecutar los siguientes tres comandos (como ejemplo, van mis datos)
git config --global user.name "Javier Villalobos Arancibia"
git config --global user.email javier.villalobos.arancibia@gmail.com
git config --global -l

Creando el Usuario Git

Nos guiamos por la documentación para administración de usuarios en EC2 Amazon para crear el usuario "git" en el servidor remoto, seguimos tal cual los pasos que allí se indican hasta el paso 2.e, luego, probaremos la conexión de este usuario con el par de llaves pública y privada del usuario "ec2-user". Para esto, necesitamos concatenar la llave pública del usuario ec2-user hacia el archivo authorized_keys del usuario "git".

Estando como usuario "ec2-user" copiamos el archivo authorized_keys de ese usuario al directorio /tmp/ del servidor.
cp authorized_keys /tmp/
Luego cambiamos los permisos del archivo para que el usuario "git" pueda tener acceso a él.
cd /tmp
chmod 666 authorized_keys
Ahora, cambiamos a usuario "git", nos situamos en su directorio ".ssh" y agregamos la llave pública de "ec2-user"
sudo su - git
cd /home/git/.ssh
cat /tmp/authorized_keys >> authorized_keys
Deberíamos probar la conexión a EC2 con el usuario "git" sin tener que generar llave pública o privada. Simplemente, en nuestros clientes SSH ya configurados para el usuario "ec2-user", debemos utilizar el usuario "git".

Si usamos la aplicación "Git Bash" en Windows, podemos probar esta conexión vía consola de la siguiente manera.

1) Por defecto, la conexión SSH de Git Bash utiliza el archivo "id_rsa" como llave privada que está en el directorio .ssh en la carpeta del usuario de windows.
2) La llave privada de tipo "OpenSSH" que hayamos generado para "ec2-user" debemos copiarla con este nuevo nombre "id_rsa" en la carpeta del usuario de windows. Si ya tenemos un archivo "id_rsa" allí y no deseamos perderlo, podemos usar otro nombre, pero al ejecutar el comando SSH, debemos indicar la opción "-i" y la ruta hacia este nuevo nombre
3) Abrimos la aplicación "Git Bash".
4) Escribimos el comando para conexión SSH.
ssh git@dns_público_ec2
Donde "dns_público_ec2" es el DNS público para nuestra instancia EC2. Si necesitamos indicar que la llave privada está en otro lugar o tiene otro nombre diferente a "id_rsa":
ssh -i /c/ruta_hacia_archivo/archivo_llave_privada_openssh git@dns_público_ec2

Proyecto Git Demo

A continuación los pasos para crear un proyecto vacío que se agregará al repositorio. Estas actividades las realizaremos con el usuario "ec2-user" (el administrador Git).

1) Creamos un directorio "git" donde se almacenarán nuestros proyectos remotos (origin).
cd /
mkdir git
sudo chown ec2-user:git git
sudo chmod 770 git
2) En seguida, ingresamos al directorio "git", y creamos la carpeta para un proyecto que llamaremos "demo". Nos guiamos por la documentación de Git al respecto.
cd /git
mkdir demo.git
sudo chown ec2-user:git demo.git
sudo chmod 770 demo.git
cd /git/demo.git
git --bare init
3) Ahora, volvemos a nuestro ambiente local y nos situamos en algún directorio destinado para nuestro "workspace". Se asume a continuación, ambiente windows con "Git Bash" instalado, las configuraciones básicas para Git establecidas (user.name, user.email) y la conexión SSH a EC2 para usuario git funcionando.
4) Una vez en nuestro "workspace", ejecutamos la aplicación Git Bash y clonamos el proyecto "demo".
clone git git@dns_público_ec2:/git/demo.git
Al revisar el directorio, deberíamos visualizar la carpeta "demo" y dentro el directorio ".git" que contiene la información para git.
5) Ingresamos al directorio "demo", creamos un archivo "readme.txt" con algún texto en su interior.
6) Luego hacemos las operaciones básicas para commit y push.
git add readme.txt
git commit -m 'Primer demo'
git push origin master
7) Ya que nuestro directorio remoto fue creado con --bare, no existe "workspace" remoto donde veamos los cambios, así que lo que haremos será irnos a otro directorio local donde clonaremos nuevamente el proyecto "demo".
git clone git@dns_público_ec2:/git/demo.git
Al ejecutar nuevamente el comando "clone" en otro directorio vacío, nuevamente obtendremos una carpeta "demo", pero esta vez, en su interior veremos nuestro archivo "readme.txt" creado anteriormente.

Colaborando con Otros Usuarios

Como mencionamos antes, para agregar a otros usuarios, estos deben generar el par de llaves pública y privada. La llave privada queda en poder el usuario y la llave pública se envía al administrador para agregarla como acceso autorizado del usuario "git".

Hay muchas formas de generar el par de llaves, lo importante es que sea en formato "OpenSSH". La aplicación "Git Bash" permite crear llaves, y el procedimiento es el siguiente:

1) Ejecutar "Git Bash" y ejecutar comando "ssh-keygen".
ssh-keygen -t rsa -C "segundo.usuario"
Al ejecutar este comando, nos preguntará dónde y con qué nombre se almacenará la llave. Si sólo ponemos el nombre, por ejemplo "segundo.usuario", las llaves quedarán guardadas en el directorio donde ejecutamos Git Bash. Si se requiere almacenar en otro lugar, se debe especificar la ruta completa. Si no ponemos nada, por defecto las guardará donde indica (id_rsa en directorio .ssh del usuario de Windows). Luego nos pedirá una "passphrase", podemos especificar alguna o dejarla sin nada, pero si la especificamos, cada vez que necesitemos autenticarnos deberemos ingresarla.

Aquí creamos un par de llaves pública y privada. La opción "-C" es para agregar un comentario, con esto podemos identificar a quién pertenece esta llave cuando la agreguemos como acceso al usuario "git"
2) En el paso anterior, a modo de ejemplo, generamos la llave pública "segundo.usuario.pub" que es la que debe ser enviada al administrador.

Dar Acceso para Usuario Colaborador en Git Remoto

El administrador, deberá copiar el contenido del archivo PUB (llave pública recibida) y agregarlo al archivo "authorized_keys" del usuario "git", esto es, anexar la información manteniendo las otras llaves públicas existentes en el archivo. Si el archivo (llave pública) fue generado en sistema Windows, se debe tener cuidado que el formato de la información sea compatible con Linux y no existan problemas de lectura de la llave (ejecutar comando "dos2unix" para transformar archivo recibido).

Una forma segura de concatenar la nueva información es seguir los siguientes pasos. Se asume que el archivo recibido "segundo.usuario.pub" se encuentra en el directorio "/tmp" del servidor remoto.
cd /tmp
sudo chown ec2-user:git segundo.usuario.pub
sudo chmod 770 segundo.usuario.pub
Luego, como usuario "git" se concatena la información al archivo "authorized_keys"
sudo su - git
cd /home/git/.ssh
cat /tmp/segundo.usuario.pub >> authorized_keys
El usuario colaborador "segundo.usuario" ya tiene permisos de acceso para "git".

Haciendo una Modificación

El nuevo usuario (segundo.usuario) ya puede hacer "clone" del proyecto. Después que lo haga, podrá hacer un cambio al archivo "readme.txt" y actualizar dicho cambio en el repositorio remoto:
git add readme.txt
git commit -m 'Cambio de segundo.usuario'
git push origin master
A continuación se muestran los cambios realizados en el repositorio remoto (origin), usando la aplicación "Gitk":

En esta imagen se muestra el primer "commit" que es cuando se creó el archivo readme.txt, por el usuario "Usuario ec2-user"

En esta segunda imagen, se muestra el segundo cambio, realizado por el usuario "segundo.usuario".

No hay comentarios.: