howto


In my previous post I explained the VMs installation and network configuration needed for installing Chef. In this second part, I’ll show how to install and configure the Chef Server, the two Nodes and the Chef Workstation. An overview and an explanation of these components can be seen here.

In order to get the DEB packages for Ubuntu, it’s needed to register and you’ll get an e-mail with the links to download them. Once all the packages are in the Chef Server, the installation can start.

Chef Server

My Chef Server is an Ubuntu Server. It has installed an Apache server using the port 80. Chef uses Nginx in the ports 80 and 443 so I need to stop the apache server before configuring Chef:
sudo /etc/init.d/apache2 stop
sudo update-rc.d apache2 disable

Now I can proceed with the installation and configuration of Chef:

sudo dpkg -i private-chef_11.2.2-1_amd64.deb
sudo private-chef-ctl reconfigure
sudo private-chef-ctl test

sudo dpkg -i opscode-reporting_1.1.6-1_amd64.deb
sudo opscode-reporting-ctl reconfigure
sudo private-chef-ctl restart opscode-reporting
sudo opscode-reporting-ctl test

sudo dpkg -i opscode-push-jobs-server_1.1.3-1_amd64.deb
sudo opscode-push-jobs-server-ctl reconfigure
opscode-push-jobs-server-ctl test

Don’t use root for running the previous commands or there will be an error. I got rid of the error just by using sudo as it’s explained in the documentation.

chef_test_no_errors

User and Organization

The user and organization can be created through the Chef Server Web interface. In my case, I can go to https://chefserver.alberto.com and sign up for a new user. The key for that user is needed for the Workstation configuration.

chef server create userThe user key can be generated and downloaded from the User section:
 chef server user key
The organization can be created as well from the web interface. The validation key for the organization is needed as well.
chef server create organization

Chef Workstation

As the Chef Workstation is an Ubuntu Desktop, I can use “sudo apt-get install chef” for installing the chef client. In my example, I’m using again https://chefserver.alberto.com as the Chef Server URL. Remember that I have added all the IPs and names in the /etc/hosts file.

The Chef Development Kit is also needed in the Worksation:

sudo dpkg -i chefdk_0.2.2-1_amd64.deb

I need to copy the user key file, the organization validation file and the initial knife configuration file to the Chef Workstation. I have copied them into /home/abian/.chef as it can be seen in the following screenshot:

chef worksation knife configuration

The content of the knife.rb should be something like this

