viernes, 20 de diciembre de 2013

Presentación PostgreSQL sobre FreeBSD

Solo se llevo a cabo una BSDCON, donde fui asistente y cuando me convocaron como expositor no se concreto nada solo para no perder el trabajo
y probar el embebed code, les dejo esta presentación:


Se extrañan esos tiempos en que la gente se reunía por amor al arte.

miércoles, 18 de diciembre de 2013

Entrenamiento productivo

Bueno, hoy he estado pensando en las posibilidades laborales que tengo en el futuro, y sin ir más lejos DevOps es lo mio. ¿Por qué? Porque es lo que que venia haciendo, porque aún siendo Administrador de sistemas desde temprana edad luego estudié y me especialice en ingeniería de software y cuando trabaje en desarrollo, siempre monte mis servidores tanto de desarrollo y producción. (En Chile esto es relativamente común. Pero España es otra cosa muy distinta.) Por otra parte volviendo a DevOps, hoy hay más herramientas y es más necesario.
Pero ¿Qué es DevOps?
DevOps es una metodología que integra en satisfacer las necesidades de tiempo respuesta en IT, por medio de la unión de Dev (desarrollo) y Ops (operaciones/sistemas).
¿Como se logra?
  1. Incluir desarrollo en operaciones
  2. Hacer que los desarrolladores sean administradores. (vagrant)
  3. Incluir a operaciones en los análisis de desarrollo.
Luego de trabajar el ultimo año en un proyecto muy alejado de esta realidad (Claramente perdía mi tiempo a cambio de dinero), he acabado desmotivado y abatido.
Como las semanas pasan y la mente se aclara, ahora necesito definir lo que quiero. Quiero aprovechar mi talento y explotarlo de tal forma que como dijo Confucio:  “Elige un trabajo que te guste y no tendrás que trabajar ni un día de tu vida." Bajo aquella premisa me convertí en ingeniero en computación. Después de más de diez años trabajando con sistemas informáticos, sigo queriendo mi profesión, por encima de cualquier otra. Y porque hasta hace unos dos años atrás seguía un consejo que alguna vez nos dio un profesor a toda la clase, "consigan tiempo de ocio en el trabajo, porque el tiempo de ocio siempre te lleva a mejorar los procesos y a la re-ingeniería." Y desde entonces estoy en la búsqueda del tiempo de ocio. ¿Como lo he logrado? Bajando el margen de error. ¿Como bajamos el margen de error? Dejando de hacer lo mismo y esperar un resultado diferente. Lo que quiere decir esto, es que debemos trabajar y esmerarnos arduamente y eliminar todos los errores recurrentes, hilando muy fino hasta encontrar la causa y pre ver posible nuevos errores. ¿Como hacemos esto? Lo más común es un análisis de flujo del proceso (recordando siempre que todo proceso humano induce ineludiblemente a un error) entonces que deberíamos hacer.... "AUTOMATIZAR" los despliegues y las tareas cotidianas. No olvidemos que muchas veces debemos ser como el agua y empapar nuestro entorno gota a gota.

Bien ya que haz leído todo eso te dejo, ahora te toca participar. Pregúntate: ¿Gastas más de tres horas diarias en la linea de comando?

Si la respuesta es sí, debes leer más el blog, y siempre puedes solicitar mis servicios de consultoría y entrenamiento productivo.

Para mejorar el problema citado en este articulo, debemos dominar muy bien las siguientes tecnologías:

  • Unix/Linux
  • Vim/vi
  • Git
  • Python
  • shell scripting (bash, awk, sed, *grep, etc)
  • tmux, screen
  • y otras más.


lunes, 9 de diciembre de 2013

Storage Clusters sobre VirtualBox

