¿Cómo actualizar los datos de una tabla sin bloquearla y desde un archivo?

Hace un tiempo escribí un post similar, la diferencia con éste es que los datos a actualizar vienen de un archivo de texto. Hay muchas formas de hacerlo, para variar quise buscar una alternativa rápida y eficaz para evitar escribir un nuevo script, y se me ocurrió usar los comandos de linux, la verdad que resulto muy bien, aquí les dejo un ejemplo:

cat tokens.csv \
| \
awk -F ',' '{ print "UPDATE users SET token = \"" $2 "\" WHERE token IS NULL AND email = \"" $1 "\";"; system("sleep 0.1");}' \
| \
mysql --login-path=foo \
--safe-updates \
--batch \
--silent \
--database=foo

Explico un poco, básicamente se lee el archivo con cat, luego se crea la sentencia UPDATE usando el awk, por cada update hacemos una pausa de 100 milisegundo para no saturar, y se lo mandamos al cliente de MySQL.

¿Como administrar múltiples servidores en Linux?

Hay situaciones en las que se debe administrar muchos servidores mediante un punto central, o tener un mecanismo para preparar un servidor con una configuración especifica, hoy les hablo de una herramienta que nos permite hacer esto de una forma muy fácil. Se llama (R)?ex y esta basada en Perl. 
Lo simpático de esta herramienta es que no necesita un cliente como en el caso de Puppet de Ruby, simplemente nos basta una conexión por SSH para realizar la instalación, configuración y cualquier otra tarea que deseamos.

Entre las funciones principales de rex tenemos las siguientes:

  • Conexión a un servidor mediante SSH o con la opción de la clave privada. 
  • Instalación de paquetes usando los mecanismos nativos de cada distribución, APT o YUM. 
  • Subir o bajar archivos e incluso sincronizar directorios. 
  • Ejecutar comandos y si es necesario obtener la respuestas de estos. 
  • Uso de plantillas de configuración, preservando usuario dueño, permisos, etc… 
  • Ejecución en una serie de servidores. 
  • Está en las principales distribuciones de Linux. 
En caso de que todo lo anterior no nos parece suficiente, tenemos la gran posibilidad de extender su funcionalidad mediante el uso de Perl, esta herramienta cuentan con una API diseñada para administrar servidores. Todo está estructurado de una forma muy simple de entender y usar.
Les explico un breve ejemplo de como se instala, se configura y se usa para Ubunru 10.04 LTS y así se animen a implementarlo: 

Instalación:

echo 'deb http://rex.linux-files.org/ubuntu/ lucid rex' >> /etc/apt/sources.list
wget -O - http://rex.linux-files.org/DPKG-GPG-KEY-REXIFY-REPO | apt-key add -
apt-get update
apt-get install rex

Para otras distribuciones entre 

aquí.

Una ves instalada la herramienta, solo nos queda crear un directorio donde colocaremos nuestro script y todos los archivos necesarios para subir, plantillas etc. 
mkdir /home/usuario/rex/
cd /home/usuario/rex/

Y con un editor favorito editamos el script “web.pl” y agregamos el siguiente código:

user "root";
password "admin";
pass_auth;

group virtual => "10.211.55.5";

desc "Install and Configure Apache2 Web Server";
task "apache", group=> "virtual", sub {
install package => "apache2";

install file => "/etc/apache2/apache2.conf", {
source => "files/apache2.conf",
owner => "root",
group => "root",
mode => 644,
on_change => sub { say "File was modified!"; }
};

run "service apache2 restart";
};

El código anterior hace lo siguiente, se conecta a un servidor llamado virtual con la ip definida, usará el usuario root con la clave admin, existe una sola tarea que es la instalación y configuración de Apache, podemos ver que luego de instalarlo se copia un archivo de configuración, nos aseguramos que los permisos estén correctos y finalizamos reiniciando el servicio. 

Para ver las tareas definidas en el script ejecutamos el siguiente comando:

rex -f web.pl -T