abian@chefws:~/.chef$ cat knife.rb
current_dir = File.dirname(__FILE__)
log_level                :info
log_location           STDOUT
node_name           “abian”
client_key               “#{current_dir}/abian.pem”
validation_client_name   “albertoorg-validator”
validation_key           “#{current_dir}/albertoorg-validator.pem”
chef_server_url          ‘https://chefserver.alberto.com/organizations/albertoorg’
cache_type               ‘BasicFile’
cache_options( :path => “#{ENV[‘HOME’]}/.chef/checksums” )
cookbook_path            [“#{current_dir}/../cookbooks”]

Chef Nodes

I needed to install libc >= 2.14 in the two Debian servers to use the chef client. If you have installed Debian 7.6 in the nodes you’ll need to do the next three steps:

– Add sources.list: sudo echo ‘deb http://ftp.ie.debian.org/debian/ testing non-free contrib main’ >> /etc/apt/sources.list
– Check that it doesn’t break anything: sudo apt-get -t testing install libc6-dev –dry-run
– Install the new version: sudo apt-get -t testing install libc6-dev

The Chef Nodes are ready to be added to the chef environment. From the Chef Workstation run the following commands:

knife bootstrap debian1.alberto.com -x root -P password -N debian1
knife bootstrap debian2.alberto.com -x root -P password -N debian2

The new nodes appear now in the Chef web interface:
chef server with two nodesThe environment is ready for the addition of cookbooks and recipes.

I has been a good while since I don’t update my blog. The first change you’ll notice is that I’m writing in English now. After nearly three years living in Ireland I somehow got used to it :-) Apologies for my Spanish speaking readers and welcome to the English speaking readers!

I’ve been reading lately a lot of documentation about Chef. It’s really easy getting started with it just by copying and pasting the examples given in the documentation page. I’ll write in this post what I’ve done to play a little bit with Chef with my laptop.

I’m using VirtualBox for the virtual machines but another solution can be used. My host machine is a Dell XPS 13 Developer Edition with Ubuntu Desktop 12.04. VirtualBox can be downloaded from here.

Step 1: Virtual Machines

The first step is creating 4 new virtual machines:

  1. Chef Server:
    • OS: Ubuntu Server 64 bits
    • Memory: 3GB RAM
    • HD: 30 GB of HD
    • Network: Adapter 1 Bridged Adapter, Adapter 2:  Internal Network “chefnet”
  2. Chef Workstation:
    • OS: Ubuntu Desktop 64 bits
    • Memory: 1GB RAM
    • HD: 20 GB of HD
    • Network: Adapter 1 NAT, Adapter 2:  Internal Network “chefnet”
  3. Chef Node 1:
    • OS: Debian 7.6 (wheezy) 64 bits
    • Memory: 1GB RAM
    • HD: 20 GB of HD
    • Network: Adapter 1 NAT, Adapter 2:  Internal Network “chefnet”
  4. Chef Node 2:
    • OS: Debian 7.6 (wheezy) 64 bits
    • Memory: 1GB RAM
    • HD: 20 GB of HD
    • Network: Adapter 1 NAT, Adapter 2:  Internal Network “chefnet”

I’m using different Linux versions for adding a little bit of variety to the testing environment.

It’s needed that all the virtual machines can communicate between each other. Each virtual machine has two network adapters. Adapter 1 is used to give Internet connection to the virtual machine. It’s handy for downloading and installing new packages using APT.

First network adapter

The second network interface is present to have all the virtual machines in the same subnet. VirtualBox gives the option of having an internal network for the virtual machines:

VirtualBox internal network adapterThe second network adapter creates the following internal network:

chef eth1I’m using “Bridged Adapter” to allow me to do SSH and SCP from my host laptop into the Chef Server. I could use the shared folders functionality that VirtualBox offers but I prefer the old fashion ssh way.

The final configuration of the network looks like this

chef_networkStep 2: Install the OS in each machine.

Step 3: Root user and SSH server

After installing the OS in the four virtual machines, I have installed as well the VirtualBox additions in the two Ubuntu VMs. I have installed Gnome in the Chef Server and Unity in the Chef Workstation. The graphical interface is not needed at all in the Chef Server but I added it anyway just in case I needed it later on.

The root account is needed in the four VMs. In Ubuntu Desktop, you’ll need to do “sudo bash” put the password of your user and then “passwd” to create the password for the root user.

The SSH server is needed as well. As all the VMs have connection to internet, I can use the command: apt-get install openssh-server
The root user should be able to be used in a SSH connection. Modify the /etc/ssh/sshd_config file to include this line: PermitRootLogin yes

Step 4: Network

The Chef Server needs to have a Fully Qualified Domain Name. In the Chef Server, use as root: hostname chefserver.alberto.com

As I don’t have a DNS server in this environment. The content of the /etc/hosts should be the same for the four VMs:

192.168.1.10    chefserver.alberto.com
192.168.1.11    debian1.alberto.com
192.168.1.12    debian2.alberto.com
192.168.1.13    chefws.alberto.com

The content of the file /etc/network/interfaces should be:

auto eth0
iface eth0 inet dhcp

auto eth1
iface eth1 inet static
     # Change the las digit in the other machines
     address 192.168.1.10
     netmask 255.255.255.0

In the Ubuntu Desktop machine, probably you’ll need to remove the network manager because it overrides the content of the /etc/network/interfaces file. Try something like: apt-get remove network-manager network-manager-gnome

Final step: Review

The final step is reviewing that the communications are possible between the VMs. This is the summary of my VirtualBox VMs and the four of them running at the same time.
VirtualBox summaryVMs final setup

Hace exactamente dos años escribí un post explicando cómo configurar un servidor NFS. Hoy voy a completar ese post explicando cómo configurar ese servicio para funcionar con IPv6.

1- Configuración del escenario:

He creado dos máquinas virtuales de Ubuntu con Virtualbox, una de ellas hará de servidor y la otra será el cliente. El servidor tiene la IPv4 192.168.2.1/24 y la IPv6 2001::1:1/64 mientras que el cliente tiene la IPv4 192.168.2.10/24 y la IPv6 2001::1:2/64.

Servidor y cliente NFS

Servidor y cliente NFS

Para que haya un enlace entre ellas he configurado una red interna en VirtualBox entre ellos. Para crear dicha conexión hay que ir a las propiedades de la máquina virtual y, en la sección de red, cambiar de NAT a Red Interna. Se le puede dar un nombre para distinguirla de otras redes, en mi caso la he llamado nfsIPv6, como muestro en la siguiente captura de pantalla:

Configuración de red interna

Configuración de red interna

2- Configuración del servidor

En la máquina virtual del servidor tengo dos interfaces de red: eth0 en modo NAT para conectarme a internet y poder instalar software o consultar manuales y eth1 para realizar la comunicación con el cliente en IPv6. Para asignar una dirección IPv6 al interfaz de red eth1 he utilizado el siguiente comando:

root@server:~# ifconfig eth1 inet6 add 2001::1:1/64

Instalación del servidor NFS:

root@server:~# apt-get install nfs-kernel-server nfs-common portmap

creación de las carpetas que voy a exportar:

root@server:~# mkdir /home/abian/test
root@server:~#mkdir /home/abian/test2
root@server:~#chown -R abian.abian /home/abian/test*

Edición del archivo /etc/exports:

/home/abian/test       2001::1:2(rw,sync,no_subtree_check)
/home/abian/test2    *(ro,root_squash,no_subtree_check)

Edición del archivo /etc/hosts.allow:

portmap:[2001::1:2]
nfs:[2001::1:2]

Edición del archivo /etc/hosts.deny:

ALL: PARANOID

Reinicio de los servicios con las nuevas configuraciones:

root@server:~# /etc/init.d/portmap restart
root@server:~# /etc/init.d/nfs-kernel-server restart

3- Configuración del cliente

En el cliente solo hay una interfaz de red. Para añadir una dirección de IPv6 utilizo el mismo comando que para el servidor:

root@linux:~# ifconfig eth1 inet6 add 2001::1:2/64

Montar la partición NFS con IPv6

root@linux:~# mount -t nfs [2001::1:1]:/home/abian/test /home/abian/nfs_folder

4- Consideraciones adicionales

En el archivo /etc/exports puse dos líneas. Eso quiere decir que estoy exportando dos directorios del servidor. El directorio /home/abian/test solo puede ser accedido desde la dirección IPv6 2001::1:2 pero el directorio /home/abian/test2 puede ser accedido desde cualquier dirección IP porque puse un “*”.

Lo bueno de esta configuración es que puedo utilizar el protocolo IPv4 para acceder a un directorio y el protocolo IPv6 para conectarme a otro como muestro en la siguiente captura de pantalla:

IPv4 e IPv6 son buenos amiguitos

IPv4 e IPv6 son buenos amiguitos

Espero que este post os haya gustado. Se lo dedico especialmente al Maño y a su asignatura de sistemas operativos. ¡Ya me invitarás a una cerveza cuando nos veamos! :-)

