Módulo de Puppet para MySQL

Nota: esta entrada también la publiqué en inglés en mi blog. If you are an english reader, you may want to check it.

Continuando con los móldulos de Puppet que hemos publicado en la cuenta de GitHub de OSOCO, hoy hablaré del módulo de Puppet para MySQL, que me ha parecido uno de los más útiles cuando hemos creado nuestras infraestructuras :-) .

Hay cantidad de módulos MySQL ya publicados, pero los que probé antes de crear el nuestro eran muy potentes, y por lo tanto complejos y con muchas dependencias. En este caso, quería intentar conseguir justo lo contrario: un módulo sencillo que símplemente funcionase a la hora de hacer las tareas más comunes relacionadas con MySQL: instalarlo, establecer la password de root, crear bases de datos y permitir el acceso de usuarios a las mismas.

Para usar el módulo símplemente debes añadirlo a tus módulos (en nuestro caso usamos Puppet Librarian para la gestión de dependencias) y declarar los recursos que necesitas. El siguiente ejemplo muestra nuestra configuración de MySQL para el nodo que es responsable de hospedar a Jenkins:

class ci_mysql {

    mysql::database { 'someProjectTestDB': }
    mysql::database { 'anotherProjectTestDB': }

    $test_user_name = 'test'
    $test_user_pwd = 'test'

    mysql::user { 'someProjectTestDB-test-user':
        user => "$test_user_name",
        password => "$test_user_pwd",
        database => 'someProjectTestDB',
        host => '%'
    }

    mysql::user { 'anotherProjectTestDB-test-user':
        user => "$test_user_name",
        password => "$test_user_pwd",
        database => 'anotherProjectTestDB',
        host => '%'
    }

    mysql::user { 'anotherProjectTestDB-readonly-user':
        user => 'readonlyuser',
        password => 'readonlyuser',
        database => 'anotherProjectTestDB',
        privileges => 'SELECT'
    }
}

Sólo con eso se instalará el servidor de MySQL y será lanzado como un servicio. Además se crearán dos bases de datos (someProjectTestDB y anotherProjectTestDB) con un usuario con todos los permisos de acceso (de nombre test). Finalmente, el usuario readonlyuser tendrá acceso a la base de datos anotherProjectTestDB, pero sólo podrá hacer consultas de tipo select. Directo y sencillo :) .

La clase también puede ser configurada con los siguientes parámetros opcionales:

class ci_mysql {
   class { "mysql::install":
      version => "5.1.61-0+squeeze1",
      root_pwd => "myFancyRootPassword",
      data_dir => "/mnt/mysql/datadir",
   }   
   ...
}

De esa manera puedes especificar la versión de MySQL, la contraseña del root, y el directorio de datos que usará MySQL para guardar las bases de datos. Por último, añadir que este módulo lo hemos probado tanto en Debian como en Gentoo (por lo que debería funcionar bien en Ubuntu).