How to install a LAMP environment in a Ubuntu Server 13.04 in one line

Andy, Apache WarriorAnd in this case with the ‘P’ I am referring to PHP and not to Perl.

There are a lot of options (this is Linux), first one is using the tasksel tool.

For example, you can use tasksel to see the list of available tasks to install.

jtome@ubuntu:~$ sudo tasksel --list
i server        Basic Ubuntu server
i openssh-server        OpenSSH server
u dns-server    DNS server
u lamp-server   LAMP server
u mail-server   Mail server
u postgresql-server     PostgreSQL database
u print-server  Print server
u samba-server  Samba file server
u tomcat-server Tomcat Java server
u cloud-image   Ubuntu Cloud Image (instance)
u virt-host     Virtual Machine host
u ubuntustudio-graphics 2D/3D creation and editing suite
u ubuntustudio-audio    Audio recording and editing suite
u edubuntu-desktop-gnome        Edubuntu desktop
u kubuntu-active        Kubuntu Active
u kubuntu-desktop       Kubuntu desktop
u kubuntu-full  Kubuntu full
u ubuntustudio-font-meta        Large selection of font packages
u lubuntu-desktop       Lubuntu Desktop
u lubuntu-core  Lubuntu minimal installation
u mythbuntu-desktop     Mythbuntu additional roles
u mythbuntu-frontend    Mythbuntu frontend
u mythbuntu-backend-master      Mythbuntu master backend
u mythbuntu-backend-slave       Mythbuntu slave backend
u ubuntustudio-photography      Photograph touchup and editing suite
u ubuntustudio-publishing       Publishing applications
u ubuntu-desktop        Ubuntu desktop
u ubuntu-usb    Ubuntu desktop USB
u ubuntu-touch  Ubuntu touch
u ubuntustudio-video    Video creation and editing suite
u xubuntu-desktop       Xubuntu desktop
u edubuntu-dvd-live     Edubuntu live DVD
u kubuntu-active-live   Kubuntu Active Remix live CD
u kubuntu-live  Kubuntu live CD
u kubuntu-dvd-live      Kubuntu live DVD
u lubuntu-live  Lubuntu live CD
u ubuntustudio-dvd-live Ubuntu Studio live DVD
u ubuntu-live   Ubuntu live CD
u ubuntu-usb-live       Ubuntu live USB
u xubuntu-live  Xubuntu live CD
u manual        Manual package selection

Sigue leyendo

How to expand online a LVM partition in Ubuntu

This is something that I have to do several times in the last months. It is a really simple procedure but I always have to look for it in Google because I never remember the exact steps.

Context

  • An Ubuntu 11.04 server with LVM installed and configured.
  • A new hard disk added to the server (usually it is a virtual server and a virtual hard disk). For this tip I am going to assume that the new disk is /dev/sdb
  • I want to expand the root partition adding the space in the new disk.

Procedure

Create a new Physical Volume using the recently added disk…

root@server:~# pvcreate /dev/sdb

It is not necessary to create a partition table in the new disk.

Now we have to add to the Volume Group the new Physical Volume…

root@server:~# vgdisplay
--- Volume group ---
VG Name vg01
System ID
Format lvm2
Metadata Areas 2
Metadata Sequence No 5
VG Access read/write
VG Status resizable
MAX LV 0
Cur LV 2
Open LV 2
Max PV 0
Cur PV 2
Act PV 2
VG Size 17.75 GiB
PE Size 4.00 MiB
Total PE 4545
Alloc PE / Size 4545 / 17.75 GiB
Free PE / Size 0 / 0
VG UUID D9jl8R-zqxe-7wwn-3Co2-dUhu-Dnwr-aNbKpv
root@server:~# vgextend vg01 /dev/sdb

Next step is expand the Logical Volume

root@server:~# lvextend -l+2567 /dev/vg01/root

We could use the lvdisplay command to find the exact name of the Logical Volume and the total number of free Physical Extends (PE).

Last step is to resize the file system in the disk to use all the space. We could do this online without need to unmount the file system.

root@server:~# resize2fs /dev/vg01/root

You can find this procedure in multiples places in Internet, the last one I have used is this.

Bash script to create a full software development environment

I have create this (first version) script to automatize the creation of all the services related with a new software development project.

The script creates…

  • A new Subversion repository to host the source code of the project.
  • A new MySQL database to store the data of the Trac instance.
  • A new instance of Trac, linked to the just created Subversion repository, to be used like the project’s portal.
  • A configuration file for Apache2 in order to made accesible the Trac repository.