El otro día me tuve que enfrentar de nuevo a la pregunta de qué sistema de ficheros utilizar en un disco duro externo. Me encantaría utilizar ext4 por su robustez, el journaling, etc. Sin embargo, seguro que tendré problemas cuando intente acceder a información de este disco duro externo desde un ordenador que no sea el mío. Tampoco quería caer en la tentación de utilizar VFAT por sus conocidos problemas y limitaciones. A sí que al final opté por NTFS que me permite utilizar archivos de más de 4GB, tiene journaling, metadatos de archivos, etc. Muchas de las ventajas que me ofrece ext4 pero sabiendo que funcionará en casi todos los ordenas donde lo utilice.

No tuve ningún problema para crear la partición utilizando gparted y funciona perfectamente en ubuntu. Sin embargo, me sorprendió que no hubiera soporte nativo de escritura para NFTS en Mac Os X 10.6.8. Tras alguna búsqueda en google parece que muchos usuarios de Mac se decantan por utilizar: paragon software o NTFS-3G. Ambos tienen una licencia que ronda los $20.

Tenía más sentido que, ya que existe soporte de escritura para en NTFS para GNU/Linux, los chicos de Apple hubieran implementado un soporte nativo de escritura en NTFS para Mac, a sí que al final encontré una solución más barata sencilla en este blog.

La idea es que por defecto se montará la partición como solo lectura pero utilizando la consola se puede forzar a que la partición se monte también como lectrua/escritura. Solo hay que saber el nombre del volumen y la ruta de la partición (algo del estilo /dev/disk?s?).

Para averiguar esas dos cosas se puede utilizar los comandos:

ls /Volumes/

diskutil info /Volumes/Abian/ | grep “Device Node”

Luego solo hay que crear una carpeta donde se montará el dispositivo y ejecutar el comando para montar la partición. Para que no se me olvide me he hecho un pequeño script:

