Automatiseer het installeren van drupal op ubuntu voor drupal trainingsdoeleinden
Deze post zal uitleggen hoe de drupal installatie te automatiseren op een development environment middels een stack installer script.
We gebruiken het script om een drupal training te versnellen. Met het script en het installeer profiel kunnen we heel snel een development werkstation opzetten. Waardoor we meer tijd over hebben om naar belangrijke zaken te kijken.
Het geeft ons tevens de kans om de kracht van drupal distributies uit te leggen. Het feit dat drupal in staat is om als een ander product geïnstalleerd te worden door middel van een installatie profiel geeft het een voorsprong op andere concurerende opensource cms.
Dit kan interessant zijn voor grotere (onderneming) klanten die producten willen ontwikkelen bovenop drupal gebruik van install profiles. Meer over distributies en install profiles kan hier gevonden worden (http://drupal.org/node/326175 and to follow http://www.drupaldistrowatch.com)
Installeren
We veronderstelde dat er reeds een ubuntu geïnstalleerd was. Zo niet is het installeren van het besturingssysteem belangrijk. Ga naar de ubuntu website (http://www.ubuntu.com/desktop/get-ubuntu/download), download en installeer het.
Het installatie script configureert de LAMP stack voor drupal, installeert APC, drush, drush maakt en zet een database voor uw drupal op. Hierna lanceren we de make file die alle benodigde codes voor uw drupal download. Nu zal het script het drupal file systeem configureren, de machtigingen opzetten en de drupal installatie prifiel en bronnen kopiëren.
voer het script uit :
./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 "Starting Drupal install..." color_echo "Installing Debian/Ubuntu packages..." apt-get --yes install apache2 php5 php-pear php5-dev php5-gd mysql-server-5.0 php5-mysql mysql-client wget curl color_echo "Setting up the Apache mod_rewrite for Drupal clean urls..." a2enmod rewrite color_echo "Setting up the Apache mod_expires for Apache Cache-Control directive..." a2enmod expires color_echo "Setting up the Apache mod_deflate to save bandwidth..." 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 "Adding PEAR package: progress bars on upload..." pecl install uploadprogress sed -i '/; extension_dir directive above/ a\ extension=uploadprogress.so' /etc/php5/apache2/php.ini color_echo "Installing 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 "Reloading mysql..." #/etc/init.d/mysql force-reload color_echo "Reloading 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 "Creating the MySQL database for drupal on 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 "Executing make file..." /opt/drush/drush make ./multimediabs.make $drupal_path color_echo "Creating additional Drupal directories and files..." 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 "Copying Drupal profile and installer translation files..." cp ./multimediabs.profile $drupal_path/profiles/multimediabs/ cp -R $resources_dir/translations $drupal_path/profiles/multimediabs/ color_echo "Copying and completing the Drupal settings file..." 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 "Copying jquery.ui to module folder..." cp -R $resources_dir/jquery.ui $drupal_path/sites/all/modules/contrib/jquery_ui/jquery.ui color_echo "Setting the work files and directories as writable..." chmod 777 $drupal_path/sites/default/files chmod 777 $drupal_path/sites/default/tmp chmod 777 $drupal_path/sites/default/settings.php color_echo "Copying the drush config file..." cp $resources_dir/drushrc.php $drupal_path/ color_echo "Restarting apache..." apachectl restart #color_echo "Installing 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 "*) creating an Apache virtual host for $drupal_instance_name with path $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 "To complete the installation you must:" color_echo color_echo '*) add the drush command to the PATH:' color_echo " export PATH=$drush_install_dir:\$PATH" color_echo color_echo '*) Change your error settings in php.ini to : error_reporting = E_ALL & ~E_DEPRECATED & ~E_NOTICE' color_echo color_echo "*) Create an entry in /etc/hosts : 127.0.0.1 $drupal_instance_name" color_echo color_echo "*) Update the virtual host file /etc/apache2/sites-available/$drupal_instance_name" color_echo "create a symlink ln -s /etc/apache2/sites-available/$drupal_instance_name /etc/apache2/sites-enabled/$drupal_instance_name" color_echo "restart apache with : sudo apachectl restart" color_echo color_echo "Open your browser, go to http://$drupal_instance_name and start the 'multimediabs' pressflow install profile" color_echo color_echo "You can then add code and modules in the Drupal instance directory in $drupal_path ." #color_echo #color_echo "Add this to php.ini to make xhprof run extension=xhprof.so and xhprof.output_dir=\"/var/tmp/xhprof\" and restart server"
Het maak bestand.
; $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 ; ---------
Nu moet u nogsteeds uw drush PATH instellen, error reporting settings in php.ini, een entry in de hosts file en een vhost. Dit gebeurd niet automatisch omdat het dev station misschien voor andere projecten gebruikt wordt en we willen niet aan deze instellingen komen. Merk tevens op dat drush en drush make versies hard coded zijn in het script. Dit is om ervoor te zorgen dat iedereen dezelfde versie van alles heeft zodat we geen tijd zouden verliezen in het trainen op het traceren van versie specifieke problemen.
Nadat u alle noodzakelijke zaken heeft opgezet opent u de browser en gaat u naar uw drupal site. Daar kunt u dit eenvoudige installatie profiel selecteren wat u in staat stelt een taal te selecteren.
<?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($updates, NULL, array());
$batch = l10n_update_batch_multiple($updates, LOCALE_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')", $rid, implode(', ', $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');
}
?>
Het gebruiken van dit script voor het automatiseren van de installatie is snel maar is niet de enige oplossing.
Hier zijn wat andere mogelijkheden:
Drubuntu
U kunt het script hier krijgen (http://drupal.org/drubuntu). Het werkt goed. Het installeert een hoop dingen(project page) maar er is daar niet veel transparantie. Wat betekend dat tenzij je alle code leest om te zien wat het daadwerkelijk doet en waar het alles plaatst, welke versies,... je niet echt weet wat er gebeurd. merk op dat het best veel met je systeem doet, misschien wilt u bepaalde dingen niet, maar er zijn geen mogelijkheden beschikbaar.
Het heeft echter wel enkele krachtige mogelijkheden. Naast wat u op de project page vindt, levert het drush commands om een site op te zetten, op een sandbox te creëren. Het ziet eruit als een geweldige tool maar het is niet erg gedocumenteerd. Dus voor beginners kan het iets te gecompliceerd zijn.
Quickstart
Nog een andere optie is het werken in een vbox. U heeft http://drupal.org/project/quickstart om te gebruiken. Het heeft redelijk wat geïnstalleerd (lamp stack, drush, eclipse, netbeans, ...). Het is gemakkelijk in gebruik. Wanneer u de browser opent zult u alles zien wat u nodig heeft. Het werkt heel goed, maar het gaat ervan uit dat u in een vbox werkt. Ik hou heel erg van de achterliggende filosofie waarbij uw instance niet vervuild wordt, elk project heeft zijn eigen omgevingen en het is gemakkelijk om een vbox te delen met andere ontwikkelaars. Ik gebruik het dagelijks voor persoonlijke ontwikkeling.
Acquia
Natuurlijk is er de Acquia drupal, die tevens als een stack installer op alle platforms komt. U kunt het hier krijgen (http://network.acquia.com/downloads).
Buildkit
Gecreëerd door development seed een install profile om distributie te maken en drupal sites. (http://drupal.org/project/buildkit)
Het volgt de logica zoals de install profile dat wij gebouwd hebben een gemakkelijke eenvoudige setup om snel aan de slag te kunnen. Echter dit is alleen een install profile, het heeft geen server setup. (Merk op dat het alleen D7 ondersteunt)
Conclusie
Er is veel gedaan rondom de automatisering van de drupal installatie, u zou het wanneer mogelijk moeten gebruiken om uzelf en andere wat tijd te besparen. Kies degene die het beste bij uw wensen past.
Voor ons installeerde drubuntu teveel en wat het te ingrijpend, quickstart was geen optie omdat we een machine tot onze beschikking hadden wat we moesten gebruiken, acquia komt met acquia drupal wat we niet wilde en buildkit was drupal 7 en de training was gelevered voor D6, dus eindigde we met het maken van dit lightweight script dat de LAMP stack configureert en onze localiseerbare pressflow drupal installeert.
BRONNEN:Het script en de benodigde bronnen kunnen verkregen worden op gihub. (https://github.com/dominiquedc/drupal-stack-installer-mbs)
VOLGENDE:In de volgende post meld ik hoe de training van twee dagen deze installer te gebruiken ging.
Reactie toevoegen