La gran mayoría de los clusters desarrollados por compañías privadas son diseñados como clusters de almacenamiento compartido, esto quiere decir que hay acoplamiento de unidades de almacenamiento o en palabras simples se requiere hardware SAN, para el funcionamiento del cluster (HBA, Switch SAN, Cabina de discos), algunos de estos clusters son Oracle RAC, HP Service Guard, VMWare HA Cluster, RedHat Cluster Suite y varios más.

Cuando queremos hacer un laboratorio y probar estas tecnologías en casa, sobre VirtualBox en este caso requiere compartir los discos del entorno en cluster, entre dos o mas nodos, y en este articulo describo como hacerlo con VirtualBox.

Creación del disco

Se debe crear un disco, de tamaño fijo debido a que no funciona con el modo almacenamiento variable.

VBoxManage createhd --filename /virtualbox/nodo1/disco_cluster_01.vdi --size 10240 --format VDI --variant Fixed

Asignación del disco a una maquina virtual.

Como recomendación es bueno crear los discos en el directorio del nodo principal, y luego se debe asignar respetando la secuencia de discos con --port X, debido a que ya están asignados los puertos 0 y 1, por tanto el siguiente puerto sería el 2.

VBoxManage storageattach nodo1 --storagectl "SATA" --port 2 --device 0 --type hdd --medium /virtualbox/nodo1/disco_cluster_01.vdi --mtype shareable

Luego se asigna a los siguientes nodos modificando los nombre de los nodos correspondientes:

VBoxManage storageattach nodo2 --storagectl "SATA" --port 2 --device 0 --type hdd --medium /virtualbox/nodo1/disco_cluster_01.vdi --mtype shareable

Ejemplos

Este ejemplo de storage para un RAC oracle, hecho sobre windows:
"C:\Program Files\Oracle\VirtualBox\VBoxManage.exe" createhd --filename "D:\VirtualBox VMs\rac-01\ocr-vote-01.vdi" --size 1024   --format VDI --variant Fixed
"C:\Program Files\Oracle\VirtualBox\VBoxManage.exe" createhd --filename "D:\VirtualBox VMs\rac-01\ocr-vote-02.vdi" --size 1024   --format VDI --variant Fixed
"C:\Program Files\Oracle\VirtualBox\VBoxManage.exe" createhd --filename "D:\VirtualBox VMs\rac-01\ocr-vote-03.vdi" --size 1024   --format VDI --variant Fixed
"C:\Program Files\Oracle\VirtualBox\VBoxManage.exe" createhd --filename "D:\VirtualBox VMs\rac-01\fastrecarea.vdi" --size 102400 --format VDI --variant Fixed
"C:\Program Files\Oracle\VirtualBox\VBoxManage.exe" createhd --filename "D:\VirtualBox VMs\rac-01\asm-data-01.vdi" --size 51200  --format VDI --variant Fixed
"C:\Program Files\Oracle\VirtualBox\VBoxManage.exe" createhd --filename "D:\VirtualBox VMs\rac-01\asm-data-02.vdi" --size 51200  --format VDI --variant Fixed
"C:\Program Files\Oracle\VirtualBox\VBoxManage.exe" createhd --filename "D:\VirtualBox VMs\rac-01\asm-redo-01.vdi" --size 10240  --format VDI --variant Fixed