#/bin/sh
#desmontar el volumen
hdiutil eject /Volumes/Abian/
#crear la carpeta donde se montará la partición
sudo mkdir /Volumes/Abian/
#montar la partición con la opción de escritura
sudo mount_ntfs -o rw /dev/disk1s1 /Volumes/Abian/
#mostrar que se ha montado bien
mount | grep Abian

No hay que olvidar darle privilegios de ejecución con chmod +x script.sh

Tras ejecutar el script debería aparecer la línea:

/dev/disk1s1 on /Volumes/Abian (ntfs, local, noowners)

en lugar de:

/dev/disk1s1 on /Volumes/Abian (ntfs, local, nodev, nosuid, read-only, noowners)

Un saludo

Esta semana entre unas cosas y otras he tenido que instalar el servidor de aplicaciones Glassfish unas 10 veces. El proceso es realmente sencillo y está perfectamente documentado.

Para instalarlo solo hay que seguir los 4 siguientes pasos:

1- Descargarlo de la página web de glassfish.

2- Descomprimir el zip o ejecutar el script de instalación.

3- Ejecutar el comando de inicio del servidor:

abian@server:~/glassfish3/bin$ ./asadmin start-domain domain1

4- Abrir en un navegador web la dirección http://127.0.0.1:4848

Página principal de Glassfish

Página principal de Glassfish

La primera vez que se abre esta página no pide password de administrador, a sí que la primera tarea de configuración post instalación será establecer un password para el usuario “admin” entrando en la sección “Dominio -> Contraseña de administración”.

También se pueden configurar los parámetros de la máquina virtual de java como la memoria máxima asignada al proceso que ejecuta el servidor glassfish (opción -Xmx). Para ello hay que ir a la sección “Configuración -> configuración del servidor -> JVM Options” como se puede ver en la siguiente captura de pantalla:

Opciones de la Máquina Virtual de Java

Opciones de la Máquina Virtual de Java

Del mismo modo, es buena idea crear un script para que arranque y pare el servidor. Para ello hay que copiar el siguiente código en un fichero en la carpeta /etc/init.d/

abian@server:~$ cat /etc/init.d/glassfish
#!/bin/bash  
GLASSFISHPATH=/home/abian/glassfish3/bin  #cambiad esto por la ruta de vuestra instalación
case “$1” in  
    start)  
      echo “starting glassfish from $GLASSFISHPATH”  
      # cambiad “abian” por el nombre de usuario que ejecutará el proceso glassfish
      sudo -u abian $GLASSFISHPATH/asadmin start-domain domain1  
      ;;  
    restart)  
      $0 stop  
      $0 start  
      ;;  
    stop)  
      echo “stopping glassfish from $GLASSFISHPATH”  
      # cambiad “abian” por el nombre de usuario que ejecutará el proceso glassfish
      sudo -u abian $GLASSFISHPATH/asadmin stop-domain domain1  
      ;;  
    *)
     #defaul value restart  
      $0 stop
      $0 start
      ;;  
esac 

No hay que olvidar asignar los permisos de ejecución a este nuevo script:

root@server:~# chmod +x /etc/init.d/glassfish

Después tan solo hay que ejecutar el comando update-rc.d (como root) para que se inicie glassfish automáticamente cuando arranca el ordenador:

root@server:~# update-rc.d glassfish defaults

Una de las cosas que resulta más cómoda es la visualización de logs ya que se puede acceder a ellos desde la sección “Servidor -> ver archivos de registro”. Glassfish permite buscar, filtrar, ordenar los eventos y errores producidos por las aplicaciones web desplegadas. Realmente es muy útil mientras se está desarrollando o realizando pruebas sobre una sección del código.

Ver archivos de log

Ver archivos de log

Un saludo

Revisando las noticias, he leído en Secutiry By Default que hay una nueva versión de JoomlaScan. He de reconocer que me ha picado la curiosidad de probar dicha aplicación con un par de instalaciones de Joomla! con las que estoy trabajando. Una de las ventajas de desarrollar un portal web basándose en Joomla! es que no hay que reinventar la rueda una y otra vez. Se puede utilizar y configurar el CMS según las necesidades concretas de cada situación y luego extenderlo hasta cubrir el total de las funcionalidades deseadas.

Hablar de seguridad en un portal web es siempre delicado. Cada día aparecen nuevas vulnerabilidades o nuevas técnicas para comprometer aplicaciones web. Utilizar Joomla! también mitiga en cierta forma el número de vulnerabilidades que pueden aparecer en una aplicación web porque el código de Joomla! es revisado antes de ser liberado. Además, al tratarse de una solución Open Source, se pueden realizar auditorías de seguridad y si alguien encuentra algún error puede avisar a los desarrolladores para que lo corrijan.

