La gestion automatisée de tout un parc de serveurs,
De l'installation d'applications à la configuration en passant par toutes les tâches de maintenance.
Tout est automatique grâce aux playbooks Ansible.
Pré-requis: maitriser le YAML, disposer d'un environnement virtuel en Python et disposer sur son système du programme sshpass.
Pour les systèmes à base de dnf
$ sudo dnf install python3 sshpass
Pour les systèmes à base de apt
$ sudo apt install python3 sshpass
Pour les systèmes à base de zypper
$ sudo zypper install python3 sshpass
Fichier attaché | Taille |
---|---|
logo ansible | 34.32 Ko |
Pour utiliser Ansible, il est nécessaire de disposer d'un environnement virtuel Python.
Pour ce faire, rien de plus simple:
1 - Création de l'environnement virtuel dans son dossier personnel
$ cd ~
$ python3.11 -m venv ansible
2 - Activation de l'environnement virtuel et effectuer la mise à jour de l'outil python pip
$ cd ansible/
$ source bin/activate
$ python3 -m pip install -U pip
3 - Installation du module Ansible
$ python3 -m pip install -U ansible
4 - Vérifier la bonne installation de Ansible
$ ansible --version
ansible [core 2.16.7]
config file = None
configured module search path = ['/home/ronan/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
ansible python module location = /home/ronan/ansible/lib/python3.11/site-packages/ansible
ansible collection location = /home/ronan/.ansible/collections:/usr/share/ansible/collections
executable location = /home/ronan/ansible/bin/ansible
python version = 3.11.3 (main, Aug 9 2023, 09:30:45) [GCC 8.5.0 20210514 (Red Hat 8.5.0-18)] (/home/ronan/ansible/bin/python3)
jinja version = 3.1.4
libyaml = True
$ ansible -m ping localhost
[WARNING]: No inventory was parsed, only implicit localhost is available
localhost | SUCCESS => {
"changed": false,
"ping": "pong"
}
Et voilà, l'environnement virtuel Python pour Ansible est prêt et opérationnel.
Pour fonctionner, Ansible a besoin de connaitre la liste exhaustive de tous les serveurs qu'il doit administrer.
La documentation Ansible en ligne
1 - Création du fichier hosts
$ vim hosts
2 - Le contenu du fichier doit ressembler à ceci
$ cat hosts
[nginx]
SERVER1
SERVER2
[rabbitmq]
SERVER3
[glpi]
SERVER4
[docker]
SERVER5
SERVER6
[prod]
SERVER1
SERVER3
SERVER4
SERVER5
[dev]
SERVER2
SERVER6
Il est possible d'indiquer entre [...] un terme permettant de regrouper les différents serveurs en catégorie.
La commande suivante permet d'afficher tous les hosts présents dans le fichier inventaire.
$ ansible-inventory --graph
@all:
|--@ungrouped:
|--@nginx:
| |--SERVER1
| |--SERVER2
|--@rabbitmq:
| |--SERVER3
|--@glpi:
| |--SERVER4
|--@docker:
| |--SERVER5
| |--SERVER6
|--@prod:
| |--SERVER1
| |--SERVER3
| |--SERVER4
| |--SERVER5
|--@dev:
| |--SERVER2
| |--SERVER6
... d'un groupe en particulier
$ ansible-inventory --graph nginx
@nginx:
|--SERVER1
|--SERVER2
Le fichier ansible.cfg n'est pas forcément nécessaire pour l'utilisation d'Ansible, mais il est fortement conseillé pour la simplifier.
Documentation Ansible en ligne
Voici un exemple limité des principaux paramètres à renseigner.
$ cat ansible.cfg
[defaults]
inventory = ./hosts
interpreter_python = /usr/bin/python3
host_key_checking = False
log_path = ./ansible.log
remote_user = root
- On y indique l'emplacement du fichier inventaire hosts
- L'interpréteur python à utiliser sur les serveurs distants
- On ne vérifie pas les clés des serveurs distants. Cela évite d'avoir tous les serveurs de renseignés dans le fichier ~/.ssh/know_hosts
- On renseigne le fichier pour les logs
- Le user utilisé pour se connecter aux différents serveurs
Il est possible de générer automatiquement le fichier de configuration via cette commande
$ ansible-config init --disabled > ansible.cfg
Pour éviter, à chaque fois, de saisir le mot de passe (option -k) permettant de se connecter aux serveurs distants, il est possible d'utiliser une connexion par clé ssh.
La documentation Ansible en ligne
Tout est indiqué ici pour générer une clé ssh.
Une fois la clé ssh générée, il faut la copier sur tous les serveurs distants.
Pour cela, nous allons utiliser Ansible pour le faire à grande échelle.
Nous allons donc utiliser la commande authorized_key pour le faire.
$ ansible -m authorized_key -u mon_user -a "user=mon_user exclusive=true state=present key=""{{ lookup('file', '~/.ssh/id_rsa.pub') }}""" all -k
- L'option -m authorized_keys permet d'indiquer que nous souhaitons utiliser la commande authorized_keys
- L'option -u mon_user permet d'indiquer avec quel utilisateur se connecter aux serveurs distants.
- L'option -a "..." permet de renseigner les arguments nécessaires pour la commande authorized_keys. On y indique le user concerné, le terme exclusive permet d'indiquer qu'il doit y avoir une seule clé ssh d'autorisée, le terme state permet d'indiquer que la clé publique doit être présente (absent si l'on souhaite la supprimer) et enfin, le terme key permet, grâce à la fonction lookup, de copier le contenu du fichier ~/.ssh/id_rsa.pub du serveur local dans le fichier authorized_keys du ou des serveurs distants.
- Le mot clé all permet d'indiquer que l'opération doit être effectuée sur tous les hosts présents dans l'inventaire.
- L'option -k permet de saisir le mot de passe pour se connecter aux serveurs distants.
Voici quelques exemples d'utilisation des différentes commandes disponibles avec Ansible
La première commande Ansible que nous allons utiliser est la commande ping.
La documentation Ansible en ligne
Cette commande va permettre de tester si tous les serveurs sont accessibles et disponibles.
L'option -k permet de saisir le mot de passe pour se connecter aux serveurs. Le mot de passe doit être identique à tous les serveurs. Pour éviter cette manipulation, il est possible d'utiliser une connexion via une clé ssh.
L'option -m permet d'indique la commande à utiliser (ping).
Le mot clé all permet d'indiquer que nous souhaitons exécuter la commande sur tous les hosts présents dans le fichier inventaire.
$ ansible -k -m ping all
SSH password:
SERVER5 | SUCCESS => {
"changed": false,
"ping": "pong"
}
SERVER2 | SUCCESS => {
"changed": false,
"ping": "pong"
}
SERVER1 | SUCCESS => {
"changed": false,
"ping": "pong"
}
SERVER3 | SUCCESS => {
"changed": false,
"ping": "pong"
}
SERVER4 | SUCCESS => {
"changed": false,
"ping": "pong"
}
SERVER6 | SUCCESS => {
"changed": false,
"ping": "pong"
}
Si je souhaite exécuter la commande ping uniquement sur mes hosts nginx
$ ansible -k -m ping nginx
SSH password:
SERVER2 | SUCCESS => {
"changed": false,
"ping": "pong"
}
SERVER1 | SUCCESS => {
"changed": false,
"ping": "pong"
}
Rien de plus simple.
La comande setup permet d'obtenir un inventaire exhaustif des hosts de l'inventaire.
La documentation Ansible en ligne
Attention, cette commande retourne un json de plus de 1000 lignes contenant toutes les informations du ou des hosts interrogés.
Chaque clé du json peut être utilisée dans les playbooks Ansible grâce à la variable ansible_facts.
$ ansible -m setup SERVER1
SERVER1 | SUCCESS => {
"ansible_facts": {
"ansible_all_ipv4_addresses": [
"10.50.2.253",
"172.17.0.1"
],
...
"module_setup": true
},
"changed": false
}
Il est possible de filtrer directement sur un paramètre précis.
$ ansible -m setup SERVER1 -a "filter=ansible_processor_nproc"
SERVER1 | SUCCESS => {
"ansible_facts": {
"ansible_processor_nproc": 2
},
"changed": false
}
Pour info, tout comme les hosts présents dans le fichier inventaire, le serveur Ansible lui-même peut être utilisé grâce au mot clé localhost.
$ ansible -m setup localhost -a "filter=ansible_loadavg"
localhost | SUCCESS => {
"ansible_facts": {
"ansible_loadavg": {
"15m": 0.43,
"1m": 1.9,
"5m": 0.78
}
},
"changed": false
}
La commande command permet d'exécuter une commande simple.
Voir la commande shell pour des exécutions plus complexes.
La documentation Ansible en ligne
Le commande n'étant pas exécutée par l'interpréteur de commande, l'utilisation des caractères spéciaux tels que * < > | ; & ne fonctionne pas.
Quelques exemples:
$ ansible -m command -a "uptime" SERVER1
SERVER1 | CHANGED | rc=0 >>
13:37:18 up 12 days, 3:58, 2 users, load average: 0,16, 0,11, 0,25
$ ansible -m command -a "w" SERVER2
SERVER2 | CHANGED | rc=0 >>
13:41:22 up 12 days, 4:02, 2 users, load average: 0,10, 0,09, 0,20
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
user pts/0 10.99.17.12 lun.10 2.00s 1.31s 0.00s w
user pts/1 10.99.17.12 09:53 34:37 0.25s 0.01s sshd: user [priv]
$ SERVER3 -m command -a "date" SERVER3
localhost | CHANGED | rc=0 >>
mer. juin 5 13:55:55 CEST 2024
La commande shell permet d'exécuter des commandes simples mais aussi complexes et également sous forme de scripts.
Documentation Ansible en ligne
Exemples:
$ ansible -m shell -a 'find /var/log/nginx/ -type f -name "access.log*" | xargs stat --printf "%-80n%-15s%-35w\n"' nginx
SERVER2 | CHANGED | rc=0 >>
/var/log/nginx/access.log-20240116 7052050 2023-11-15 17:37:33.620096531 +0100
/var/log/nginx/access.log 10191 2024-01-16 09:28:20.137458998 +0100
SERVER1 | CHANGED | rc=0 >>
/var/log/nginx/access.log-20240116 2101711 2023-11-15 16:03:11.480149331 +0100
/var/log/nginx/access.log 22278 2024-01-16 09:29:28.959290202 +0100
$ ansible -m shell -a 'cat /etc/passwd | grep root' SERVER1:SERVER2
SERVER1 | CHANGED | rc=0 >>
root:x:0:0:root:/root:/bin/bash
SERVER2 | CHANGED | rc=0 >>
root:x:0:0:root:/root:/bin/bash
$ ansible -m shell -a 'echo "Hello world!" > /tmp/hello_world ; ls -l /tmp/hello_world ; cat /tmp/hello_world' localhost
localhost | CHANGED | rc=0 >>
-rw-r--r-- 1 user group 13 5 juin 14:20 /tmp/hello_world
Hello world!
Quelques exemples de playbooks.
Voici un template basique pour démarrer un nouveau playbook Ansible.
Le format est en YAML.
Il faut être très rigoureux concernant l'indentation.
Enormément d'erreurs sont dues à une mauvaise indentation.
La clé name permet de nommer le playbook
La clé hosts permet d'indiquer la liste des hosts présents dans l'inventaire à utiliser
La clé gather_facts permet d'obtenir un inventaire complet des hosts (true ou false)
La clé tasks permet de renseigner toutes les tâches que le playbook doit exécuter.
Concernant la clé hosts, la sélection est multiple.
Par exemple, le mot clé all permet d'indiquer la liste complète de tous les hosts.
Si je veux un host en particulier
# (attention à la casse pour les nom de hosts).hosts: SERVER1
Si je veux deux hosts
hosts: SERVER1:SERVER2
Si je veux tous les hosts exceptés le SERVER2
hosts: all:!SERVER2
Si je veux mes hosts nginx de prod
hosts: nginx:&prod
Voici un template plus élaboré pour démarrer un nouveau playbook Ansible et prenant en compte des variables.
Quelques petites explications:
- gather_facts (true/false) permet d'obtenir l'inventaire du ou des hosts
- gather_subset (liste exhaustive) permet d'obtenir des informations supplémentaire concernant le ou les hosts
- become (true/false) permet d'obtenir les droits SUDO
- serial (true/false) permet d'indiquer s'il faut exécuter les tâches en série, host par host ou simultanément sur tous les hosts
- collections permet d'inclure des plugins Ansible supplémentaires
- vars permet d'inclure différentes variables (string, int, dict, list)
- vars_prompt permet d'inclure des variables initialisées par un prompt lors de l'exécution du playbook
- pre_tasks permet d'exécuter des tâches avant l'exécution des tâches du playbook (j'inclus des variables globales grâce à include_vars)
Pour info, la commande lookup('pipe', ...) permet de récupérer le résultat de la sortie standard de la commande passée en paramètre.
Plus d'info ici
Erreur rencontrée :
Après une mise à jour d'Apache sur mon serveur, celui-çi ne voulait plus redémarrer avec cette erreur en retour.
Invalid command 'php_flag', perhaps misspelled or defined by a module not included in the server configuration
Résolution :
Installé le paquet libapache2-mod-php5
$ sudo apt-get install libapache2-mod-php5
$ sudo service apache2 start
Activer les modules nécessaires :
$ sudo a2enmod proxy
$ sudo a2enmod proxy_balancer
$ sudo a2enmod proxy_ajp
Paramétrage en mode HTTP :
Ajouter dans le fichier httpd.conf situé dans le répertoire conf d'Apache (ajuster les valeurs en rouge)
Paramétrage en mode AJP (Tomcat) :
Ajouter dans le fichier httpd.conf situé dans le répertoire conf d'Apache (ajuster les valeurs en rouge)
Pré-requis :
Comment rediriger automatiquement une connexion http en https pour un virtual host précis:
Par exemple http://monDomaine.com --> https://monDomaine.com
RedirectPermanent /login "https://monDomaine.com/login"
Sous Apache, la réécriture d'URL et la redirection de ports est possible grâce au module "mod_rewrite".
Pour l'activer, rien de plus simple :
$ a2enmod rewrite
Les informations de réécriture sont à renseignées, soit dans le fichier de configuration d'Apache (/etc/apache2/apache2.conf), soit dans les fichiers de configuration des virtualhosts.
> RewriteEngine On
> RewriteRule ^/$ /ma_page [L,R]
> RewriteEngine On
> RewriteRule ^/mon_ancienne_page$ /ma_nouvelle_page [L,R]
> RewriteEngine On
> RewriteCond %{SERVER_PORT} ^8080$
> RewriteRule ^(.*) http://%{SERVER_NAME}:80/ [L,R]
> RewriteEngine On
> RewriteCond %{SERVER_PORT} ^8080$
> RewriteRule ^(.*)/mon_ancienne_page$ http://%{SERVER_NAME}:80/ma_nouvelle_page [L,R]
Tests réalisés sur une distribution Linux style Ubuntu
$ sudo apt-get install apache2-utils
$ ab -n 1000 -c 20 http://monserveur/index.html
Cela permet de faire des tests de charge sur votre serveur et de récupérer ses capacités en terme de nombre de requete / seconde.
Voici un exemple de configuration permettant d'avoir un frontend Apache ou Nginx, un backend Tomcat (ou autre) et le tout avec une connexion sécurisée SSL.
Un frontend Apache ou Nginx en mode proxy avec un backend Tomcat, rien de plus commun, une simple configuration comme celle-ci suffit à obtenir le résultat souhaité dans la conf virtualhost d'Apache ou de Nginx.
Pour Apache:
<VirtualHost *:80> ServerName mondomaine.fr ... ProxyPass / http://localhost:8080 ProxyPassReverse / http://localhost:8080 ... </VirtualHost>
Pour Nginx:
server { server_name mondomaine.fr; listen 80; location / { include proxy_params; proxy_pass http://localhost:8080; } }
Pour la connexion SSL, une modification doit être faite dans la configuration server.xml du Tomcat.
Il est nécessaire de définir un nouveau connector pour la connexion sécurisée.
<Connector connectionTimeout="20000" port="6443" protocol="HTTP/1.1" scheme="https" secure="true" proxyPort="443" proxyName="mondomaine.fr" />
Il faut définir un port d'écoute (6443), le "scheme" https, la valeur true à la propriété "secure", le port du serveur proxy (dans la conf apache / nginx) et enfin le nom du domaine associé (dans la conf apache / nginx).
Pour terminer, la conf à faire dans le virtualhost apache / nginx
Pour apache:
<VirtualHost *:443> ServerName mondomaine.fr ... SSLEngine on SSLCertificateFile "C:\Certbot\live\mondomaine.fr\fullchain.pem" SSLCertificateKeyFile "C:\Certbot\live\mondomaine.fr\privkey.pem" ... ProxyPass / http://localhost:6443 ProxyPassReverse / http://localhost:6443 ... </VirtualHost>
Pour nginx:
server { server_name mondomaine.fr; location / { include proxy_params; proxy_pass http://localhost:6443; } listen 443 ssl; ssl_certificate /etc/letsencrypt/live/mondomaine.fr/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/mondomaine.fr/privkey.pem; include /etc/letsencrypt/options-ssl-nginx.conf; ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; }
Attention, la configuration du serveur proxy s'effectue bien en HTTP, mais sur le port 6443.
Seule la connexion au frontend est sécurisée (avec le monde extérieur).
Celle entre le frontend et le backend n'a pas besoin de l'être puisqu'ils sont sur le même serveur.
Quand un site Drupal est mis hors-ligne, plus personne ne peut y accéder.
Cette option est pratique pour des opérations de maintenance et/ou de mises à jour.
Le seul inconvénient, ne pas quitter sa session avant d'avoir remis le site en ligne sous peine de ne plus pouvoir y accéder.
Si par malheur cela se produit, pas de panique, une solution simple existe afin de remettre son site en ligne.
Pour débloquer son site, il suffit de s'y connecter en y ajoutant /user ou /?q=user à la fin de l'adresse.
http://monSite.fr/user (si les URLs simplifiées sont activées)
ou
http://monSite.fr/?q=user (si les URLs simplifiées ne sont pas activées)
Seul l'administrateur est autorisé à se connecter.
1 - Installer le paquet php5-dev.
$ sudo apt-get install php5-dev
2 - Se placer dans le répertoire /tmp.
$ cd /tmp/
3 - Vérifier à l'adresse http://pecl.php.net/package/uploadprogress la dernière version disponible puis télécharger l'archive souhaitée.
$ wget http://pecl.php.net/get/uploadprogress-1.0.3.1.tgz
4 - Extraire l'archive téléchargée.
$ tar xzvf uploadprogress-1.0.3.1.tgz
5 - Se placer dans le répertoire uploadprogress-x.x.x
$ cd uploadprogress-1.0.3.1/
6 - Compiler les sources et installer le programme
$ phpize
$ ./configure
$ make
$ sudo make install
7 - Rajoutez "extension=uploadprogress.so" au fichier php.ini.
8 - Redémarrer apache.
$ /etc/init.d/apache2 restart
Si Drupal est installé sur un hébergement OVH, les mises à jour de modules via l'interface de mise à jour de Drupal ne fonctionne plus.
Obligation de télécharger le module à mettre à jour et de l'uploader sur le serveur via le FTP.
Pour retrouver un comportement standard, il suffit de modifier un tout petit fichier situé à la racine du serveur FTP.
Il s'agit du fichier .ovhconfig
Dans ce fichier, il suffit de modifier la ligne qui contient
container.image=legacy
par
container.image=stable
Tout devrait rentrer dans l'ordre
Suite à la mise à jour de Drupal en version 7.24 & 6.29, il est indipensable d'ajouter ou de modifier le fichier .htaccess présent dans le répertoire sites/default/files.
C'est une question de sécurité.
Cela empêchera toute exécution de scripts malicieux.
$ cat sites/default/files/.htaccess
# Turn off all options we don't need.
Options None
Options +FollowSymLinks
# Set the catch-all handler to prevent scripts from being executed.
SetHandler Drupal_Security_Do_Not_Remove_See_SA_2006_006
<Files *>
# Override the handler again if we're run later in the evaluation list.
SetHandler Drupal_Security_Do_Not_Remove_See_SA_2013_003
</Files>
# If we know how to do it safely, disable the PHP engine entirely.
<IfModule mod_php5.c>
php_flag engine off
</IfModule>
Si le fichier .htaccess n'existe pas, le créer.
Il faut également protéger le répertoire temporaire de Drupal avec ce même fichier .htaccess.
Pour connaitre le répertoire temporaire de Drupal, il suffit d'aller dans "Configuration --> Média --> Système de fichiers".
En règle générale, sur un serveur Linux, il s'agit du répertoire /tmp.
Pour le protéger, rien de plus simple, il suffit d'effectuer une copie du fichier sites/default/files/.htaccess dans le répertoire /tmp.
Sur un serveur Linux, le répertoire /tmp est vider à chaque redémarrage.
Il faut donc penser à recopier le fichier .htaccess après chaque redémarrage.
Sinon, une petite tâche cron et le problème est réglé :
$ crontab -l
# m h dom mon dow command
@reboot cp -a /var/www/public_html/sites/default/files/.htaccess /tmp/
Penser à modifier le chemin d'accès au fichier .htaccess.
Pour finir, supprimer le fichier CHANGELOG.txt. Cela évitera à n'importe qui de connaitre la version actuellement installée.
Si mon module Drupal "Test de connexion" vous intéresse, vous pouvez le télécharger en cliquant sur les liens ci-dessous correspondant à votre version de Drupal.
Disponible pour la version 6.x de Drupal :
MD5SUM : 25c575cc262272e6a2a7dc656196c25b test_connexion.tar.gz
Disponible pour la version 7.x de Drupal :
MD5SUM : 9b7a14d2e38c1111f2cc841df365f839 test_connexion-7.x-1.0.tar.gz
Dans Drupal 7, il est tout à fait possible d'extraire n'importe quelles données d'un noeud (Page, Article etc etc) grâce aux API Drupal.
Quelles sont les données récupérables :
Exemple avec un article test créé spécialement.
Pour afficher cette description, il suffit d'utiliser l'API node_load en indiquant le NID du noeud concerné :
<?php
$nid = 412;
$node = node_load($nid);
print_r($node);
?>
Ce qui donne :
stdClass Object ( [vid] => 431 [uid] => 0 [title] => Article vide pour test [log] => [status] => 0 [comment] => 2 [promote] => 0 [sticky] => 0 [nid] => 412 [type] => story [language] => fr [created] => 1334738152 [changed] => 1386527877 [tnid] => 0 [translate] => 0 [revision_timestamp] => 1386527877 [revision_uid] => 1 [taxonomy_vocabulary_2] => Array ( ) [body] => Array ( [und] => Array ( [0] => Array ( [value] =>Contenu vide pour test
[summary] => [format] => 2 [safe_value] =>Contenu vide pour test
[safe_summary] => ) ) ) [rdf_mapping] => Array ( [rdftype] => Array ( [0] => sioc:Item [1] => foaf:Document ) [title] => Array ( [predicates] => Array ( [0] => dc:title ) ) [created] => Array ( [predicates] => Array ( [0] => dc:date [1] => dc:created ) [datatype] => xsd:dateTime [callback] => date_iso8601 ) [changed] => Array ( [predicates] => Array ( [0] => dc:modified ) [datatype] => xsd:dateTime [callback] => date_iso8601 ) [body] => Array ( [predicates] => Array ( [0] => content:encoded ) ) [uid] => Array ( [predicates] => Array ( [0] => sioc:has_creator ) [type] => rel ) [name] => Array ( [predicates] => Array ( [0] => foaf:name ) ) [comment_count] => Array ( [predicates] => Array ( [0] => sioc:num_replies ) [datatype] => xsd:integer ) [last_activity] => Array ( [predicates] => Array ( [0] => sioc:last_activity_date ) [datatype] => xsd:dateTime [callback] => date_iso8601 ) ) [cid] => 0 [last_comment_timestamp] => 1334738152 [last_comment_name] => [last_comment_uid] => 1 [comment_count] => 0 [name] => [picture] => 0 [data] => )
Si on souhaite afficher la date de création du noeud, il suffit d'écrire
<?php
$nid = 412;
$node = node_load($nid);
$timestamp = $node->created;
$date = date("d-m-Y", $timestamp);
echo $date;
?>
Ce qui donne :
18-04-2012
Pour afficher le contenu
<?php
$nid = 412;
$node=node_load($nid);
print $node->body['und']['0']['value'];
?>
Ce qui donne :
Contenu vide pour test
Dans Drupal 6, l'affichage du contenu s'effectue de cette manière :
<?php
$nid = 412;
$node=node_load($nid);
print $node->body;
?>
Les arrays ['und']['0']['value'] sont inexistants.
En cas de perte des identifiants, il faut savoir que tous les comptes utilisateurs sont enregistrés dans la table users.
Dans cette table, à chaque compte correspond un id unique (colonne UID).
Pour Drupal, les utilisateurs anonymes et privilégiés sont systématiquement les deux premières lignes de cette table et ont pour UID respectif 0 et 1.
Pour changer identifiant et mot de passe, il suffit d'exécuter la requête SQL suivante avec la console MySQL ou PhpMyAdmin :
$ mysql -u root -p
> use drupal
> update users set
name = 'identifiant_admin',
pass = md5('mot_de_passe')
where uid = 1;
Liste des raccourcis clavier afin d'utiliser Eclipse plus rapidement.
CTRL + SHIFT + L
CTRL + ALT + Up
CTRL + SHIFT + /
CTRL + Espace
CTRL + SHIFT + I
CTRL + D
Comment savoir si son site internet s'affiche correctement dans différentes résolution.
Afin de simuler l'affichage de son site sur un PC, un portable, un netbook, une tablette et un smartphone, Firefox possède une fonction permettant de manipuler la résolution d'affichage.
Pour activer l'option, appuyer sur les touches Ctrl + Shift + M
Idem pour désactiver l'option.
Pour pouvoir sauvegarder et/ou synchroniser tous ses marque-pages, mots de passe, préférences et son historique de navigation du navigateur Firefox, il faut utiliser l'extension Sync.
Depuis la version 4 de Firefox, cette extension est installée par défaut.
Pour cela, il suffit de se créer un nouveau compte sur le serveur de la fondation Mozilla, via les options de Sync.
Toutes ces données sont cryptées et sauvegardées sur leur serveur.
De cette manière, il est possible de synchroniser toutes ses données entre plusieurs navigateurs Firefox (à la maison, sur l'ordinateur familial, sur le portable et au travail)
Cela permet également de faire des sauvegardes régulières. Plus besoin d'installer des extensions supplémentaires pour sauvegarder les mots de passe et les marque-pages.
Mais il est également possible d'avoir son propre serveur de synchronisation grâce à l'application Weave écrite en PHP.
Pré-requis :
Avoir un serveur LAMP (Linux Apache MySQL PHP)
Installé l'extension SQLite pour PHP
$ apt-get install php5-sqlite
Installation :
Télécharger l'archive weave_minimal.tgz :
$ cd /var/www
$ wget http://www.isbeta.fr/4f612 -O weave_minimal.tgz
MD5SUM : 12c7dfef24eb0bb249a1f4723cd8daf6 weave_minimal.tgz
Extraire l'archive :
$ tar -xvzf ./weave_minimal.tgz
Ajouter un alias dans la configuration Apache se nommant /weave et pointant vers /var/www/weave_minimal/index.php
Modifier le propriétaire du dossier weave_minimal :
$ chown -R www-data:www-data /var/www/weave-minimal/
Redémarrer Apache :
$ service apache2 restart
Pour créer la base de données, ouvrir un navigateur, Firefox de préférence ;o) et saisir cette adresse dans la barre d'adresse > http://localhost/weave/1.0/blah/info/collection <
Si tout se passe bien, saisir "blah" pour l'utilisateur et laisser le mot de passe vide.
Valider en appuyant sur Entrée puis quitter Firefox (ou l'autre navigateur ;o)
La base de données "weave_db" doit être créée (pour vérifier):
$ cd /var/www/weave_minimal/ && ls -l
Pour créer un utilisateur :
$ cd /var/www/weave_minimal/
$ php ./create_user
Ce script PHP permet de créer, modifier ou supprimer un utilisateur
L'installation du serveur est terminée, il ne reste plus qu'à configurer Sync.
Si tout se passe comme il faut, une page doit s'ouvrir dans Firefox indiquant que la configuration est terminée.
Répéter les opérations 1 à 6 pour tous les navigateurs Firefox à synchroniser.
Généralement, le résultat d'une requête est affiché horizontalement.
mysql> SELECT * FROM test2 LIMIT 0,5;
+----+-----+
| id | val |
+----+-----+
| 1 | 10 |
| 2 | 20 |
| 3 | 30 |
| 4 | 40 |
| 5 | 50 |
+----+-----+
5 rows in set (0.00 sec)
Pour afficher le résultat verticalement, il suffit de remplacer le ";" par "\G".
mysql> SELECT * FROM test2 LIMIT 0,5\G
*************************** 1. row ***************************
id: 1
val: 10
*************************** 2. row ***************************
id: 2
val: 20
*************************** 3. row ***************************
id: 3
val: 30
*************************** 4. row ***************************
id: 4
val: 40
*************************** 5. row ***************************
id: 5
val: 50
5 rows in set (0.00 sec)
Les commandes suivantes ajoute l'utilisateur "superUser" ayant tous les droits "ALL PRIVILEGES.....WITH GRANT OPTION" sur toutes les bases de sonnées "*.*", avec le mot de passe "secret" et pouvant se connecter de n'importe quelle machine "%":
Se connecter au serveur mysql avec l'utilisateur root
$ mysql -u root -p
> GRANT ALL PRIVILEGES ON *.* TO 'superUser'@'%' IDENTIFIED BY 'secret' WITH GRANT OPTION;
> FLUSH PRIVILEGES;
Sous Ubuntu, par exemple, pour se connecter à un serveur MySQL, il est nécessaire de saisir dans la console la commande suivante :
$ mysql -h mon_serveur_mysql -u nom_user -p nom_base_de_donnees
-h pour indiquer le serveur mysql (optionnel si le serveur est localhost)
-u pour indiquer le nom d'utilisateur
-p pour permettre la saisie du mot de passe
et on termine la commande par le nom de la base de données à utiliser (optionnel).
Il existe un moyen plus simple pour se connecter à MySQL surtout si les paramètres de connexions sont souvent les mêmes.
Pour cela, il suffit de créer dans son répertoire personnel le fichier .my.cnf.
$ touch ~/.my.cnf
D'y renseigner les informations suivantes :
$ cat ~/.my.cnf
[client]
user = nom_user
password = mon_password
host = adresse_ip_ou_fqdn_du_serveur_mysql
De protéger le fichier des regards indiscrets
$ chmod 0600 ~/.my.cnf
Dorénavant, cette simple commande suffira à se connecter au serveur MySQL :
$ mysql nom_base_de_donnees
Pour créer un trigger dans MySql suite à une insertion de données avec enregistrement de données dans une autre table
$ .
> CREATE TRIGGER nom_du_trigger AFTER INSERT ON nom_de_la_table_a_surveiller
> FOR EACH ROW
> INSERT INTO nom_de_la_table (champs1, champs2, champs3) VALUES ( valeur1, valeur2, valeur3);
Pour créer un trigger dans MySql suite à une modification de données avec enregistrement de données dans
une autre table
$ .
> CREATE TRIGGER nom_du_trigger AFTER UPDATE ON nom_de_la_table_a_surveiller
> FOR EACH ROW
> INSERT INTO nom_de_la_table (champs1, champs2, champs3) VALUES ( valeur1, valeur2, valeur3);
Pour créer un trigger dans MySql suite à une suppression de données avec enregistrement de données dans
une autre table
$ .
> CREATE TRIGGER nom_du_trigger AFTER DELETE ON nom_de_la_table_a_surveiller
> FOR EACH ROW
> INSERT INTO nom_de_la_table (champs1, champs2, champs3) VALUES ( valeur1, valeur2, valeur3);
$ .
> CREATE TRIGGER mon_trigger AFTER INSERT ON ma_table
> FOR EACH ROW
> INSERT INTO ma_table_log (id_ajoute, valeur1_ajoutee, valeur2_ajoutee) VALUES ( NEW.id, NEW.valeur1,
NEW.valeur2);
Lors d'une insertion en masse dans une table Mysql, si une clé existe déjà, la totalité de l'insertion n'est pas exécutée.
Pour ignorer cette erreur, il suffit d'utiliser le mot clé IGNORE dans la requête d'insertion.
Exemple :
Définition de la table test2
CREATE TABLE IF NOT EXISTS `test2` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`val` int(11) NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `val` (`val`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;
Définition d'une clé unique sur le champ "val".
Données de la table
mysql> SELECT * FROM test2;
+----+-----+
| id | val |
+----+-----+
| 1 | 10 |
| 2 | 20 |
| 3 | 30 |
| 4 | 40 |
| 5 | 50 |
+----+-----+
5 rows in set (0.00 sec)
Requête d'insertion en masse
mysql> INSERT INTO test2 (val) VALUES (60), (70), (10), (80);
ERROR 1062 (23000): Duplicate entry '10' for key 'val'
mysql> SELECT * FROM test2;
+----+-----+
| id | val |
+----+-----+
| 1 | 10 |
| 2 | 20 |
| 3 | 30 |
| 4 | 40 |
| 5 | 50 |
| 6 | 60 |
| 7 | 70 |
+----+-----+
7 rows in set (0.00 sec)
Lors de l'insertion, une erreur est générée pour la valeur "10".
Celle-ci existe déjà dans la table.
Le "SELECT" montre que seules les valeurs "60" et "70" ont été insérées.
La valeur "80" n'a pas été insérée car la requête a générée une erreur au moment de l'insertion de la valeur "10".
Requête d'insertion avec le mot clé "IGNORE"
mysql> INSERT IGNORE INTO test2 (val) VALUES (80), (90), (10), (100);
Query OK, 3 rows affected (0.00 sec)
Records: 4 Duplicates: 1 Warnings: 0
mysql> SELECT * FROM test2;
+----+-----+
| id | val |
+----+-----+
| 1 | 10 |
| 2 | 20 |
| 3 | 30 |
| 4 | 40 |
| 5 | 50 |
| 6 | 60 |
| 7 | 70 |
| 8 | 80 |
| 9 | 90 |
| 10 | 100 |
+----+-----+
10 rows in set (0.00 sec)
Le résultat de la requête indique que 3 insertions ont été exécutées sur 4.
La valeur "10" a été ignorée.
Le "SELECT" montre que les valeurs "80", "90" et "100" ont bien été insérées.
L'exemple suivant permet de mettre à jour le champ nom_region de la table codes_postaux à partir du champ nom_region de la table departements
UPDATE
codes_postaux c
SET
c.nom_region = (
SELECT
d2.nom_region
FROM
departements d2
WHERE
d2.code_departement = LEFT(c.Postcode_from,
2))
WHERE
EXISTS (
SELECT
1
FROM
departements d1
WHERE
d1.code_departement = LEFT(c.Postcode_from,
2) )
AND c.Country_name = 'FRANCE'
Ceci grâce principalement au mot clé EXISTS
Personnellement, je trouve que cette syntaxe est beaucoup plus rapide que certaines autres trouvées sur internet comme par exemple avec une jointure avec la table source entre le UPDATE et le SET
UPDATE table1 AS b
INNER JOIN table2 AS g ON b.champ1= g.champ1
SET b.champ2= g.champ2
WHERE (b.champ2= '' or b.champ2= 0) and
g.champ2 > 0
Pour restaurer une base de données
Attention, il faut que la base de données soit créée auparavant
Dans une console
$ mysql -h adresse_ip -u user -p -D nom_de_la_base_de_données < nom_du_fichier_sql
Par exemple
$ mysql -h localhost -u root -p -D mesvideos < mesvideos.sql
Cela a pour effet d'importer le contenu du fichier mesvideos.sql dans la base de données mesvideos.
Pour restaurer toutes les bases de données
Pour info, il n'est pas nécessaire que les bases de données soient créées auparavant
Dans une console
$ mysql -h adresse_ip -u user -p < nom_du_fichier_sql
Par exemple
$ mysql -h localhost -u root -p < allbases.sql
Cela a pour effet d'importer la totalité des bases de données contenues dans le fichier allbases.sql.
Pour sauvegarder une base de données
Dans une console
$ mysqldump -h adresse_ip -u user -p nom_de_la_base_de_donnees > nom_du_fichier_sql
Par exemple
$ mysqldump -h localhost -u root -p mesvideos > mesvideos.sql
Cela a pour effet d'exporter toutes les données de la base mesvideos dans le fichier mesvideos.sql
Pour sauvegarder toutes les bases de données
Dans une console
$ mysqldump -h adresse_ip -u user -p -A > nom_du_fichier_sql
Par exemple
$ mysqldump -h localhost -u root -p -A > allbases.sql
Cela a pour effet d'exporter toutes les bases de données dans le fichier allbases.sql
Par défaut, sur une distribution style Debian, le serveur MySql accepte les connexions uniquement à partir de la machine locale.
Toutes connexions à partir d'un host différent sont automatiquement refusées.
$ netstat -lpn | grep mysql
tcp 0 0 127.0.0.1:3306 0.0.0.0:* LISTEN 4884/mysqld
Pour autoriser les connexions à partir de n'importe quels hosts, il faut modifier le fichier /etc/mysql/my.cnf.
Modifier le ligne bind-address = 127.0.0.1 et remplacer 127.0.0.1 par 0.0.0.0
$ cat /etc/mysql/my.cnf | grep "bind-address"
bind-address = 0.0.0.0
Redémarrer le serveur MySql afin d'appliquer la modification
$ service mysql restart
Puis vérifier avec la commande netstat
$ netstat -lpn | grep mysql
tcp 0 0 0.0.0.0:3306 0.0.0.0:* LISTEN 6039/mysqld
Pour se connecter au sevreur MySQL depuis une console
$ mysql -u nom_du_user -p
puis saisir le mot de passe
Pour changer le mot de passe de l'utilisateur root (qui n'est pas le même que l'utilisateur root du système), tapez la commande suivante dans un terminal :
$ sudo mysqladmin -u root password nouveau_mot_de_passe -p
Redéfinir de force le mot de passe ROOT
Méthode 1
On stoppe le serveur MySQL
$ sudo /etc/init.d/mysql stop
On se connecte au serveur sans tenir compte des privilèges utilisateurs :
$ sudo /usr/bin/mysqld_safe --skip-grant-tables & mysql -h localhost
Nous allons utiliser la table contenant les paramètres de MySQL :
$ > use mysql
On met en place le nouveau mot de passe :
$ > update user set password = password('<votre_mot_de_passe>') where user = 'root' and host='localhost';
On quitte le prompt de MySQL :
$ > quit
On redémarre le serveur MySQL en utilisation normale :
$ sudo /etc.init.d/mysql restart
Méthode 2
$ sudo /etc/init.d/mysql reset-password
Méthode 3
$ sudo dpkg-reconfigure mysql-server-5.0
Se connecter à MySQL :
$ mysql -h localhost -u user -p
Sélectionner la base de données :
$ .
> USE maBaseDeDonnees;
Exécuter la requête :
$ .
> SELECT * INTO OUTFILE '/home/user/monFichier.txt' FROM maTable;
! Il faut que le user connecté à MySQL ait l'autorisation d'écrire dans le répertoire indiqué
Il existe 2 manières pour sélectionner une base de données MySQL
Directement lors de la connexion
$ mysql -u root -p votre_base
Une fois connecté à MySQL mysql
$ .
> use votre_base;
Dans une console, saisir la commande suivante :
$ vboxmanage clonevdi nom_du_disque_a_cloner nom_du_nouveau_disque
En mode graphique :
$ vboxmanage startvm nom_de_la_machine_virtuelle
Sans interface graphique :
$ vboxmanage startvm nom_de_la_machine_virtuelle --type headless
(Dans ce mode, le contrôle de la machine est accessible uniquement via SSH)
En mode graphique :
"C:\Program Files\Oracle\VirtualBox\VBoxManage.exe" startvm "nom_de_la_machine_virtuelle"
Sans interface graphique :
"C:\Program Files\Oracle\VirtualBox\VBoxManage.exe" startvm "nom_de_la_machine_virtuelle" --type headless
(Dans ce mode, le contrôle de la machine est accessible uniquement via SSH)
$ vboxmanage controlvm nom_de_la_machine_virtuelle poweroff
Zimbra est un serveur de messagerie avec des fonctionnalités de travail collaboratif.
La version Open Source comprend la fonction de serveur de messagerie, de calendriers partagés, de carnets d'adresses partagés, de gestionnaire de fichiers, de gestionnaire de tâches, wiki, messagerie instantanée.
A l'heure actuelle, ZIMBRA est compatible avec un certains nombres de distributions Linux 64 bits.
Toutes les versions 32 bits sont dépréciées.
Cepandant, il est quand même possible d'installer Zimbra sur la version 32 bits de Ubuntu 8.04 LTS.
Voir la liste des distribution compatible.
La dernière version disponible de Zimbra est la 7.1.3 GA Release
Zimbra nécessite un serveur à lui tout seul.
Il ne peut pas être installé sur un serveur déjà configuré comme serveur mail, http etc ...
Il lui faut une machine ayant au minimum 1 GO de mémoire vive.
ZIMBRA étant installé dans le répertoire /opt, il est fortement conseillé de créer une partition spécifique ayant comme point de montage /opt.
Par exemple, pour un disque dur de 40 GB, une partition racine / de 10 GB pour le système, une partition /opt de 30 GB pour Zimbra et une partition Swap de 2.9 GB.
Procéder à l'installation d'Ubuntu 8.04 LTS avec le strict minimum.
Les paquets supplémentaires à installer sont OpenSSH-server & DNS Server
Au moment du choix des paquets supplémentaires à installer choisir OpenSSH-server & DNS Server
Pour paramétrer notre nouveau système, nous installerons Webmin
Se connecter au système (via SSH par exemple).
$ sudo wget http://www.webmin.com/jcameron-key.asc
$ sudo apt-key add jcameron-key.asc
Ajouter le dépot Webmin au fichier /etc/apt/sources.list :
$ echo "deb http://download.webmin.com/download/repository sarge contrib" >> /etc/apt/sources.list
$ sudo apt-get update
$ sudo apt-get install webmin
Une fois l'installation terminée, se connecter à Webmin via un navigateur web à l'adresse https://ip_du_serveur:10000
Se connecter à Webmin via un navigateur à l'adresse https://adresse_ip_du_serveur:10000
Le user et le password correspondent à l'utilisateur créé lors de l'installation d'Ubuntu.
Le menu Webmin :
Pour mettre Webmin en français, cliquer sur le menu Webmin, puis Change Language and Theme
Cocher l'option Personal choice puis sélectionner French (FR) dans la liste déroulante
Valider en cliquant sur Make Changes
Recharger Webmin en appuyant sur F5
Via Webmin, configurer le serveur en IP fixe.
Cliquer sur le menu Réseau puis sur Configuration Réseau
Cliquer sur Interfaces Réseau puis sélectionner l'onget Interfaces Permanentes
Cliquer sur le nom de l'interface réseau (ETH0 en règle générale)
Sélectionner l'option Static configuration.
Renseigner l'adresse IP puis le masque de sous-réseau
Cliquer sur Sauvegarder
Cliquer sur Retourner à configuration réseau
Cliquer sur Passerelles et Routage
Sélectionner l'option Passerelle puis y indiquer l'adresse IP du routeur
Cliquer sur Sauvegarder
Cliquer sur Adresses de la machine
Sélectionner la ligne correspondant à l'adresse IP 127.0.1.1 et la supprimer (Attention à ne pas supprimer la ligne correspondant à l'adresse IP 127.0.0.1).
Cliquer sur Ajouter une nouvelle adresse de machine
Y renseigner la nouvelle adresse IP du serveur et son nom de machine puis cliquer sur Créer
Cliquer sur Retourner à configuration réseau
Cliquer sur Client DNS
Dans le champ Nom du poste, y indiquer le nom de la machine.
Dans le champ Serveurs DNS, y indiquer l'adresse IP 127.0.0.1
Dans le champ Domaines de recherche, sélectionner l'option Listé et y indiquer son nom de domaine
Cliquer sur Sauvegarder
Enfin, cliquer sur le bouton Appliquer la configuration
Attention, si la nouvelle adresse IP appliquée au serveur est différente de la précédente, la connexion à Webmin sera perdue. Il suffit juste de se reconnecter à Webmin via la nouvelle adresse IP du serveur.
Pré-requis :
Installer le paquet dnsutils
$ sudo apt-get install dnsutils
Configuration de Bind9 :
Tous les fichiers nécessaires sont disponibles en bas de cette page
Dans les exemples suivants, mon serveur à comme adresse IP fixe : 192.168.1.10
Ce fichier doit contenir uniquement le nom de la machine.
Fichier modifié précédemment via Webmin.
Ce fichier doit ressembler à cela
Fichier modifié précédemment via Webmin.
Ce fichier doit ressembler à cela
En bleu les infos à rajouter dans ce fichier.
Attention à bien respecter l'indentation du texte avec une tabulation
// This is the primary configuration file for the BIND DNS server named.
//
// Please read /usr/share/doc/bind9/README.Debian.gz for information on the
// structure of BIND configuration files in Debian, *BEFORE* you customize
// this configuration file.
//
// If you are just adding zones, please do that in /etc/bind/named.conf.local
include "/etc/bind/named.conf.options";
// prime the server with knowledge of the root servers
zone "." {
type hint;
file "/etc/bind/db.root";
};
// be authoritative for the localhost forward and reverse zones, and for
// broadcast zones as per RFC 1912
zone "localhost" {
type master;
file "/etc/bind/db.local";
};
zone "127.in-addr.arpa" {
type master;
file "/etc/bind/db.127";
};
zone "0.in-addr.arpa" {
type master;
file "/etc/bind/db.0";
};
zone "255.in-addr.arpa" {
type master;
file "/etc/bind/db.255";
};
//ajout des liens vers le fichier de configuration du domaine mondomaine.com
zone "mondomaine.com" {
type master;
file "/etc/bind/zones/mondomaine.com.hosts";
};
//ajout des liens vers le fichier de configuration du reverse pour le LAN
zone "1.168.192.in-addr.arpa" {
type master;
file "/etc/bind/zones/rev.192.168.1.in-addr.arpa";
};
include "/etc/bind/named.conf.local";
On indique dans ce fichier sur quel port effectuer les requêtes d'identification (sur le port 53)
On y indique également les adresses des serveurs DNS externes (ceux de Free par exemple) dans la section forwarders
Attention à bien respecter l'indentation du texte avec une tabulation
options {
directory "/var/cache/bind";
// If there is a firewall between you and nameservers you want
// to talk to, you might need to uncomment the query-source
// directive below. Previous versions of BIND always asked
// questions using port 53, but BIND 8.1 and later use an unprivileged
// port by default.
query-source address * port 53;
// If your ISP provided one or more IP addresses for stable
// nameservers, you probably want to use them as forwarders.
// Uncomment the following block, and insert the addresses replacing
// the all-0's placeholder.
forwarders {
212.27.40.240;
212.27.40.241;
};
auth-nxdomain no; # conform to RFC1035
listen-on-v6 { any; };
};
$ sudo mkdir /etc/bind/zones
$ sudo nano /etc/bind/zones/mondomaine.com.hosts
Y indiquer les infos suivantes
Attention à bien respecter l'indentation du texte avec une tabulation
$ttl 86400
@ IN SOA zimbra.mondomaine.com. mail.mondomaine.com. (
2008061802
21600
3600
604800
86400 )
;ENREGISTREMENT "A" DNS <-> IP CLASSIQUES
@ IN NS mail.mondomaine.com.
IN MX 10 mail.mondomaine.com.
IN A 192.168.1.10
mail IN A 192.168.1.10
zimbra IN A 192.168.1.10
;ENREGISTREMENT MESSAGERIE
mondomaine.com. IN MX 10 zimbra
$ sudo nano /etc/bind/zones/rev.192.168.1.in-addr.arpa
Y indiquer les infos suivantes
Attention à bien respecter l'indentation du texte avec une tabulation
@ IN SOA mondomaine.com. admin.mondomaine.com. (
2006081405
28800
604800
604800
86400 )
IN NS zimbra.mondomaine.com.
10 IN PTR zimbra.mondomaine.com.
Redémarrage de Bind afin d'appliquer les modifications
$ sudo /etc/init.d/bind9 restart (ou # sudo service bind9 restart)
$ named-checkconf
Vérifier les enregistrements DNS via DIG & NSLOOKUP directement sur le serveur via SSH
$ dig mx mondomaine.com
; <<>> DiG 9.4.2-P2.1 <<>> mx mondomaine.com
;; global options: printcmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 57311
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 1, ADDITIONAL: 2
;; QUESTION SECTION:
;mondomaine.com. IN MX
;; ANSWER SECTION:
mondomaine.com. 86400 IN MX 10 zimbra.mondomaine.com.
mondomaine.com. 86400 IN MX 10 mail.mondomaine.com.
;; AUTHORITY SECTION:
mondomaine.com. 86400 IN NS mail.mondomaine.com.
;; ADDITIONAL SECTION:
mail.mondomaine.com. 86400 IN A 192.168.1.10
zimbra.mondomaine.com. 86400 IN A 192.168.1.10
;; Query time: 16 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Sat Feb 12 10:00:24 2011
;; MSG SIZE rcvd: 118
$ dig a mail.mondomaine.com
; <<>> DiG 9.4.2-P2.1 <<>> a mail.mondomaine.com
;; global options: printcmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 18243
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 0
;; QUESTION SECTION:
;mail.mondomaine.com. IN A
;; ANSWER SECTION:
mail.mondomaine.com. 86400 IN A 192.168.1.10
;; AUTHORITY SECTION:
mondomaine.com. 86400 IN NS mail.mondomaine.com.
;; Query time: 0 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Sat Feb 12 10:05:01 2011
;; MSG SIZE rcvd: 63
$ nslookup mondomaine.com
Server: 127.0.0.1
Address: 127.0.0.1#53
Name: mondomaine.com
Address: 192.168.1.10
L'installation et la configuration de BIND9 est enfin terminée
Pour simplifier la configuration d'un serveur Bind9, j'ai écrit un script de configuration automatique.
Pour le télécharger, cliquer ici
MD5SUM : 86a0a889ce9afe13fd12df48722f8182 configure_bind9.sh
Fichier attaché | Taille |
---|---|
hosts. | 278 octets |
resolv.conf | 46 octets |
named.conf | 1.25 Ko |
named.conf_.options | 710 octets |
mondomaine.com_.hosts | 351 octets |
rev.192.168.1.in-addr.arpa | 170 octets |
$ sudo apt-get install libpcre3 libgmp3c2 libstdc++5 libltdl3 fetchmail curl sysstat sqlite3
Editer le fichier /etc/default/sysstat
$ sudo nano /etc/default/sysstat
Modifier ENABLED="true"
Téléchargement de Zimbra 7.1.3 GA
Zimbra 7.1.3 GA est la dernière version compatible avec une version Linux 32 bits
Voir sur le site de Zimbra la dernière version disponible
Récupérer la dernière version de Zimbra :
$ wget http://files.zimbra.com/downloads/7.1.3_GA/zcs-7.1.3_GA_3346.UBUNTU8.201...
Décompresser et restaurer l'archive téléchargée
$ tar xvzf ./zcs-7.1.3_GA_3346.UBUNTU8.20110928134533.tgz
$ cd zcs-7.1.3_GA_3346.UBUNTU8.20110928134533/
$ sudo ./install.sh
Poursuite de l'installation ...
Pendant l'installation, les enregistrements DNS sont vérifiés par rapport au nom de domaine zimbra.mondomaine.com. Une erreur va donc être retournée.
DNS ERROR resolving MX for zimbra.mondomaine.com
It is suggested that the domain name have an MX record configured in DNS
Change domain name? [Yes] Yes ici, répondre YES
Create Domain: [zimbra.mondomaine.com] mondomaine.com ici, entrer le nom du domaine
MX: zimbra.mondomaine.com (192.168.1.10)
MX: mail.mondomaine.com (192.168.1.10)
Poursuite du paramétrage automatique ...
Configuration des différents services ...
Patienter un petit moment le temps que tous les services démarrent
L'installation est enfin terminée
Il ne reste plus qu'à se connecter à l'interface de configuration du serveur Zimbra via un navigateur à l'adresse https://adress_ip_du_serveur:7071
Le paramétrage de Zimbra se fait via son interface de configuration à l'adresse https://adresse_ip_du_serveur:7071
user = admin
password = celui choisi lors de l'installation
L'interface de connexion au serveur :
Le menu de Zimbra :
Paramètres globaux
- Agent MTA
Valider en cliquant sur Enregistrer
Domaines
- Information générale
- Zimlets
Valider en cliquant sur Enregistrer
Classe de service
- Défault
- Caractéristiques
- Préférences
- Options générales
- Options mail
- Options d'agenda
Valider en cliquant sur Enregistrer
Toutes ces commandes ZIMBRA sont exécutées avec le user "zimbra" :
$ sudo su
$ su - zimbra
Stopper Zimbra
$ zmcontrol stop
Démarrer Zimbra
$ zmcontrol start
Etat Zimbra
$ zmcontrol status
Afficher la version de Zimbra
$ zmcontrol -v
Afficher la configuration locale de Zimbra
$ zmlocalconfig -s
Afficher le mot de passe MySQL du compte root
$ zmlocalconfig -s mysql_root_password
Afficher le mot de passe MySQL du compte zimbra
$ zmlocalconfig -s zimbra_mysql_password
Se connecter à MySQL avec le compte root
$ mysql -S /opt/zimbra/db/mysql.sock -u root --password=mysql_root_password
Afficher les répertoires d'un utilisateur
$ zmmailbox -z -m user@monDomaine.com gaf
-z : utiliser les droits de l'administrateur
-m : spécifie pour quel utilisateur on liste les répertoires
gaf : Get All Folders
Vider le répertoire d'un utilisateur
$ zmmailbox -z -m user@monDomaine.com ef /nomDuRepertoire
ef : Empty Folder
Afficher la liste des users
$ zmprov -l gaa
Afficher la liste des users admin
$ zmprov -l gaaa
Modifier le mot de passe d'un compte
sp (setPassword)
$ zmprov sp moncompte@monDomaine.com myNewPassword
Déverrouiller un compte
ma (modifyAccount)
$ zmprov ma moncompte@monDomaine.com zimbraAccountStatus active
Créer un compte mail
ca (createAccount)
$ zmprov ca moncompte@monDomaine.com monPassword displayName moncompte
Exporter les différents dossiers d'un compte dans une archive zip
Les différents dossiers exportables (autres que mail):
Les dossiers standards des mails :
Commande à exécuter :
Pour info, tout dépend de la configuration du serveur Zimbra, mais il est possbile que les WebServices Rest soient disponibles en https sur le port 8443.
Dans ce cas, il faut le prendre en compte dans les commandes ci-dessous.
$ zmmailbox -z -m user@domaine.com getRestUrl -u http://`zmhostname`:8080 "/nom_du_dossier?fmt=zip" > /mon_dossier_de_sauvegarde/mon_fichier_export.zip
Exporter la totalité d'un compte dans une archive zip
$ zmmailbox -z -m compte@domaine.fr getRestURL -u http://`zmhostname`:8080 "//?fmt=zip" > ./compte.zip
Importer les différents dossiers d'un compte d'une archive zip
Les différentes valeurs du paramètre resolve :
Commande à exécuter :
$ zmmailbox -z -m user@domaine.com postRestUrl -u http://`zmhostname`:8080 "/nom_du_dossier?fmt=zip&resolve=reset" /mon_dossier_de_sauvegarde/mon_fichier_export.zip
Importer la totalité d'un compte à partir d'une archive zip
$ zmmailbox -z -m compte@domaine.fr postRestURL -u http://`zmhostname`:8080 "//?fmt=zip&resolve=reset" ./compte.zip
Réactiver la fonction "Notebook" du "Porte-documents" dans Zimbra 7
$ zmprov mc default zimbraFeatureBriefcaseSpreadsheetEnabled TRUE
$ zmprov mc default zimbraFeatureBriefcaseSlidesEnabled TRUE
$ zmcontrol restart
Réactiver la fonction de messagerie instantanée dans Zimbra 7
$ zmprov -l -v mcf zimbraXMPPEnabled TRUE
$ zmprov -v mc default zimbraFeatureIMEnabled TRUE
$ zmprov -v mc default zimbraFeatureInstantNotify TRUE
$ zmcontrol restart
Script de sauvegarde
$ cat sauvegarde.sh
#!/bin/bash
#Sauvegarde automatique
#Arret des services ZIMBRA
su - zimbra -c "/opt/zimbra/bin/zmcontrol stop" >> /backup/log/01stopZimbra.`date +%Y_%m_%d_%s`.log 2>&1
#Pause de 30 secondes
sleep 30
#Sauvegarde incrementielle du repertoire /opt/zimbra dans une archive TAR
/bin/tar --create --file=/backup/archive.`date +%Y_%m_%d_%s`.tar --listed-incremental=/backup/backup.list /opt/zimbra >> /backup/log/02tar.`date +%Y_%m_%d_%s`.log 2>&1
#Redemarrage des services ZIMBRA
su - zimbra -c "/opt/zimbra/bin/zmcontrol start" >> /backup/log/03startZimbra.`date +%Y_%m_%d_%s`.log 2>&1
#Statuts des services Zimbra
su - zimbra -c "/opt/zimbra/bin/zmcontrol status" > /backup/log/04statusZimbra.`date +%Y_%m_%d_%s`.log 2>&1
1 fois par semaine (ou plus en fonction des besoins) réinitialiser la sauvegarde incrémentielle en supprimant le fichier /backup/backup.list.
Restauration :
Stopper les services ZIMBRA
$ sudo su -
$ su - zimbra -c "zmcontrol stop"
Supprimer le répertoire /opt/zimbra puis restaurer la première archive complète
$ rm -r /opt/zimbra/
$ tar --extract --listed-incremental=/dev/null --file archive.1.tar
Puis restaurer les archives suivantes si besoin
$ tar --extract --listed-incremental=/dev/null --file archive.2.tar
Redémarrer les services ZIMBRA
$ su - zimbra -c "zmcontrol start"
Sur un historique de sauvegarde de 10 archives, pour restaurer l'archive 4, restaurer les archives 1, 2, 3 & 4 et ce dans le bon ordre. Ne pas restaurer directement l'archive 4, elle serait incomplète.
Pour accepter les certificats non reconnus dans la configuration de Zimbra :
$ sudo nano /opt/zimbra/conf/localconfig.xml
Dans la section :
$ sudo su
$ su - zimbra
$ zmcontrol restart
$ exit
Pouvoir profiter du push e-mail avec Zimbra est possible grâce à une application PHP simulant un serveur Microsoft Server ActiveSync.
Pour cela, rien de plus simple.
Le seul inconvénient est de disposer d'un serveur, autre que celui sur lequel est installé Zimbra, car il faut obligatoirement un serveur sur lequel sera installé Apache et PHP.
Un second serveur Ubuntu sera donc utile pour pouvoir profiter du push e-mail.
$ wget http://download.berlios.de/z-push/z-push-1.5.5-790.tar.gz
$ cp ./z-push-1.5.5-790.tar.gz /home/push/public_html/
$ cd /home/push/public_html/ && tar -xvzf ./z-push-1.5.5-790.tar.gz
$ cd ./z-push/backend/
$ wget http://freefr.dl.sourceforge.net/project/zimbrabackend/Release51/zimbra5...
$ tar -xvzf zimbra51.tgz
$ cd .. && nano ./config.php
$ chown www-data:www-data ./state/
La configuration du serveur PUSH est enfin terminée.
Il ne reste plus qu'à configurer Microsoft Exchange Active Sync sur le téléphone en y indiquant l'adresse http du serveur (push.mondomaine.com par exemple - Ne pas indiquer l'alias /Microsoft-Server-ActiveSync dans l'adresse du serveur) et les services à synchroniser (agenda, carnet d'adresses, tâches etc etc)
Il faut, bien entendu, que le serveur push.mondomaine.com (par exemple) soit accessible de l'extérieur.
Comment faire pour que le webmail du serveur Zimbra (installé sur la machine 10.10.0.10 par exemple) et le serveur push.mondomaine.com (installé sur la machine 10.10.0.20 par exemple) soient tous les 2 accessibles de l'extérieur sur le port HTTP 80 et/ou HTTPS 443.
Surtout que dans un routeur, il est possible de rediriger un port que sur une seule adresse IP.
Donc, soit on redirige le port 80 & 443 vers la machine 10.10.0.10 et dans ce cas le serveur web installé sur la machine 10.10.0.20 n'est pas accessible soit on fait l'inverse et dans ce cas c'est le webmail Zimbra installé sur la machine 10.10.0.10 qui n'est plus accessible.
Pour résoudre ce problème, il suffit de créer un second serveur virtuel sur la machine où se trouve le serveur push.mondomaine.com et de le nommer zimbra.mondomaine.com (par exemple) et de le configurer comme un serveur proxy qui transmettra les requêtes HTTP vers le serveur Zimbra.
Il suffit donc de paramétrer le routeur afin de rediriger le port 80 et 443 vers la machine 10.10.0.20. Le serveur virtuel zimbra.mondomaine.com se chargera de transmettre les requêtes vers la machine 10.10.0.10 et affichera, par conséquent, le webmail de Zimbra.
Cliquer pour la configuration d'un serveur virtuel en mode proxy.
Pouvoir gérer les téléphones qui se connectent au serveur Z-PUSH, c'est ce que propose de faire cette application PHP "zpush-zimbra-provisioning"
Avec "zpush-zimbra-provisioning", il est possible de lister tous les appareils mobiles qui se connectent au serveur, de les supprimer et enfin, il est également possible de les réinitialiser (retour à la config usine).
La version en cours est "zpush-zimbra-provisioning-1.02.tgz"
Pour vérifier la dernière version, http://sourceforge.net/projects/zimbrabackend/files/Provisioning%20%28Remote%20Wipe%29%20Support%20-%20Needs%20Release%2045%20or%20later/
Pour l'installer, rien de plus simple :
$ sudo su
$ cd /var/www
$ wget http://freefr.dl.sourceforge.net/project/zimbrabackend/Provisioning%20%2...
$ tar -xvzf zpush-zimbra-provisioning-1.02.tgz
L'installation est terminée, il faut maintenant créer la base de données :
$ sudo su
$ cd /var/www/zimbra-provisioning
$ mysql -u root -p < zpush_zimbra.sql
Dans MySql, créer un user avec password ayant tous les droits sur la base de données "zpush_zimbra"
Modification du fichier "zimbradb.php" :
Il faut modifier le fichier /var/www/zimbra-provisioning/zimbradb.php et renseigner les paramètres de connexion à la base de données MySql. Y inscrire le user et le password créés précédement.
$mysql_server = "localhost:3306";
$mysql_username = "provuser";
$mysql_password = "provpassword";
$mysql_zimbradb = "zpush_zimbra";
Une fois le fichier modifier, il faut le copier dans le dossier Backend de Z-PUSH.
Création du user admin :
Dans votre navigateur préféré, se rendre à l'adresse
http://adresse_ip_du_serveur/zimbra-provisioning/registerAdminGUIuser.php
Cette page va permettre de créer le compte admin.
Une fois le compte créé, il est recommandé de renommer le script registerAdminGUIuser.php ou de le supprimer.
$ sudo su
$ cd /var/www/zimbra-provisioning
$ mv registerAdminGUIuser.php registerAdminGUIuser.php.old
$ chown root:root registerAdminGUIuser.php.old
$ chmod 600 registerAdminGUIuser.php.old
Modifier la configuration de Z-PUSH :
Pour profiter de cette option, il faut activer le provisioning dans la configuration de Z-PUSH.
Pour cela, il suffit de modifier le fichier config.php (dans le dossier de Z-PUSH)
=== Enable Provisioning ===
define('PROVISIONING', true);
Et voilà, tout est terminé, vous pouvez vous rendre à l'adresse http://adresse_ip_du_serveur/zimbra-provisioning, vous authentifier et gérer tous les appareils mobiles.
La page d'accueil permet de lister tous les appareils.
En cliquant sur "Détail" d'un appareil, il est possible de supprimer l'appareil en cliquant sur "DELETE DEVICE" ou de le réinitialiser en cliquant sur "WIPE DEVICE"
Attention, en cliquant sur "WIPE DEVICE" le téléphone sera entièrement réinitialiser - Retour à la configuration usine - Très pratique pour se débarasser d'un téléphone sans laisser aucune trace des données.
Code de l'erreur :
Mail : system failure: exception during auth {RemoteManager: zimbra.domain.fr->zimbra@zimbra.domain.fr:22} Code d'erreur : service.FAILURE Method: [unknown] Détails :soap:Receiver
Cette erreur indique un problème d'accès au serveur via SSH sur le port 22.
Pour résoudre cette erreur, j'ai simplement ajouter dans le fichier /etc/hosts.allow, le nom de mon serveur Zimbra.
$ hostname -f
zimbra.domain.fr
$ nano /etc/hosts.allow
# Ajout de la ligne :
ALL: zimbra.domain.fr
^O (enregistrer)
^X (quitter)
$
Depuis le 01 juillet 2012, pour je ne sais quelle raison, java utilisait toutes les ressources CPU.
Ne trouvant pas la cause du problème, j'étais sur le point de réinstaller mon serveur Zimbra quand je suis tombé sur ce post :
http://www.zimbrafr.org/forum/topic/5003-java-100-cpu-et-seconde-interca...
La cause : L'ajustement de la seconde intercalaire.
Qu'est ce que c'est que ce truc là.
Explication sur Wikipedia :
Une seconde intercalaire, également appelée saut de seconde ou seconde additionnelle, est un ajustement d'une seconde du Temps universel coordonné (UTC). Et ce, afin qu'il reste assez proche du Temps universel (UT) défini quant à lui par l'orientation de la Terre par rapport aux étoiles.
http://fr.wikipedia.org/wiki/Seconde_intercalaire
Le remède : Tout simple. Il suffit de reparamétrer l'horloge du serveur avec la commande suivante :
$ date -s "`date`"
Tout est rentré dans l'ordre comme par magie.
Ce "bug" touche les 2 applications Java et MySql
Code de l'erreur :
Mail : system failure: Unable to read logger stats Code d'erreur : service.FAILURE Method: [unknown] Détails :soap:Receiver
Pour résoudre cette erreur, exécuter les commandes suivantes en tant que root.
$ /opt/zimbra/libexec/zmsyslogsetup
$ /etc/init.d/rsyslog restart
$ /opt/zimbra/libexec/zmfixperms
Pour terminer, en tant que user zimbra
$ zmloggerctl start
$ zmcontrol status
Tout devrait rentrer dans l'ordre.
Procédure de mise à jour:
# su - zimbra
$ mkdir /tmp/clamdb
$ mv /opt/zimbra/data/clamav/db/* /tmp/clamdb
$ /opt/zimbra/common/bin/freshclam --config-file=/opt/zimbra/conf/freshclam.conf
$ zmamavisdctl restart
$ zmcontrol status
Procédure de mise à jour:
# su - zimbra
$ /opt/zimbra/common/bin/sa-update -D
$ zmamavisdctl restart
$ mkdir /tmp/state
$ mv /opt/zimbra/data/spamassassin/state /tmp/state
$ zmamavisdctl restart
$ zmcontrol status
Pour ne pas avoir de problème lors de l'envoi des mails, il est conseillé d'utiliser un relais SMTP pour l'envoi des mails à l'extérieur du domaine.
En effet, il y a de grandes chances pour que tous les mails envoyés avec notre propre serveur soient considérés comme du SPAM.
C'est pour cette raison qu'il vaut mieux utiliser un relais SMTP de confiance, mais qui dit de confiance, dit forcément authentification surtout si notre serveur ne se trouve pas sur le même réseau que notre relais SMTP.
Dans l'exemple, je vais configurer sur mon serveur ZIMBRA, qui se trouve hébergé chez ONLINE, le relais SMTP de Free (fournisseur de ma box à la maison - j'ai donc le droit par conséquent d'utiliser leur serveur SMTP)
Toutes les commandes ci-dessous doivent être exécutées avec le user zimbra.
## Je me connecter en tant que user zimbra
root@vm-zimbra:~# su - zimbra
## Je renseigne mon relais SMTP
zimbra@vm-zimbra:~$ zmprov ms vm-zimbra.domain.fr zimbraMtaRelayHost smtp.free.fr:587
## Création du fichier relay_password contenant le user et le mot de passe pour le relais smtp
zimbra@vm-zimbra:~$ echo smtp.free.fr user:pass > /opt/zimbra/conf/relay_password
## Conversion du fichier relay_password en table postfix
zimbra@vm-zimbra:~$ postmap /opt/zimbra/conf/relay_password
## Ceci permet de tester que le user et le mot de passe est bien associé au relais smtp
zimbra@vm-zimbra:~$ postmap -q smtp.free.fr /opt/zimbra/conf/relay_password
## Configuration de postfix pour l'utilisation de la table d'identification du relais smtp
zimbra@vm-zimbra:~$ zmprov ms vm-zimbra.domain.fr zimbraMtaSmtpSaslPasswordMaps lmdb:/opt/zimbra/conf/relay_password
## Activation de l'authentification SSL
zimbra@vm-zimbra:~$ zmprov ms vm-zimbra.domain.fr zimbraMtaSmtpSaslAuthEnable yes
## Désactivation de l'utilisation du "canonical name" du relais smtp
zimbra@vm-zimbra:~$ zmprov ms vm-zimbra.domain.fr zimbraMtaSmtpCnameOverridesServername no
## Activation de la séc urité TLS
zimbra@vm-zimbra:~$ zmprov ms vm-zimbra.domain.fr zimbraMtaSmtpTlsSecurityLevel may
Normalement, tout est désormais opérationnel.
Tous les mails envoyés à l'extérieur du domaine seront transférés désormais via le relais SMTP.
Erreurs rencontrées:
1. TLS: can't accept: error:14094415:SSL routines:ssl3_read_bytes:sslv3 alert certificate expired.
2. Unable to start TLS: SSL connect attempt failed error:14090086:SSL routines:ssl3_get_server_certificate:certificate verify failed when connecting to ldap master.
Pas de panique, il suffit juste de suivre la procédure ci-dessous:
Pour générer un nouveau certificat dans Zimbra quand le précédent a expiré, suivre la procédure ci-dessous :
Via SSH, se connecter au serveur Zimbra puis saisir les commandes suivantes (en root)
$ sudo su
# Commencez par générer une nouvelle autorité de certification (CA).
$ /opt/zimbra/bin/zmcertmgr createca -new
...
# Puis générer un certificat signé par le CA qui expire dans 365 jours.
$ /opt/zimbra/bin/zmcertmgr createcrt -new -days 365
...
# Ensuite déployer le certificat.
$ /opt/zimbra/bin/zmcertmgr deploycrt self
...
# Ensuite déployer le CA.
$ /opt/zimbra/bin/zmcertmgr deployca
...
# Pour finir, vérifier que le certificat a été déployé à tous les services.
$ /opt/zimbra/bin/zmcertmgr viewdeployedcrt
::service mta::
...
::service proxy::
...
::service mailboxd::
...
::service ldap::
...
$