Ejecutamos una tarea en especifico del script, en este caso la instalación y configuración de apache:

rex -f web.pl apache

Espero que se hayan animado de usar una herramienta que podemos guardar todas las configuraciones y comandos necesarios para administrar los servidores de una manera mucho mas eficiente, comoda, perezosa y segura.

Para mayor información y ejemplos debemos visitar la API y la Wiki:

¿Cómo obligar que un cliente SSH use una clave privada?

En el post anterior, explicamos como crear una clave pública y privada para poder autentificarnos por SSH (SFTP) y aumentar la seguridad, pero aveces ésta tecnica puede traer algún problema con aplicaciones que todavia no soportan ésta modalidad, como en el caso de Coda. La solución es muy simple, solo debemos configurar un archivo especificando cual clave privada debemos usar por host.
Como la aplicación no se le puede colocar el parametro -i que especifica la ruta de la clave privada, aremos que ésta se busque de forma automatica por el archivo de configuración.

Creamos y/o editamos el archivo de configuración:

vim /home/demo/.ssh/config
Agregamos los siguientes parámetros de configuración, estos se repiten por host que requiera la clave privada:
Host backup.server.com
IdentityFile /home/demo/.ssh/id_server_backup

Host mirror.server.com
IdentityFile /home/demo/.ssh/id_server_mirror

Guardamos los cambios y probamos de la siguiente forma:

ssh [email protected]

Si logramos acceder es que todo funciona bien.

Acceso por SSH mediante clave Pública y Privada en Ubuntu

Esta forma de autentificación nos permite incrementar la seguridad y facilitar el mismo mediante el servidor cuando estamos estableciendo una conexión por SSH, con ausencia de esta clave (Archivo que contiene el Key) será imposible conectarnos. El funcionamiento es el siguiente, al generar la clave nos crea dos archivos, uno contiene la clave pública que es la que subimos al servidor y el otra es la privada, esta es utiliza por el usuario desde su pc, móvil, o lo que venga. Dicha clave debe ser  configura a una determinada cuenta de usuario, y abra que cambiar algunos parámetros de configuración al servicio del SSH para permitir esta forma de autentificación. Manos a la obra:
Los dos primeros comandos se ejecutan desde un equipo (Que no es el Servidor), consiste en la creación de la clave pública y privada, luego el archivo de la clave publica se sube al servidor.
ssh-keygen -t rsa -b 4096 -f /home/beta/.ssh/id_server
scp id_server.pub [email protected]:
rm /home/beta/.ssh/id_server.pub
NOTA: Si queremos incrementar mucho mas el nivel de seguridad, podremos definir una contraseña al passphrase, de esta forma, cada vez que tratamos de conectarnos nos las pedirá, por lo que tendremos que olvidarnos de autentificarnos sin contraseña.
Ahora nos toca configurar el servidor, es importante recordar que aquí estaremos asignándole una clave pública a un determinado usuario, para esta situación usaremos el usuario root como ejemplo.
Agregamos el contenido de la clave pública a un archivo del usuario root que indica que clave es la tiene acceso, eliminamos el archivo de la clave publica y cambiamos los permisos:
cat /root/id_server.pub >> /root/.ssh/authorized_keys
rm /root/id_server.pub
chmod 600 /root/.ssh/authorized_keys

A configurar el servicio del SSH:

vim /etc/ssh/sshd_config
Verificamos que las propiedades estén definidas de la siguiente forma y en caso de no existir alguna de ellas, deberá agregarla:
RSAAuthentication yes
PubkeyAuthentication yes
ChallengeResponseAuthentication no
PasswordAuthentication no
UsePAM no

Guardamos, salimos y reiniciamos el servicio para que los cambios tengan efecto:

service ssh reload
Ahora nos toca probar desde nuestro PC si tenemos acceso usando la clave privada:
ssh –i /home/beta/.ssh/id_server [email protected] 

Si todo esta bien configurado no deberíamos tener ningún tipo de problema al conectarnos.

Para mayor información, documentarse con la comunidad de Ubuntu aquí.