Sin embargo, Joomla! puede ser ampliado con un sin fin de extensiones. ¿Cómo podemos estar seguros de que todas las extensiones que hay instaladas en nuestro portal web son seguras? Una opción es revisar el código cuidadosamente o también se pueden utilizar programas como JoomlaScan para hacernos una idea de si hay alguna vulnerabilidad en una instalación de Joomla!

Tras descargar el script de la página web de Pepelux, se puede ejecutar el siguiente comando para realizar un escaneo (al utilizar el parámetro “cm” estamos pidiendo un informe de las posibles vulnerabilidades):

./joomlascan.pl -u http://127.0.0.1 -v -c -cm

El resultado de la ejecución se puede ver en la siguiente captura de pantalla:

Resultado de JoomlaScan

Resultado de JoomlaScan

Sin duda muy útil para recordarnos que no sólo tenemos que programar cosas que funcionan sino también tener en cuenta las posibles vulnerabilidades que podemos introducir con cada componente web que creamos.

Un saludo

Que estamos rodeados de gadgets es un hecho. Siempre que hago algún viaje con los amigos, es normal que cada uno lleve su cámara de fotos digital. De hecho, en el último viaje alguien llevó dos cámaras… Lo que es menos normal es que se establezca correctamente la fecha y hora de la cámara, lo que dificulta su organización una vez que se ha vuelto del viaje.

Cada vez que se hace una fotografía con una cámara digital, junto con la imagen se guardan unos datos extra llamados metadatos EXIF. En estos metadatos se puede encontrar desde el modelo de la cámara hasta el número de serie del objetivo. En la siguiente captura de pantalla se pueden ver los metadatos de una imagen en nautilus (botón derecho -> propiedades -> pestaña de imagen) y en un álbum público en picasa:

exif en nautilus y picasaweb

EXIF en nautilus y picasaweb

Programas como Shotwell o Picasa son capaces de gestionar bibliotecas de imágenes ordenándolas por distintos campos. Al ordenar las fotos por fecha se accede al metadato EXIF que contiene la fecha y hora en la que fue tomada. Sin embargo, si la cámara no tenía la hora correcta, el resultado de la ordenación no será el adecuado.

Una forma de solucionarlo es localizar dos fotos que se hayan tomado en el mismo momento (o en un tiempo cercano), acceder a los metadatos EXIF de cada foto para calcular la diferencia de tiempo entre ellas y luego modificar todas las fotos que sean de esa cámara para adecuarlas al horario correcto.

En la siguiente captura de pantalla se pueden ver los metadatos de dos imágenes que se hicieron en el mismo momento con cámaras distintas, que tenían configurados horas distintas.

Diferentes horas

Diferentes horas

La solución sería sumar 40 mintuos a los metadatos de las fotos realizadas con la Nikon D50 (imagen de la derecha) o restar 40 minutos a los metadatos de las fotos realizadas con la Nikon D5000 (imagen de la izquierda).

Para ello se puede utilizar el programa exiv2, que permite acceder y manipular cualquier campo de los metadatos EXIF. Se puede descargar desde la sección de descargas de su página web oficial o utilizando un gestor de paquetes (por ejemplo apt-get):

sudo apt-get install exiv2

Utilizando el parámetro “pr” se puede imprimir por pantalla la información de la foto:

exiv2 pr archivo.JPG

Mientras que si utilizamos el parámetro “ad” se pueden modificar sus metadatos. Por ejemplo, para sumar 40 minutos a la fecha de realización de la foto:

exiv2 ad -a 00:40:00 DSC_0239.JPG

Por supuesto, otras combinaciones son posibles, tan solo hay que revisar la ayuda tecleando:

exiv2 – – help

Además, se pueden utilizar expresiones regulares para aplicar los cambios a carpetas enteras o a subconjuntos de archivos dentro de una carpeta:

exiv2 add -a -01:15:00 DSCF*.JPG (restar 75 minutos a las imágenes que empiecen por DSCF, generalmente Fujifilm)

exiv2 rm DSC_0239.JPG (borrar todos los metadatos de la imagen seleccionada)

Una vez reajustadas las horas de las fotos seleccionadas, se pueden volver a cargar en el gestos de imágenes que más nos guste y ordenarlas por fecha obteniendo resultados mucho más agradables.

Un saludo

Página siguiente »