"C:\Program Files\Oracle\VirtualBox\VBoxManage.exe" storageattach rac-01 --storagectl "SATA" --port 2 --device 0 --type hdd --medium "D:\VirtualBox VMs\rac-01\ocr-vote-01.vdi" --mtype shareable
"C:\Program Files\Oracle\VirtualBox\VBoxManage.exe" storageattach rac-01 --storagectl "SATA" --port 3 --device 0 --type hdd --medium "D:\VirtualBox VMs\rac-01\ocr-vote-02.vdi" --mtype shareable
"C:\Program Files\Oracle\VirtualBox\VBoxManage.exe" storageattach rac-01 --storagectl "SATA" --port 4 --device 0 --type hdd --medium "D:\VirtualBox VMs\rac-01\ocr-vote-03.vdi" --mtype shareable
"C:\Program Files\Oracle\VirtualBox\VBoxManage.exe" storageattach rac-01 --storagectl "SATA" --port 5 --device 0 --type hdd --medium "D:\VirtualBox VMs\rac-01\fastrecarea.vdi" --mtype shareable
"C:\Program Files\Oracle\VirtualBox\VBoxManage.exe" storageattach rac-01 --storagectl "SATA" --port 6 --device 0 --type hdd --medium "D:\VirtualBox VMs\rac-01\asm-data-01.vdi" --mtype shareable
"C:\Program Files\Oracle\VirtualBox\VBoxManage.exe" storageattach rac-01 --storagectl "SATA" --port 7 --device 0 --type hdd --medium "D:\VirtualBox VMs\rac-01\asm-data-02.vdi" --mtype shareable
"C:\Program Files\Oracle\VirtualBox\VBoxManage.exe" storageattach rac-01 --storagectl "SATA" --port 7 --device 0 --type hdd --medium "D:\VirtualBox VMs\rac-01\asm-redo-01.vdi" --mtype shareable


"C:\Program Files\Oracle\VirtualBox\VBoxManage.exe" storageattach rac-02 --storagectl "SATA" --port 2 --device 0 --type hdd --medium "D:\VirtualBox VMs\rac-01\ocr-vote-01.vdi" --mtype shareable
"C:\Program Files\Oracle\VirtualBox\VBoxManage.exe" storageattach rac-02 --storagectl "SATA" --port 3 --device 0 --type hdd --medium "D:\VirtualBox VMs\rac-01\ocr-vote-02.vdi" --mtype shareable
"C:\Program Files\Oracle\VirtualBox\VBoxManage.exe" storageattach rac-02 --storagectl "SATA" --port 4 --device 0 --type hdd --medium "D:\VirtualBox VMs\rac-01\ocr-vote-03.vdi" --mtype shareable
"C:\Program Files\Oracle\VirtualBox\VBoxManage.exe" storageattach rac-02 --storagectl "SATA" --port 5 --device 0 --type hdd --medium "D:\VirtualBox VMs\rac-01\fastrecarea.vdi" --mtype shareable
"C:\Program Files\Oracle\VirtualBox\VBoxManage.exe" storageattach rac-02 --storagectl "SATA" --port 6 --device 0 --type hdd --medium "D:\VirtualBox VMs\rac-01\asm-data-01.vdi" --mtype shareable
"C:\Program Files\Oracle\VirtualBox\VBoxManage.exe" storageattach rac-02 --storagectl "SATA" --port 7 --device 0 --type hdd --medium "D:\VirtualBox VMs\rac-01\asm-data-02.vdi" --mtype shareable
"C:\Program Files\Oracle\VirtualBox\VBoxManage.exe" storageattach rac-02 --storagectl "SATA" --port 7 --device 0 --type hdd --medium "D:\VirtualBox VMs\rac-01\asm-redo-01.vdi" --mtype shareable

Nota:

Al momento de hacer esto en modo CLI no sabia que mediante el GUI se puede hacer con facilidad, los pasos son:
  1. Crear los discos en modo fixed.
  2. Quitarlo de la VM donde se han creado.
  3. Ir al menu superior File > Virtual Media Manager.
  4. Seleccionar el disco y clickear en modificar.
  5. Marcar como Shareable.
  6. Asignar a las VM del cluester.

martes, 5 de noviembre de 2013

Función para obtener los WWN de las HBA en RHEL 4, 5 y 6


Con este script se pueden obtener las portname de hba en cualquier version de RHEL

#!/usr/bin/env bash
get_redhat_release()
{    
    echo $(awk '{print $7}' /etc/redhat-release |sed -e "s/.[0-9]//g")
}

