Automatiser l'installation de Drupal sur Ubuntu à des fins de formation Drupal

Posted by: 
Dominique De Cooman

Ce post vous explique comment automatiser l'installation de Drupal sur un environnement de développement en utilisant un script d'installation.

On a utilisé le script pour accélérer un programme de formation Drupal. Avec le scénario et le profil de l'installation, on peut mettre en place un poste de développement très rapidement. Ceci nous laisse plus de temps à consacrer à des choses importantes.

Cela nous permet aussi d'expliquer les fonctionnalités des distributions Drupal. Le fait que Drupal est capable d'être installé différemment en fonction du profil d'installation lui donne un avantage sur les autres CMS concurrents Opensource. Cela pourrait être intéressant pour les grands (entreprises) clients qui veulent développer des produits basés sur Drupal en utilisant des profils d'installation différents.

Pour en savoir plus sur les distributions et les profils d'installation http://drupal.org/node/326175 et http://www.drupaldistrowatch.com

Installation

On suppose que Ubuntu est déjà installé. Sinon, l'installation du système d'exploitation est trivial. Allez sur le site ubuntu (http://www.ubuntu.com/desktop/get-ubuntu/download), téléchargez le et installez le.

Le script d'installation configure la pile LAMP pour Drupal, installe APC, drush, le make de drush et met en place une base de données pour nos projets Drupal. Après cela, on lance le fichier make qui télécharge tout le code nécessaire pour Drupal. Maintenant, le script va configurer le système de fichiers Drupal, mettre en place les permissions et copier le profil d'installation Drupal et les autres ressources.

Exécuter le script:

./mbs_drupal_installer.sh drupal_instance_name mysql_existing_power_user mysql_power_user_password

#!/bin/bash
 
#!/bin/bash
 
color_echo()
{
	text_reverse_bold="$(tput rev) $(tput bold)"
	text_normal="$(tput sgr0)"
 
	echo "${text_reverse_bold}$*${text_normal}"
}
 
 
if [ $UID != 0 ]
then
	echo "This script must be run by root".
	exit 1
fi
 
if [ $# != 3 ]
then
	echo "Usage  : $0 drupal_instance_name mysql_existing_power_user mysql_power_user_password"
	echo "Example: $0 mywebsite root \"\""
	echo "Example: $0 mywebsite mysqlpoweruser secretpassword"
	exit 2
fi
 
home_dir=$(dirname $0)
bin_dir=$home_dir/bin
 
drupal_instance_name=$1
mysql_existing_power_user=$2
mysql_power_user_password=$3
 
color_echo "Début de l'installation de Drupal..."
 
color_echo "Installation des packages Debian/Ubuntu..."
apt-get --yes install apache2 php5 php-pear php5-dev php5-gd mysql-server-5.0 php5-mysql mysql-client wget curl
 
color_echo "Configuration du mod_rewrite d'Apache pour les URL de Drupal..."
a2enmod rewrite
 
color_echo "Configuration du mod_expires Apache pour la directive Cache-Control d'Apache..."
a2enmod expires
 
color_echo "Configuration du mod_deflate d'Apache pour économiser la bande passante..."
a2enmod deflate
sed -i 's|DEFLATE text/html text/plain text/xml|DEFLATE text/html text/plain text/xml text/css text/javascript application/x-javascript|' /etc/apache2/mods-available/deflate.conf
 
 
color_echo "Ajout du package PEAR package: barre de progression pendant les téléchargements..."
pecl install uploadprogress
sed -i '/; extension_dir directive above/ a\
extension=uploadprogress.so' /etc/php5/apache2/php.ini
 
color_echo "Installation de APC php opcode cache..."
pecl install apc
sed -i '/; extension_dir directive above/ a\
extension=apc.so' /etc/php5/apache2/php.ini
 
 
#sed -i 's/query_cache_limit       = 1M/query_cache_limit       = 1M\
#query_cache_type        = 1/' /etc/mysql/my.cnf
#echo "Redémarrage de mysql..."
#/etc/init.d/mysql force-reload
 
color_echo "Redémarrage d'Apache..."
/etc/init.d/apache2 force-reload
 
drush_extract_dir=/opt
drush_install_dir=$drush_extract_dir/drush
color_echo "Installing drush in $drush_install_dir ..."
resources_dir=$home_dir/resources
tar xvf $resources_dir/drush-6.x-3.3.tar.gz -C $drush_extract_dir
cp $resources_dir/Console_Table-1.1.3/Table.php $drush_install_dir/includes/table.inc
 
#Installing drush make
drush_make_extract_dir=~/.drush
mkdir $drush_make_extract_dir
tar xvf $resources_dir/drush_make-6.x-2.2.tar.gz -C $drush_make_extract_dir
 
color_echo "Création de la base de données MySQL pour Drupal sur localhost ..."
$bin_dir/create_database.sh $drupal_instance_name $mysql_existing_power_user $mysql_power_user_password
 
drupal_path="/var/www/$drupal_instance_name"
color_echo "Installing drupal in $drupal_path ..."
 
color_echo "Execution du make file..."
/opt/drush/drush make ./multimediabs.make $drupal_path
 
color_echo "Creation des répertoires et fichiers additionels de Drupal..."
mkdir $drupal_path/profiles/multimediabs
mkdir $drupal_path/sites/all/themes
mkdir $drupal_path/sites/all/modules/custom
mkdir $drupal_path/sites/all/modules/contrib_patched
touch $drupal_path/sites/all/modules/contrib_patched/patches.txt
mkdir $drupal_path/sites/default/files
mkdir $drupal_path/sites/default/tmp
 
color_echo "Copie du profil Drupal et installation des fichiers de traduction..."
cp ./multimediabs.profile $drupal_path/profiles/multimediabs/
cp -R $resources_dir/translations $drupal_path/profiles/multimediabs/
 
color_echo "Copie et complétion des fichiers de paramétrage de Drupal..."
cp $drupal_path/sites/default/default.settings.php $drupal_path/sites/default/settings.php
cat $resources_dir/settings_snippet.php >> $drupal_path/sites/default/settings.php
 
color_echo "Copie de jquery.ui dans le dossier du module..." 
cp -R $resources_dir/jquery.ui $drupal_path/sites/all/modules/contrib/jquery_ui/jquery.ui
 
color_echo "Paramétrage de l'accès en écriture des fichiers et dossiers de travail..." 
chmod 777 $drupal_path/sites/default/files
chmod 777 $drupal_path/sites/default/tmp
chmod 777 $drupal_path/sites/default/settings.php
 
color_echo "Copie du fichier de config de drush..."
cp  $resources_dir/drushrc.php $drupal_path/
 
color_echo "Redémarrage d'Apache..."
apachectl restart
 
#color_echo "Installation de xhprof"
 
#pecl download xhprof-0.9.2
#tar -xvf xhprof-0.9.2.tgz -C /var/tmp
#cd /var/tmp/xhprof-0.9.2/extension
#phpize
#./configure
#make
#make install
#make test
 
#cp -R /build/buildd/php5-5.3.3/pear-build-download/xhprof-0.9.2/xhprof_html /var/www/xhprof
#ln -s /build/buildd/php5-5.3.3/pear-build-download/xhprof-0.9.2/xhprof_html /var/www/xhprof
#mkdir /var/tmp/xhprof
#chmod 777 /var/tmp/xhprof
 
color_echo "*) creation d'un host virtuel pour Apache pour $drupal_instance_name avec le chemin $drupal_path"
cp $resources_dir/vhost /etc/apache2/sites-available/
sed -i "s/multimediabs/$drupal_instance_name/g" /etc/apache2/sites-available/$drupal_instance_name
 
color_echo
color_echo "Afin de compléter l'installation, vous devez:"
color_echo
color_echo '*) ajouter la commande drush au PATH:'
color_echo "  export PATH=$drush_install_dir:\$PATH"
color_echo
color_echo '*) Changer le paramètrage d'erreur dans php.ini à : error_reporting = E_ALL & ~E_DEPRECATED & ~E_NOTICE'
color_echo
color_echo "*) Créer une entrée dans /etc/hosts : 127.0.0.1      $drupal_instance_name"
color_echo
color_echo "*) Mise à jour du fichier virtual host /etc/apache2/sites-available/$drupal_instance_name"
color_echo "Création d'un symlink ln -s /etc/apache2/sites-available/$drupal_instance_name /etc/apache2/sites-enabled/$drupal_instance_name"
color_echo "Redémarrage d'Apache avec : sudo apachectl restart"
color_echo
color_echo "Ouvrir le navigateur, allez dans http://$drupal_instance_name et démarrer 'multimediabs' cliquer sur 'flow install profile'"
color_echo
color_echo "Vous pouvez maintenant ajouter du code et des modules dans le répertoire de l'instance de Drupal $drupal_path ."
#color_echo
#color_echo "Ajouter ceci au fichier php.ini en faisant xhprof run extension=xhprof.so et xhprof.output_dir=\"/var/tmp/xhprof\" et redémarrer le serveur"

Le fichier make.

; $Id$
;
; ----------------
; Multimediabs Make file
; ----------------
 
 
; Core version
; ------------
; Each makefile should begin by declaring the core version of Drupal that all
; projects should be compatible with.
 
core = 6.x
 
; API version
; ------------
; Every makefile needs to declare its Drush Make API version. This version of
; drush make uses API version `2`.
 
api = 2
 
; Core project
; ------------
; In order for your makefile to generate a full Drupal site, you must include
; a core project. This is usually Drupal core, but you can also specify
; alternative core projects like Pressflow. Note that makefiles included with
; install profiles *should not* include a core project.
 
; Use Pressflow instead of Drupal core:
projects[pressflow][type] = "core"
projects[pressflow][download][type] = "get"
projects[pressflow][download][url] = "<a href="http://launchpad.net/pressflow/6.x/6.20.97/+download/pressflow-6.20.97.tar.gz"
">http://launchpad.net/pressflow/6.x/6.20.97/+download/pressflow-6.20.97.t...</a>  
 
; Modules
; --------
projects[admin_menu][subdir] = contrib
projects[vertical_tabs][subdir] = contrib
 
projects[cck][subdir] = contrib
projects[filefield][subdir] = contrib
projects[imagefield][subdir] = contrib
projects[date][subdir] = contrib
projects[jquery_ui][subdir] = contrib
projects[imageapi][subdir] = contrib
projects[imagecache][subdir] = contrib
 
projects[views][subdir] = contrib
 
projects[features][subdir] = contrib
projects[diff][subdir] = contrib
 
projects[pathauto][subdir] = contrib
projects[token][subdir] = contrib
 
projects[i18n][subdir] = contrib
projects[l10n_update][subdir] = contrib
projects[l10n_client][subdir] = contrib
 
 
;Development modules
projects[devel][subdir] = contrib
projects[coder][subdir] = contrib
projects[devel_themer][subdir] = contrib
projects[schema][subdir] = contrib
projects[install_profile_api][subdir] = contrib
projects[update_api][subdir] = contrib
projects[module_builder][subdir] = contrib
 
; Themes
; --------
 
 
; Libraries
; ---------

Maintenant, vous avez encore besoin de définir votre PATH drush, les paramètres de rapport d'erreurs dans le fichier php.ini, une entrée dans le fichier hosts et un vhost. Ce n'est pas fait automatiquement parce que la station de développement peut être utilisée pour d'autres projets et nous ne voulons pas interférer avec ces paramètres. Notez également que drush et le make drush des versions sont codées en dur dans le script. Ceci est pour s'assurer que tout le monde avait la même version afin d'éviter de perdre du temps pendant la formation sur le dépistage des problèmes de versions spécifiques.

Après la configuration de toutes les mesures nécessaires, vous devrait ouvrir le navigateur et allez sur votre site Drupal. Il vous permet de sélectionner le profil d'installation simple qui vous permet de sélectionner la langue.

<?php
function multimediabs_profile_modules() {
  return array(
    
// core modules
    
'menu''search''taxonomy''path''update''syslog''comment''locale''dblog',

    
// cck
    
'content''filefield''text''imagefield''date_api''date''date_popup''jquery_ui'

    
// imagecache
    
'imageapi''imageapi_gd''imagecache''imagecache_ui',


    
// pathauto,
    
'pathauto''token',

    
// views
    
'views''views_ui',

    
// admin improvements
    
'admin_menu''vertical_tabs',
    
    
//IPP
    
'features''diff',
    
    
//Languages
    
'i18n''l10n_update''l10n_client'
    
    
// devel tools
    
'coder''schema''install_profile_api''update_api''module_builder',
  );
}

function 
multimediabs_profile_details() {
  return array(
    
'name' => 'Multimediabs pressflow',
    
'description' => 'Installation drupal multimediabs Tours.'
  
);
}

function 
multimediabs_profile_task_list() {
  
$tasks = array();
  
  if (
_l10n_install_language_selected()) {
    
$tasks['l10n-install-batch'] = st('Download and import translations');
  }
   
  return 
$tasks;
}

function 
multimediabs_profile_tasks(&$task$url) {
  global 
$install_locale;
  
  
install_include(multimediabs_profile_modules());
  
  if (
$task == 'profile') {
    
// Perform the default profile install tasks.
    
include_once('profiles/default/default.profile');
    
default_profile_tasks($task$url);
    
    
// administration theme
    
variable_set('admin_theme''garland');
    
variable_set('node_admin_theme'TRUE);

    
// user registration
    
variable_set('user_register'FALSE);

    
// hide all Garland blocks
    
db_query("UPDATE {blocks} SET status = 0 WHERE theme = 'garland'");

    
// image quality
    
variable_set('image_jpeg_quality'100);
    
variable_set('imageapi_jpeg_quality'100);

    
// files
    
variable_set('file_directory_temp''sites/default/tmp');
    
variable_set('file_directory_path''sites/default/files');

    
// date & time
    
variable_set('configurable_timezones'0);

    
variable_set('date_format_short''d/m/Y - H:i');
    
variable_set('date_format_short_custom''d/m/Y - H:i');

    
variable_set('date_format_media''D, d/m/Y - H:i');
    
variable_set('date_format_media_custom''D, d/m/Y - H:i');

    
variable_set('date_format_long''l, j F, Y - H:i');
    
variable_set('date_format_long_custom''l, j F, Y - H:i');

    
// error reporting
    
variable_set('error_level'0);

    
// roles
    
db_query("INSERT INTO {role} (name) VALUES ('%s')"'site administrator');
    
db_query("INSERT INTO {role} (name) VALUES ('%s')"'editor');

    
// pathauto
    
variable_set('pathauto_node_pattern''');
    
variable_set('pathauto_taxonomy_pattern''');
    
variable_set('pathauto_user_pattern''');
    
variable_set('pathauto_ignore_words''');

    
// permissions
    
$admin_permissions = array('access administration menu''administer blocks''use PHP for block visibility''administer menu''access content''administer nodes''revert revisions''view revisions''administer url aliases''create url aliases''search content''use advanced search''access administration pages''access site reports''administer taxonomy''access user profiles''administer permissions''administer users');
    
$editor_permissions = array('access administration menu''administer menu''access content''administer nodes''revert revisions''view revisions''search content''use advanced search''access administration pages');
    
_multimediabs_add_permissions(3$admin_permissions);
    
_multimediabs_add_permissions(4$editor_permissions);

    
// input format permissions
    
db_query("UPDATE {filter_formats} SET roles = ',4,3,' WHERE format IN (2, 3)");

    
// hide module descriptions for admin
    
db_query("UPDATE {users} SET data = '%s' WHERE uid = 1"serialize(array('admin_compact_mode' => TRUE)));

    
// Update the menu router information.
    
menu_rebuild();

    
//Activate devel and set xhprof
    
drupal_install_modules(array('devel'));
    
    
/*
    variable_set('devel_xhprof_enabled', 1);
    variable_set('devel_xhprof_directory', '/build/buildd/php5-5.3.3/pear-build-download/xhprof-0.9.2');
    variable_set('devel_xhprof_url', '<a href="http://localhost/xhprof'">http://localhost/xhprof'</a>);
    */
    
    // Move forward to our install batch.
    
$task 'l10n-install';
  }

  
// Download and import translations if needed.
  
if ($task == 'l10n-install') {
    if (
_l10n_install_language_selected()) {
      
$history l10n_update_get_history();
      
module_load_include('check.inc''l10n_update');
      
$available l10n_update_available_releases();
      
$updates l10n_update_build_updates($history$available);

      
module_load_include('batch.inc''l10n_update');
      
$updates _l10n_update_prepare_updates($updatesNULL, array());
      
$batch l10n_update_batch_multiple($updatesLOCALE_IMPORT_KEEP);

      
// Overwrite batch finish callback, so we can modify install task too.
      
$batch['finished'] = '_l10n_install_batch_finished';

      
// Start a batch, switch to 'l10n-install-batch' task. We need to
      // set the variable here, because batch_process() redirects.
      
variable_set('install_task''l10n-install-batch');
      
batch_set($batch);
      
batch_process($url$url);
    }
  }

  if (
$task == 'l10n-install-batch') {
    include_once 
'includes/batch.inc';
    return 
_batch_page();
  }
}

function 
multimediabs_form_alter(&$form$form_state$form_id) {
  if (
$form_id == 'install_configure') {
    
$form['site_information']['site_name']['#default_value'] = 'MBS';
    
$form['site_information']['site_mail']['#default_value'] = ini_get('sendmail_from') ? ini_get('sendmail_from') : '<a href="mailto:info@orangembs.fr">info@orangembs.fr</a>';
    
$form['admin_account']['account']['name']['#default_value'] = 'admin';
    
$form['admin_account']['account']['mail']['#default_value'] = '<a href="mailto:info@orangembs.fr">info@orangembs.fr</a>';
  }
}

function 
_multimediabsformat_set_roles($roles$format_id) {
  
$roles implode(',',$roles);
  
// Drupal core depends on the list of roles beginning and ending with commas.
  
if (!empty($roles)) {
    
$roles ','$roles .',';
  }
  
db_query("UPDATE {filter_formats} SET roles = '%s' WHERE format = %d"$roles$format_id);
}

function 
_multimediabs_add_permissions($rid$perms) {
  
// Retrieve the currently set permissions.
  
$result db_query("SELECT p.perm FROM {role} r INNER JOIN {permission} p ON p.rid = r.rid WHERE r.rid = %d "$rid);
  
$existing_perms = array();
  while (
$row db_fetch_object($result)) {
    
$existing_perms += explode(', '$row->perm);
  }
  
// If this role already has permissions, merge them with the new permissions being set.
  
if (count($existing_perms) > 0) {
    
$perms array_unique(array_merge($perms, (array)$existing_perms));
  }

  
// Update the permissions.
  
db_query('DELETE FROM {permission} WHERE rid = %d'$rid);
  
db_query("INSERT INTO {permission} (rid, perm) VALUES (%d, '%s')"$ridimplode(', '$perms));
}

/**
 * Check whether we are installing in a language other than English.
 */
function _l10n_install_language_selected() {
  global 
$install_locale;
  return !empty(
$install_locale) && ($install_locale != 'en');
}

/**
 * Batch finish callback for l10n_install batches.
 */
function _l10n_install_batch_finished($success$results) {
  if (
$success) {
    
variable_set('install_task''profile-finished');
  }
  
// Invoke default batch finish function too.
  
module_load_include('batch.inc''l10n_update');
  
_l10n_update_batch_finished($success$results);

  
// Set up l10n_client and inform the admin about it.
  // @todo This message will not show up for some reason.
  
global $user;
  
variable_set('l10n_client_use_server'1);
  
variable_set('l10n_client_server''<a href="http://localize.drupal.org'">http://localize.drupal.org'</a>);
  drupal_set_message(t('Localization client is set up to share your translations with <a href="
@localize">localize.drupal.org</a>. Each participating user should have a localize.drupal.org account and set up their API key on their user profile page. <a href="@edit-profile">Set up yours</a>.', array('@localize' => '<a href="http://localize.drupal.org'">http://localize.drupal.org'</a>, '@edit-profile' => url('user/' . $user->uid . '/edit'))));
  
  //Set language defaults
  
variable_set('language_negotiation'1);
  
db_query("UPDATE {variable} SET value = '%s' WHERE name = '%s'"'O:8:"stdClass":11:{s:8:"language";s:2:"en";s:4:"name";s:7:"English";s:6:"native";s:7:"English";s:9:"direction";s:1:"0";s:7:"enabled";i:1;s:7:"plurals";s:1:"0";s:7:"formula";s:0:"";s:6:"domain";s:0:"";s:6:"prefix";s:0:"";s:6:"weight";s:1:"0";s:10:"javascript";s:0:"";}''language_default');
  
  global 
$theme_key;
  
$theme_key 'garland';
  
_block_rehash();
  
install_set_block('user''0''garland''left');
  
install_set_block('locale''0''garland''left');
}
?>

L'utilisation de ce script pour l'automatiser de l'installation la rend rapide, mais ce n'est pas la seule solution.

Voici d'autres possibilités:

Drubuntu
Vous pouvez obtenir le script ici (http://drupal.org/drubuntu). Il fonctionne très bien. Il installe des tas de choses (page projet), mais il n'y a pas beaucoup de transparance là. C'est à dire que si vous lisez tout le code pour voir ce qu'il fait et où il met tout, les versions, ... vous ne savez pas vraiment ce qu'il en est. Notez qu'il installe trop de choses sur votre système, peut-être vous n'avez pas besoin de certains composants, mais le script ne permet pas de choisir les composants à installer.

Cependant, il a quelques fonctionnalités puissantes. Outre ce que vous trouverez sur la page du projet, elle fournit des commandes drush de mise en place d'un site, afin de créer un bac à sable. Il ressemble à un outil formidable, mais il n'est pas très documentée. Donc, pour les débutants, il pourrait être un peu trop compliqué.

Quickstart
Une autre option est de travailler dans une vbox. Vous avez http://drupal.org/project/quickstart à utiliser. Il installe (pile de lampe, drush, Eclipse, Netbeans, ...). Il est facile à utiliser. Lors du lancement du navigateur, vous verrez tout ce dont vous avez besoin. Il fonctionne très bien mais il suppose que vous allez travailler dans une vbox. J'aime vraiment la philosophie derrière, chaque projet a son propre environnement et il est facile de partager une vbox avec d'autres développeurs. Je l'utilise quotidiennement pour des développements personnels.

Acquia
Bien sur vous avez Acquia Drupal, qui vient aussi comme un installateur de stack sur toutes les plateformes. Vous pouvez l'obtenir ici (http://network.acquia.com/downloads).

Buildkit
Créé par une équipe de développement, un profil d'installation pour créer des distrubtions et des sites Drupal. (http://drupal.org/project/buildkit)
Il suit le principe que le profil d'installation construit une installation facile simple à démarrer rapidement. Cependant ce n'est qu'un profil d'installation, il n'a pas de configuration du serveur. (Notez qu'il ne supporte que D7).

Conclusion
Beaucoup de travail a été effectué autour de l'automatisation de l'installation de Drupal, vous devez l'utiliser lorsque cela est possible pour vous aider vous-même et aider d'autres quand c'est nécessaire. Choisissez le script qui vous convient le mieux.

Pour nous, drubuntu a installés trop de composants et il était un peu trop intrusif, QuickStart n'était pas une option parce que nous avions une machine à notre disposition que nous avions besoin d'utiliser, Acquia est livré avec Acquia Drupal dont nous ne voulions pas et le kit d'installation concernait Drupal 7 et la formation a été présentée pour D6, donc nous avons fini par créer ce script léger qui configure la pile LAMP et installe nos drupal pressflow localisables.

RESOURCES:Le scénario et ses ressources requises, vous pouvez les obtenir sur github. (https://github.com/dominiquedc/drupal-stack-installer-mbs)

NEXT:Dans le prochain chapitre, je vais présenter comment la formation de deux jours s'est déroulée en utilisant cet installateur.

Add new comment

Who are you?


By knowing who you are you will be directed to a page where we have displayed all our drupal services relevant to your professional identity.