The structure of the new Subversion repository is as follows:

-> branches
-> tags
-> trunk
   -> docs
   -> src

The environment used was the following

  • Ubuntu Server 11.04 64 bits
  • Apache/2.2.17 (installed from the Ubuntu repositories)
  • MySQL Server 5.1.541ub (installed from the Ubuntu repositories)
  • Subversion 1.6.12 (installed from the Ubuntu repositories)
  • Python 2.7.1+ (installed from the Ubuntu repositories)
  • Trac 0.12

TODO

  • Implement checking to ensure that the different elements do not exists before trying to create them (for example the Subversion repository, or the MySQL database).
  • Implement the installation of the Subversion hooks that ensure that the Trac instance keeps in sync with the Subversion repository
#!/bin/bash

# Author: Jorge Tomé Hernando <jorge@jorgetome.info>
# Date: August 2011
# Version: 1.0
#
# Description
# -----------
# This scripts creates all the environment needed to support
# a new software development project.
#
# It creates a new Subversion repository, a new Trac instance
# (and the associated MySQL database) and a configuration file
# for the Apache2 web server.
#
# It also restart the Apache2 server in order to apply the new
# configuration.
#
# It has been developed and tested in an Ubuntu 11.04 environment.

usage()
{
    cat<<EOF
usage:$0 options

This script creates a new support environment for a software
development project including: Subversion repository and
Trac instance.

Options:
-h Shows this message
-p Name of the project
-u User name of the project's administrator
EOF
}

if [[ $EUID -ne 0 ]]; then
    echo "This script must be run as root" 1>&2
    exit 1
fi

PROJECT_NAME=
PROJECT_ADMIN=

while getopts ":hp:u:" opt; do
    case $opt in
        h)
            usage
            exit 1
            ;;
        p)
            PROJECT_NAME=$OPTARG
            ;;
        u)
            PROJECT_ADMIN=$OPTARG
            ;;
        ?)
            usage
            exit
        ;;
    esac
done

if [ -z $PROJECT_NAME ] || [ -z $PROJECT_ADMIN ]
then
    usage
    exit 1
fi

# Configuration variables
SVN_HOME=/srv/svn
TRAC_HOME=/srv/trac
DB_PREFIX=trac_
DB_USR=MyUserForTrac
DB_PWD=MyPasswordForTheUserForTrac
DB_HOST=localhost
DB_PORT=3306
APACHE_USR=www-data
APACHE_CONF_DIR=/etc/apache2/projects.d

# Utility variables
PROJECT_DIR=`echo ${PROJECT_NAME,,}`
DB_NAME=${DB_PREFIX}${PROJECT_DIR}
SVN_DIR=${SVN_HOME}/${PROJECT_DIR}
TRAC_DIR=${TRAC_HOME}/${PROJECT_DIR}

# First we create the Subversion repository
svnadmin create --fs-type fsfs ${SVN_DIR}
svn mkdir -m "Initialization of the repository" \
--parents \
file://${SVN_DIR}/trunk/docs \
file://${SVN_DIR}/trunk/src \
file://${SVN_DIR}/branches \
file://${SVN_DIR}/tags

# Second we have to create the MySQL database to support Trac
mysql -u root -p <<QUERY_INPUT
CREATE DATABASE ${DB_NAME};
GRANT ALL PRIVILEGES ON ${DB_NAME}.* TO ${DB_USR}@${DB_HOST} IDENTIFIED BY '${DB_PWD}';
QUERY_INPUT

# Third we have to create the Trac instance
trac-admin ${TRAC_DIR} initenv ${PROJECT_NAME} mysql://${DB_USR}:${DB_PWD}@${DB_HOST}:${DB_PORT}/${DB_NAME}
trac-admin ${TRAC_DIR} repository add ${PROJECT_DIR} ${SVN_DIR} svn
trac-admin ${TRAC_DIR} repository resync ${PROJECT_DIR}
trac-admin ${TRAC_DIR} permission add ${PROJECT_ADMIN} TRAC_ADMIN
trac-admin ${TRAC_DIR} deploy ${TRAC_DIR}/deploy

# Fourth we have to create the Apache2 configuration file
cat > ${APACHE_CONF_DIR}/${PROJECT_DIR}.conf <<EOF
WSGIScriptAlias /trac/${PROJECT_DIR} ${TRAC_DIR}/deploy/cgi-bin/trac.wsgi

<Directory ${TRAC_DIR}/deploy/cgi-bin>
    WSGIApplicationGroup %{GLOBAL}
    Order deny,allow
    Allow from all