get_HBA_RHEL4()
{
    model=$(lsmod |egrep "^ql.2xxx" | awk '{print $1}')
    grep adapter-port /proc/scsi/$model/* |sed -e "s/^.*://g" -e "s/;//" -e "s/=/  /g" -e "s/-adapter-port//g"
}

get_HBA_RHEL5()
{
    for fc_host in $(ls /sys/class/fc_host)
    do
        echo $fc_host $(cat /sys/class/fc_host/${fc_host}/port_name |sed "s/^0x//g")
    done
}

get_HBA_WWN()
{
    case "$(get_redhat_release)" in
        4)
            get_HBA_RHEL4
        ;;
        5)
            get_HBA_RHEL5
        ;;
        6)
            get_HBA_RHEL5
        ;;
    esac
}


Ya nos vale llamar a la funcion get_HBA_WWN para que nos entregue la información requerida:

RHEL 5 y 6

get_HBA_WWN
host1 10008c7cff20c522
host2 10008c7cff20c523
host3 10008c7cff20c4c2
host4 10008c7cff20c4c3


RHEL 4
get_HBA_WWN
scsi-qla0  210000e08b8aef37
scsi-qla1  210000e08b866cc2

martes, 29 de octubre de 2013

Dimensionamiento de filesystem en *nix

Un gran y famoso logo corporativo, no garantiza que las cosas se hagan bien, de hecho, lo más probable es que se hagan de la forma más barata posible, lo que se traduce en malos resultados.
Para los bien ponderados lectores, que aún no saben como tomar la decisión de dimensionar los fs en un sistema operativo *nix, este articulo les ayudara bastante.

Primero partimos de la base de que mínimo debe tener 40G si quieres poder rotar logs con holgura y evitar tener los FS a punto de llenarse.

Tomado en cuenta el punto anterior, siempre y como premisa usaremos LVM, ZFS, GEOM, Veritas LVM. instalar un sistema operativo "sin" volúmenes lógicos es pecado mortal y no se hace, porque no permite redimensionar los FS en el futuro, se trata de aprovisionar lo justo a cada punto de montaje y según se necesite se va ampliando, posterior a la instalación, algo que no se podría hacer sin un Logical Volumen Manager.

Tomado en cuenta el punto anterior, podemos crear los puntos de montaje que técnicamente se les denomina Logical Volume (LV) y formatearlos con el sistema de archivo que les parezca mejor. Infinidad de elecciones (UFS, XFS, ReiserFS, EXT[2-4], BtrFS, etc). 

Las particiones usuales básicas son:
  • /
  • /var
  • /tmp
  • /usr
  • /opt
  • swap
  • /home (queda a criterio personal)
Primero muchos aplicativos corporativos se instalan en /usr o /opt dependiendo de esto debemos otorgar más a uno u otro, lo que es seguro es que el OS en si esta instalado sobre /usr, con lo cual debe tener el tamaño que este requiere.
El "/" denominado root, debe tener mínimo 2G
El "/var" debe tener mínimo 4G dependiendo de los logs que genera el aplicativo o el historial que se requiere rotar.
El "/tmp" 1G
El "/usr" debe tener mínimo lo que se requiere para instalar el OS. 5G a 10G deberían bastar. El criterio base es mínimo requerido + 1G
El "/opt" es muy variable partir con 1G e ir ampliando según el aplicativo lo requiera.
La "swap" 2G para comenzar luego ampliar sobre demanda.

NOTA: en Linux es muy común crear una partición ext3 para el /boot de 300MB aunque 100MB bastan en algunos caso donde se actualiza el kernel podríamos quedar algo corto por tanto de 300 a 500MB es bastante recomendable si es un sistema LTS.

Si sumamos el gasto base, quedará libre más menos la mitad de un disco estándar 40G, aunque en la realidad los discos de servidores físicos son de mayor capacidad, el mundo de la virtualización permite aprovisionar tamaños menores. Estas recomendaciones son un punto de partida para servidores en en entornos productivos.

Por ultimo para los aplicativos productivos se recomienda crear un VG distinto, de tal forma que no genere acoplamiento con el OS.


jueves, 24 de octubre de 2013

*nix SysAdmin shellscripting framework

Como sysadmin recomiendo siempre saber programar y automatizar lo más posible las tareas cotidianas, todo proceso humano induce a error, si creas un script, puedes cometer errores en este, pero cuando esté ultra probado probablemente no vuelva a fallar, y el margen de error bajara considerablemente. Por otro lado alivia el trabajo rutinario, más tiempo de ocio al final, lo que se traduce en más tiempo para nuevas ideas. Por esto he decidido recopilar todas las cosas recurrentes escritas en varios scripts que voy encontrando por ahí, para ponerlas en un framework, y así poder escribir scripts más sencillos y pequeños centrándonos en la lógica del problema a solucionar y no en lo mismo de siempre.
Desde ya invito a quién quiera participar con ideas y mejoras a contactarme y cooperar en él, ya que es muy probable que tengamos problemas similares a los cuales aplicar este conjunto de funciones en para shellscripting.

Les dejo en enlace a github de nShell y a otros proyectos similares, obviamente esto no puede ser una idea nueva, pero yo no solo existe linux y bash (aunque ya lo quisieran muchos, me incluyo), por esto uno de los objectivos de nShell es hacerlo compatible con más de un shell unix.

martes, 8 de octubre de 2013

SQL JOINS

Hoy tuve un job tes,t que incluía una parte de SQL y como siempre he evitado los JOIN explícitos, ya que prefiero hacer las uniones en la clausula WHERE, algo que comienza a cambiar a partir de hoy, si lo hare solo por compatibilidad de lectura y para practicar querys standard.
Es importante aclarar que SQL no pasara de moda con los entornos NoSQL, ya que se está haciendo un gran esfuerzo en poner una capa SQL sobre NoSQL, Bigdata o MapReduce, está reeditada como newSQL. Por tanto tenemos Álgebra relacional para rato.

Dejo esta imagen que aclara todo sobre el producto cartesiano de un JOIN explicito.


sábado, 5 de octubre de 2013

Preparación de un ambiente de desarrollo python sin acoplamiento de dependencias.

Ingredientes:
  1. python 3 o 2
  2. virtualenv
  3. virtualenvwrapper
  4. IDE JetBrains PyCharm ( o el que te guste más, recomiendo pycharm. )
Para comenzar, se debe instalar la versión del interprete python, que se requiera para el proyecto o incluso podría instalar ambas ramas 2.x y 3.x.

Una vez tenga el interprete python instalado se puden instalar nuevas librerias con la herramienta pip (requiere ser instalado manualmente si utiliza OSX o Windows) o el package manager del sistema.(ports, pacman, MacPorts, apt, yum, etc.)

Para todos los ejemplos se usa pip, ya que es propio de python y no varia de sistema operativo.

¿Que es virtualenv?
virtualenv es una herramienta que permite crear entornos de desarrollo en python aislados, lo cual es de gran ayuda cuando se requiere trabajar con varios proyectos, debido a que evita el conflicto de librerías. También, mediante pip, permite exportar un lista de las librerías e importarlas en un nuevo entorno.

¿Que es virtualenvwrapper?
virtualenvwrapper no es más que un envoltorio con funciones en shell, para ayudar a trabajar con virtualenv de forma más rápida, cómoda y eficiente. (para Windows existe virtualenvwrapper-win)

pip install virtualenv
pip install virtualenvwrapper

Una vez instalado se debe configurar el .bashrc o profile de la Shell que este utilizando, soporta: bash, zsh y ksh

Edite el profile de su shell preferida y agregue la siguientes variables de entorno:

export WORKON_HOME=$HOME/.virtualenvs
source /usr/bin/virtualenvwrapper.sh

Guarde los cambios y recargue su profile,  ejemplo:

soruce .bashrc
mkdir $WORKON_HOME

A partir de aquí viene la parte emocionante y que más nos interesa, al tener cargado en nuestro $SHELL las funciones de viertualenvwrapper.sh, ya se puede comenzar a trabajar con el virtualenv e instalar paquetes con pip u otro PKGMGR de elección particular, todo dentro del entorno virtual.

Funciones básicas más importantes:

workon
mkvirtualenv
rmvirtualenv
lsvirtualenv


Comenzar a trabajar con el wrapper, se utiliza la instrucción workon permite ver los virtualenv creados y seleccionar un virtualenv para trabajar, el siguiente ejemplo muestra como crear un virtualenv:

workon
mkvirtualenv -p /usr/bin/python3 [test_env]

Ya está creado el nuevo virtualenv test_env, el cual puede ser integrado dentro del PyCharm IDE para trabajar e instalar paquetes como django.
Al no poner --no-pip contamos con pip dentro del virtualenv, con lo que se puede importar todos los paquetes de un requirements.txt anteriormente exportado con pip o en un futuro exportarlos para que nuestros colegas de profesión creen su propio entorno virtual.

Exportar paquetes requeridos (recomiendo hacer esto y ponerlo en el CSM[git|svn|mercurial|etc.] del proyecto)

pip freeze requirements.txt

Instalar los paquetes del requirements.txt

pip install -r requirements.txt

Con esto estaría relativamente cubierto todo lo referente a preparar un entorno de desarrollo lejos del caos!
Suerte.

viernes, 4 de octubre de 2013

FreeBSD 9.2 VirtIO

FreeBSD 9.2 Release

Mucho presume IBM pSeries virtualización de IO y hoy contamos por primera vez con esta característica en FreeBSD, Esto mejora el rendimiento de virtualizar las tarjetas de Ethernet y SCSI. virtio(4)
Esta característica nos permitiría crear nuestro propio VIO Server sobre FreeBSD

FreeBSD soporta los siguientes dispositivos VirtIO


  • Ethernet: dispositivo emulado por vtnet(4)
  • Block: controlador de disco emulado por virtio_blk(4) 
  • SCSI: emulacion de HBA SCSI mediante virtio_scsi(4)
  • Balloon: un pseudo-device que permite a una VM liberar memoria y retornarla al hypervisor medinate virtio_balloon(4)


para mas informacion:

  • virtio_balloon(4), virtio_blk(4), virtio_scsi(4), vtnet(4)


El soporte para VirtIO aparece por primera vez en 9.2.

jueves, 3 de octubre de 2013

IBM POWER SYSTEMS

PSERIES IBM POWER SYSTEMS, las princesas tecnológicas de las grandes empresas, como el mac book y OSX para un ciudadano común y corriente, es el POWER y AIX a una empresa. Muy cierto es su alto poder de procesamiento (RISC) su escalabilidad, la gran calidad del hardware, La paravirtualización del hardware IO. Pero cuando todo esto se mal dimensiona o se implementa mal y administra de peor manera durante años, se sufre mucho. Ya que parar la operación parar y poder mejorar el entorno es inviable producto del descontrol del los entornos. Lo normal es que esto no suceda y todo este relativamente en orden, pero existen excepciones y me toco pasar por un mal caso.
Mi objetivo no es enseñar como montarlo ya que esta todo aquí, por el contrario quiero comentar dos cosas fundamentales. Ordenar la arquitectura, definir bien que LPAR crear, dimensionar con capacidad de escalar las particiones, tomar en cuenta la redundancia, aprovisionar almacenamiento suficiente y duplicarlo cuando supera el 70% de la capacidad asignada hasta ese momento. Usar preferentemente NPIV en vez de vSCSI

miércoles, 2 de octubre de 2013

The Lord of Bandwidth Control!

Nine megs for the secretaries fair,
Seven megs for the hackers scarce,
Five megs for the grads in smoky lairs,
Three megs for system source;

One disk to rule them all,

One disk to bind them,
One disk to hold the files
And in the darkness grind 'em.