</Directory>http://www.jorgetome.info/bash-script-to-create-a-full-software-development-environment.html  

<Location "/trac/${PROJECT_DIR}/login">
    AuthType Basic
    AuthName "Trac"
    AuthUserFile /srv/trac/.htpasswd
    Require valid-user
</Location>
EOF

# Last we have to adjust the permissions on the directories and
# restart the web server
chown -R ${APACHE_USR}:${APACHE_USR} ${SVN_DIR} ${TRAC_DIR}
apache2ctl restart

Resumiendo los principios de diseño de la construcción de software

Hoy he tenido que hacer el ejercicio de resumir los principios de diseño que yo creo que deben dirigir un proceso de construcción de software. Después de bastante reflexión me he quedado sólo con cuatro. Los siguientes:

  1. KISS (Keep it simple, stupid). Creo que nunca valoraremos lo suficiente el valor de simplificar todo lo posible los sistemas que construimos.
  2. No construyas si puedes usar algo que ya existe.
  3. Entrega (parte de) el producto cuanto antes a sus usuarios, sigue construyéndolo apoyándote en los comentarios de los usuarios.
  4. La interfase del usuario debe ser web, siempre.
  5. La interfase del usuario es un animal totalmente distinto. Debe diseñarla y construirla un equipo de especialistas en interfases de usuario y debe estar totalmente desacoplada de la lógica de la aplicación.

¿Qué opináis?.

VMware Converter 4, pesadillas.

Solo una nota rápida acerca de VMware Converter 4.

VMware Converter es una herramienta gratuita de VMware que nos permite convertir máquinas virtuales de unos formatos a otros. Es muy útil en entornos mixtos en los que tienes máquinas en distintos formatos: VMware Server 1.x, VMware Server 2.x, VMware ESX, etc..

Yo ya lo había utilizado en alguna ocasión y había funcionado sin problemas, ahora viene la pesadilla…

Hace unas semanas recibí un disco duro externo que contenía unas máquinas virtuales en formato OVF, después de descubrir qué era el dichoso formato me bajé la última versión del VMware Converter, la 4.0.1, para convertir las máquinas en cuestión a formato VMware Server 1.x, que es el  que utilizamos en nuestros servidores.

Las máquinas eran grandes (relativamente), desde los 40 GB a los 150 GB. No disponía de dicho espacio libre en ninguno de mis ordenadores así que pensé convertir las máquinas desde el disco duro externo en las que las tenía (de 2 TB de tamaño) hacia el mismo disco duro externo ya que tenía más de 1 TB de espacio disponible, vamos, que por espacio no será 🙂

Bueno, pues el amigo VMware Converter se empeñaba en decirme que no disponía de espacio suficiente para realizar la conversión. Probé todo lo que se me ocurrió, incluso a cambiar el punto de montaje del disco duro externo ya que contenía un espacio en el nombre y pensé que sería la típica situación en la que el software no “digiere” correctamente ubicaciones con espacios en el nombre. No funcionó.

Lo probé en distintos ordenadores, en distintos sistemas operativos (MS Windows XP Profesional, Ubuntu), con distintas combinaciones de discos (por si acaso al VMware Converter no le gustaba que el origen y el destino estuviesen en un disco externo). No funcionó nada.

En una de las muchas búsquedas  que hice en Google al respecto llegué al blog de Shan Wildermuth en el que hay un artículo comentando distintos problemas que él también ha sufrido con VMware Converter y uno de  ellos el mismo que estaba sufriendo yo. ¡¡Aleluya!!, ¡¡también explicaba el motivo y la solución!!

Bueno, pues en un alarde de calidad en la programación, resulta que el VMware Converter utiliza como directorio temporal para las tareas de conversión, no el directorio temporal que todos los sistemas operativos asignan a los usuarios, sino el directorio desde el que arrancas el puñetero VMware Converter.

Claro, en todas mis pruebas había lanzado el VMware Converter desde el menú, es decir, desde el directorio en el que está instalado el programa, que, para más INRI, en todos los equipos en los que había hecho pruebas no disponía del espacio suficiente (más de 30 GB) para que el VMware Converter pudiera realizar la conversión.

Solución, abrir una consola de comandos, situarse en un disco/directorio en el que haya suficiente espacio libre (yo me ubiqué en el disco duro externo) y desde ahí lanzar el programa. Problema resuelto.

Si a alguno le pilla cerca el programador responsable de tal desaguisado que le de un cate de mi parte 🙂

O a su superior que no le dio el tiempo suficiente para probar en condiciones el programa 😉