Add OpenStack instance meta-data info in your salt grains

During a work session on my salt-states for WebPlatform.org I wanted to shape be able to query the OpenStack cluster meta-data so that I can adjust more efficiently my salt configuration.

What are grains? Grains are structured data that describes what a minion has such as which version of GNU/Linux its running, what are the network adapters, etc.

The following is a Python script that adds data in Salt Stack’ internal database called grains.

I have to confess that I didn’t write the script but adapted it to work within an OpenStack cluster. More precisely on DreamHost’s DreamCompute cluster. The original script came from saltstack/salt-contrib and the original file was ec2_info.py to read data from EC2.

The original script wasn’t getting any data in the cluster. Most likely due to API changes and that EC2 API exposes dynamic meta-data that the DreamCompute/OpenStack cluster don’t.

In the end, I edited the file to make it work on DreamCompute and also truncated some data that the grains subsystem already has.

My original objective was to get a list of security-groups the VM was assigned. Unfortunately the API doesn’t give that information yet. Hopefully I’ll find a way to get that information some day.

Get OpenStack instance detail using Salt

Locally

salt-call grains.get dreamcompute:uuid
local:
    10a4f390-7c55-4dd3-0000-a00000000000

Or for another machine

salt app1 grains.get dreamcompute:uuid
app1:
    510f5f24-217b-4fd2-0000-f00000000000

What size did we create a particular VM?

salt app1 grains.get dreamcompute:instance_type
app1:
    lightspeed

What data you can get

Here is a sample of the grain data that will be added to every salt minion you manage.

You might notice that some data will be repeated such as the ‘hostname’, but the rest can be very useful if you want to use the data within your configuration management.

dreamcompute:
    ----------
    availability_zone:
        iad-1
    block_device_mapping:
        ----------
        ami:
            vda
        ebs0:
            /dev/vdb
        ebs1:
            vda
        root:
            /dev/vda
    hostname:
        salt.novalocal
    instance_action:
        none
    instance_id:
        i-00000000
    instance_type:
        lightspeed
    launch_index:
        0
    local_ipv4:
        10.10.10.11
    name:
        salt
    network_config:
        ----------
        content_path:
            /content/0000
        name:
            network_config
    placement:
        ----------
        availability_zone:
            iad-1
    public_ipv4:
        203.0.113.11
    public_keys:
        ----------
        someuser:
            ssh-rsa ...an rsa public key... someuser-comment@example.org
    ramdisk_id:
        None
    reservation_id:
        r-33333333
    security-groups:
        None
    uuid:
        10a4f390-7c55-4dd3-0000-a00000000000

What does the script do?

The script basically scrapes OpenStack meta-data service and serializes into saltstack grains system the data it gets.

OpenStack’s meta-data service is similar to what you’d get from AWS, but doesn’t expose exactly the same data. This is why I had to adapt the original script.

To get data from an instance you simply (really!) need to make an HTTP call to an internal IP address that OpenStack nova answers.

For example, from an AWS/OpenStack VM, you can know the instance hostname by doing

curl http://169.254.169.254/latest/meta-data/hostname
salt.novalocal

To know what the script calls, you can add a line at _call_aws(url) method like so

diff --git a/_grains/dreamcompute.py b/_grains/dreamcompute.py
index 682235d..c3af659 100644
--- a/_grains/dreamcompute.py
+++ b/_grains/dreamcompute.py
@@ -25,6 +25,7 @@ def _call_aws(url):

     """
     conn = httplib.HTTPConnection("169.254.169.254", 80, timeout=1)
+    LOG.info('API call to ' + url )
     conn.request('GET', url)
     return conn.getresponse()

When you saltutil.sync_all (i.e. refresh grains and other data), the log will tell you which endpoints it queried.

In my case they were:

[INFO    ] API call to /openstack/2012-08-10/meta_data.json
[INFO    ] API call to /latest/meta-data/
[INFO    ] API call to /latest/meta-data/block-device-mapping/
[INFO    ] API call to /latest/meta-data/block-device-mapping/ami
[INFO    ] API call to /latest/meta-data/block-device-mapping/ebs0
[INFO    ] API call to /latest/meta-data/block-device-mapping/ebs1
[INFO    ] API call to /latest/meta-data/block-device-mapping/root
[INFO    ] API call to /latest/meta-data/hostname
[INFO    ] API call to /latest/meta-data/instance-action
[INFO    ] API call to /latest/meta-data/instance-id
[INFO    ] API call to /latest/meta-data/instance-type
[INFO    ] API call to /latest/meta-data/local-ipv4
[INFO    ] API call to /latest/meta-data/placement/
[INFO    ] API call to /latest/meta-data/placement/availability-zone
[INFO    ] API call to /latest/meta-data/public-ipv4
[INFO    ] API call to /latest/meta-data/ramdisk-id
[INFO    ] API call to /latest/meta-data/reservation-id
[INFO    ] API call to /latest/meta-data/security-groups
[INFO    ] API call to /openstack/2012-08-10/meta_data.json
[INFO    ] API call to /latest/meta-data/
[INFO    ] API call to /latest/meta-data/block-device-mapping/
[INFO    ] API call to /latest/meta-data/block-device-mapping/ami
[INFO    ] API call to /latest/meta-data/block-device-mapping/ebs0
[INFO    ] API call to /latest/meta-data/block-device-mapping/ebs1
[INFO    ] API call to /latest/meta-data/block-device-mapping/root
[INFO    ] API call to /latest/meta-data/hostname
[INFO    ] API call to /latest/meta-data/instance-action
[INFO    ] API call to /latest/meta-data/instance-id
[INFO    ] API call to /latest/meta-data/instance-type
[INFO    ] API call to /latest/meta-data/local-ipv4
[INFO    ] API call to /latest/meta-data/placement/
[INFO    ] API call to /latest/meta-data/placement/availability-zone
[INFO    ] API call to /latest/meta-data/public-ipv4
[INFO    ] API call to /latest/meta-data/ramdisk-id
[INFO    ] API call to /latest/meta-data/reservation-id
[INFO    ] API call to /latest/meta-data/security-groups

Its quite heavy.

Hopefully the script respects HTTP headers and don’t bypass 304 Not Modified responses. Otherwise it’ll add load to nova. Maybe I should check that (note-to-self).

Install

You can add this feature by adding a file in your salt states repository in the _grains/ folder. The file can have any name ending by .py.

You can grab the grain python code in this gist.

enjoy!

Project idea: Creating a home made OpenStack cluster for development purposes

Think about it. How about using spare computers to create a homemade OpenStack cluster for development.

We can do that from our cloud provider, or create a separate project or even use Wikimedia’s OpenStack infrastructure allowance for the project.

With such setup, one could work locally with his Salt stack (or Puppet, or Ansible) deployment schemes, try them, trash VMs, rebuild.

The beauty of it would be that it could be made in a fashion that would not even modify the computer running the VMs. The cluster member running OpenStack hypervisor would be installed seeded through net boot. Not booting from the network would revert the computer back as if it never been used.

Here is what I think would require to make this happen.

Limitations

  • Not use Computer/Laptop local hard drive
  • Rely only on net boot

Material

  • 1..n Computers/laptop supporting netboot
  • 1 Storage device supporting one or more storage protocol (nfs, samba, sshfs)

Hardware requirements

  • 1 VM providing tftp, dhcp, dns to serve as net boot server that should run outide of the cluster (“Networking node”)
  • 1 VM image of OpenStack controller (“OpS controller”)
  • 1 LiveCD+persistent image with OpenStack preinstalled, configured to use storage device credentials as it’s root filesystem (“OpS Hypervisor”)

Distribution choice factors

  • Networking node can be the smallest Linux possible, on a RaspberryPI, or a modified Router or Network Attached storage device?
  • OpS Hypervisor to be among the supported OpenStack distributions (I think a Ubuntu precise 12.04 LTS or a variant such as Puppy Linux might work too)

To be continued…

I will keep you posted whenever possible on the outcome of my research.

Did you ever do this in your infra. Leave a comment.

Procedure to create a re-usable configuration export script to move a virtual machine configuration to a new one

The following procedure is about deprecating an old Linux server, and
move crucial configuration to a new fresh install that has the desired
configuration by cloning it, then applying the Old VM‘s configuration.

The steps will go as follows:

  1. Grab the original machine’s configuration
  2. Clone the New VM that will replace the Old
  3. Disable the Old VM web application

1. Grab the original machine’s configuration

The steps will create a tar file with the configurations.

  • Connect to the production vm (morpheus) through the cloud provider console (e.g. vSphere client, or VCloud director webapp or Open Stack console)
    • Connect through Putty, or your local development VM terminal the follwing lines (the console do not share the clipboard)
ssh username@morpheus.networkname.net
  • Create this file
vi ~/make-migrate.sh
  • Enter in vim paste mode
:set paste
  • Paste this content
#!/bin/bash 
cd ~ 
mkdir -p ~/migrate/etc/network 
sudo cp /etc/network/interfaces ~/migrate/etc/network/ 
sudo cp /etc/hostname ~/migrate/etc/ 
sudo cp /etc/resolv.conf ~/migrate/etc/ 
mkdir -p ~/migrate/etc/ssh 
sudo cp /etc/ssh/ssh_host* ~/migrate/etc/ssh/ 
mkdir -p ~/migrate/home/username/.ssh 
cp ~/.ssh/* ~/migrate/home/username/.ssh/ 
mkdir -p ~/migrate/home/username/_prod/app/config 
cp ~/_prod/app/config/parameters.ini ~/migrate/home/username/_prod/app/config 
mkdir -p ~/migrate/etc/apache2/sites-available 
sudo cp /etc/apache2/sites-available/* ~/migrate/etc/apache2/sites-available/ 
sudo cp /etc/resolv.conf ~/migrate/etc/ 
sudo chown -R username:username ~/migrate 
tar cfz ~/migrate.tar.gz ~/migrate 
mv migrate.tar.gz _prod/web/
  • Execute it
/bin/bash ~/make-migrate.sh
  • The latter moves into the
  • Download https://morpheus.networkname.net/migrate.tar.gz

2. Clone the New VM that will replace the Old

This step is about cloning the functionnal VM.

Since it is specific to your cloud management system, I will not describe any way to do so.

Important points to consider while doing so, ensure that you:

  • disable or isolate networking
  • have access to an alternate console

Otherwise you might just create conflicts.

2. Render the production machine unavailable

You should have a copy of the original VM (e.g. morpheus-stg) with the config working the way you want.

This step is specific to the way you might commission or decomission your web app.

You may even not need to decomission it if you have multiple database servers not on the same host.

3. Prepare the New VM to use the Original VM

  • Start the cloned VM
  • Connect through the vCenter console
  • Download the file, sorry, no cut in paste in the cloud provider console :(
  • Assuming you are in /home/username
pwd
/home/username
wget --no-check-certificate https://morpheus.networkname.net/migrate.tar.gz
  • Get the migrate folder from the extracted archive (it will be in a ‘home’ folder after extracting)
tar xfz migrate.tar.gz
mv home/username/migrate .
rm -rf home
  • Disable the network configuration
  sudo /etc/init.d/networking stop
  • Run the following commands:
    • Echo the content of the files inside the migrate/ folder, into their original locations
    • See the file listing:
find migrate/ -type f
  • Create the migrate file original contents
cd migrate
find . -type f > prepare.sh
  • Warning, the following commands we will be using vim to prepare our import script, follow the keyboard types in that sequence:
vim prepare.sh
  • (in the top left corner, where it starts), do:
  • NOTE: FOLLOW BLINDLY THOSE VIM COMMANDS … they written in the form of {modifier key}+{letter}, such as: CTRL+v, SHIFT+A, means the key combination like you would on a Graphical user interface, the + in this list is only to mean together.
dd
CTRL+v
100j
$
y
SHIFT+A
  • Add a few spaces, to make the cursor go further than the longest line
ESC
p
  • The following commands, you have to be in ESC mode, and press ENTER when finished:
:%s/  \./ /
:%s/\./cp \./
  • All is done, write and quit
:wq
  • Check the file
cat prepare.sh
  • You will end up with a file similar to
cp ./home/username/_prod/app/config/parameters.ini    /home/username/_prod/app/config/parameters.ini  
cp ./home/username/.ssh/id_rsa                        /home/username/.ssh/id_rsa  
cp ./home/username/.ssh/geritt_dsa.pub                /home/username/.ssh/geritt_dsa.pub  
cp ./home/username/.ssh/geritt_dsa                    /home/username/.ssh/geritt_dsa  
cp ./home/username/.ssh/authorized_keys2              /home/username/.ssh/authorized_keys2  
cp ./home/username/.ssh/config                        /home/username/.ssh/config  
cp ./home/username/.ssh/known_hosts                   /home/username/.ssh/known_hosts 
cp ./home/username/.ssh/id_rsa.pub                    /home/username/.ssh/id_rsa.pub 
cp ./etc/ssh/ssh_host_rsa_key.pub                     /etc/ssh/ssh_host_rsa_key.pub  
cp ./etc/ssh/ssh_host_dsa_key                         /etc/ssh/ssh_host_dsa_key 
cp ./etc/ssh/ssh_host_dsa_key.pub                     /etc/ssh/ssh_host_dsa_key.pub  
cp ./etc/ssh/ssh_host_ecdsa_key.pub                   /etc/ssh/ssh_host_ecdsa_key.pub 
cp ./etc/ssh/ssh_host_rsa_key                         /etc/ssh/ssh_host_rsa_key  
cp ./etc/ssh/ssh_host_ecdsa_key                       /etc/ssh/ssh_host_ecdsa_key 
cp ./etc/hostname                                     /etc/hostname  
cp ./etc/resolv.conf                                  /etc/resolv.conf  
cp ./etc/network/interfaces                           /etc/network/interfaces
  • Execute that newly created script, first check you are in /home/username/migrate
pwd
/home/username/migrate
  • We’ll run as root
sudo -s
  • Echo a file or two, to test BEFORE->AFTER
cat /etc/network/interfaces
...
cat /etc/hostname
morpheus-stg
  • Now, run the file
/bin/bash ./prepare.sh
  • they should be different :)
cat /etc/network/interfaces
...
cat /etc/hostname
morpheus.networkname.net
  • Make sure the /etc/hosts file reflects, and points at 127.0.0.1
127.0.0.1   localhost morpheus.networkname.net morpheus
  • You can use vim regex like so:
sudo vim /etc/hosts
:%s/morpheus-stg/morpheus/
:wq
  • Use apache command tools to disable the old site and enable the prod ones:
sudo ll /etc/apache/sites-available
...
-rw-r--r-- 1 root root 1052 Feb 20 19:19 /etc/apache2/sites-available/default
-rw-r--r-- 1 root root 7469 Feb  6  2012 /etc/apache2/sites-available/default-ssl
-rw-r--r-- 1 root root 1917 Feb 20 15:48 /etc/apache2/sites-available/ssl
  • Enable only ssl, and default (NOT ‘default-ssl‘)
sudo a2dissite
10-project.local.conf
sudo a2ensite
default ssl
  • Restart the server
sudo service apache2 restart

3. Decomission the original, use the new VM as the new Production

This is, again, specific to the way you might commission or decomission your web app

Procédure pour avoir un environnement de dévelopement local facile à configurer avec Apache

Je ne sais pour vous, mais je ne peut plus programmer sans avoir l’environement serveur localement sur ma machine. Changer ou ajouter un fichier VirtualHost pour chaque nouveau projet est assez répétitif. Il doit y avoir une façon automatique de le faire?

Oui.

Ça s’appelle VirtualDocumentRoot

J’ai ce tutoriel qui traîne dans mon Wiki personnel depuis des lustres, et c’est maintenant que je commence a migrer mes projets sous NGINX que je décide de le mettre en ligne. Il n’est jamais trop tard pour publier.

Cette méthode de configuration répond exactement au besoin précis de ne pas avoir a configurer un hôte virtuel apache pour chaque projet.

Avec cette procédure, vous n’aurez qu’a maintenir votre fichier hosts, le reste suivra tout seul.

Vous pouvez appliquer cette technique avec n’importe quelle version du serveur http “Apache”. Cette procédure peut même être faite si vous développez sous Windows ou Mac OS avec les distributions du serveur HTTP Apache sous Windows telles que MAMP, XAMPP, et EasyPHP.

Pourtant avec un serveur web local, ce type de configuration est possible depuis longtemps, il faut simplement savoir comment ça s’appelle: VirtualDocumentRoot.

Voici comment je configure mon environnement LAMP depuis quelques temps.

Procédure

Établissement du standard

Tout commence par une certaine convention. Avec celle-ci, tout devrait suivre automatiquement.

L’idée est de pouvoir accéder a un l’espace de travail du projet A du client B sur ma machine locale. L’adresse locale n’est plus localhost, mais quelque chose de plus explicite.

Ce que j’apprécie le plus de cette méthode car elle permet de conserver dans un dossier parent tout ce qui est spécifique pour le projet et le client. Le code a exécuter qui soit dans un sous-dossier ne feait que du sens.

Par exemple, un projet appelé projectname du client client serait classé dans un dossier sous le chemin /home/renoirb/workspace/client/projectname.

Le code du projet web serait accessible via le serveur web à l’adresse http://projectname.client.dev/ qui pointe vers l’adresse IP de la station de travail locale.

L’espace de travail du projet

IMPORTANT
Il faut que les noms de dossiers soient en minuscule et aucun espace, ni caractères accentués, sinon le serveur Apache risque de ne pas trouver le dossier. Principalement parce que l’adresse entrée dans le navigateur est convertie en bas de case, et que généralement un système d’exploitation qui se respecte fait une différence entre, par exemple ‘Allo’ et ‘allo’.

La convention suggérée va comme suit:

  • chaque projet est classé dans un chemin prévisible, similaire à /home/renoirb/workspace/client/projectname
  • le projet a un dossier web/
  • les autres dossiers au même niveau que web/ peuvent être n’importe quoi d’autre.

Idéalement, la logique applicative ne devrait pas être visible publiquement de toute façon. Seulement le fichier principal appelle l'”autoloader” en dehors du DocumentRoot.

De cette façon le vous pouvez classer tout vos projets du même client, et séparer par projets.

La procédure tient aussi en compte
* L’utilisateur courrant puisse écrire dans son dossier workspace/ avec Apache2 comme s’il était son propre utilisateur avec mpm-itk
* Le nom de domaine utilisé définit dans quel dossier de l’utilisateur chercher

Procédure

  • Assurer que les modules sont chargés
     sudo a2enmod vhost_alias
  • Ajouter le fichier default a la config de apache
     sudo vi /etc/apache2/ports.conf
  • Vérifier qu’il y a ceci:
    NameVirtualHost *:80 
    Listen 80 
    UseCanonicalName Off
  • Modifier le fichier de config du VirtualHost par défaut
  • Fichier de configuration par magique
    sudo vi /etc/apache2/sites-available/default
  • Verifier qu’il y a ce bloc dans <VirtualHost ...>:
    <IfModule mpm_itk_module>
        AssignUserId renoirb users
    </IfModule>
  • Remplacer la mention DocumentRoot par ce format:
    VirtualDocumentRoot /home/renoirb/workspaces/%1/%0/web

Sources

Créer un tunnel SSH inverse pour pouvoir supporter à distance un ami utilisant Linux

Avez-vous déjà voulu accéder a votre ordinateur Unix/Linux/MacOS d’un ami, chez ou ailleurs, et que vous avez besoin de l’aider a distance?   En tant qu’utilisateur de Linux, si vous aider quelqu’un d’autre qui n’Est pas habitué, il peut vouloir votre aide. Cette procédure peut vous aider a l’aider, a distance.

Ça vient de m’arriver. Je vais vous montrer comment j’ai fait.

Ce que j’ai utilisé:

  1. Une machine avec OpenSSH que chaque personne à accès (une instance Amazon EC2?)
  2. Créer un nouvel utilisateur temporaire pour la personne a aider
  3. Ordinateur a réparer roulant Linux/Unix/MacOS/Cygwin (qui a OpenSSH serveur et client)

Ce que j’avait fait avec, en plus de cette procédure, c’est un script RC qui créait une connection permanente, avec une connection SSH qui ne requiert pas de mot de passe.

L’idée étaait que peu importe le lieu ou mon ami se trouve, dès qu’il/elle a un lien à Internet, j’ai accès a son ordinateur portable.

Ma procédure décrit comment créer un lien entre ces deux machines.

Continue reading “Créer un tunnel SSH inverse pour pouvoir supporter à distance un ami utilisant Linux”

devLAB Montréal c’est maintenant parti!

Je l’avait annoncé. Nous avons particié a des événements, joints d’autres. Maintenant, depuis Janvier 2011, à tous les mercredis, nous vous invitons a vous joindre a nos rencontres. Donc,depuis cinq semaines maintenant nous hébergeons au public nos ateliers de travail qu’on appelait nos GeekNights maintenant surnommé devLAB.

Comment devLAB a commencé?

Tout a commencé en 2006. Le besoin est né après plusieurs mois à discuter de technologie a deux (avec Etienne) a prendre une bière au 3Brasseurs et de parler de binaire, netmask… vous savez, des trucs de Geeks. Nous avons joins notre  vieil ami Stephan et nous avons officialisé le pacte que nous avons tenu de 2006-2009. Une fois par semaine tous les Mercredis soir nous suivions ce concept:

  1. Se rencontrer peu importe la charge de travail au bureau
  2. Faire avancer une idée
  3. Utiliser quelque chose qu’on a jamais utilisé avant
  4. Pratiquer les méthodologies pour prendre les plis qu’on ne pouvait pas toujours prendre au bureau

Parfois nous en faisions des CodeFests qui duraient une fin de semaine complète. D’autres fois nous invitions des amis a jouer avec nous sur des sujets divers.

Continue reading “devLAB Montréal c’est maintenant parti!”

Comment remplacer les caract√®res bizzares dans WordPress lorsqu’on a mal fait la conversion

Accrocheur mon titre n’est-ce pas? Je trouve ça tellement pas drôle lorsque ça m’arrive ce genre de situation avec les caractères accentués. Le problème n’arrive pas tout le temps qu’avec WordPress.

Voici, enfin, une suite a mon billet Pourquoi tout ces caractères bizzares. Je devais travailler sur un problème de conversion de caractères pour un client dus a une conversion non réussie et/ou terminée entre latin1 et utf-8 puis je me suis remis a penser a ce problème. Pourquoi ne pas le régler, et documenter!

Voilà pourquoi ce billet ;)

La situation

Mon cas était bien simple. J’avait mal fait ma sauvegarde lors d’un transfert et j’avait tout mes commentaires, billets, et autres données qui avait des accents “transform√©s comme √áa” (transformés comme ça).

Ce genre de problème arrive pour toutes sortes de raisons. Mais le symptôme est le même. Si vous avez des
Je partage avec vous mon bout de code a «copier-coller» dans phpmyadmin pour votre blogue WordPress si vous avez ces problèmes (oubliez-pas de faire des sauvegardes là(!)).

Plusieurs tutoriels existent pour régler la situation mais mon cas était assez unique. J’ai conservé le problème puis j’ai publié plusieurs billets (qui sortent bien) et laissé ceux “ab√Æm√©s” là. Il n’était plus question d’extraire, convertir et ré-importer.

Pourquoi?!

C’est une réponse assez complexe. L’article UTF-8 sur TikiWiki.org l’explique en détail.

In short, UTF-8 is a character encoding that uses 1 to 3 bytes for each character.
It is one of the existing character encodings of the UCS (Universal Character Set), that contains nearly a hundred thousand abstract characters (including ASCII characters).

UTF-8 greatly simplifies the task of internationalization by replacing multiple alternative encodings (such as ISO8859-15 Latin-9, which encodes those English, French, German, Spanish and Portuguese characters not available in ASCII).

En simple, le UTF-8 est un format d’encodage qui utilise 1 a 3 bytes pour chaque caractère. C’est un format d’encodage qui comprend près de plusieurs centaines de milliers de caractères (Incluant ceux du ASCII).

UTF-8 est fait pour contenir tout les caractères existants pour simplifier l’internationalisation.

C’est un standard qui est pas nécessairement jeune mais qui n’était pas non plus supporté partout.

MySQL a commencé a le supporter qu’a partir de la version 4.1.

Ce qui arrive c’est qu’avec le temps, les gens prennent de plus en plus soin de rendre accessible pour toutes les langues leur applications. Ainsi un russe pourrait écrire en cyrillic et un Japonais en Kanji dans la même base de donnée. Le coup est difficile! Surtout que les versions de MySQL et PHP et Java offrent maintenant le choix par défaut en UTF-8… lorsqu’on fait pas attention: on se fait coincer!

Continue reading “Comment remplacer les caract√®res bizzares dans WordPress lorsqu’on a mal fait la conversion”

Procédure pour créer un serveur FTP sécurisé SSL forcé avec usager virtuels sous Ubuntu Linux avec vsFTPd

Je ne sais pas si vous êtes comme moi mais je n’aime pas laisser non crypté l’accès a un service qui me demande un mot de passe. Je devait monter un serveur cette semaine qui doit avoir les accès FTP.

J’ai pris l’initiative de sécuriser la machine avec du SSL car je crois qu’aujourd’hui c’est notre devoir de faire ce genre de chose. Ce n’est pas la première fois que je configure un serveur FTP over SSL mais je n’avait jamais pris de notes vraiment à ce jour. Je l’ai fait cette fois-ci!

Ce que cette procédure fait…

  1. Pouvoir créer des comptes FTP sans avoir a créer un utilisateur local (donc pas accès shell (SSH)).
  2. Permet les connections FTP over SSL de façon EXPLICITE sur un port non standard  (cet exemple utilisera le port 6123)
  3. Ne permet pas d’utilisateur ni de connexions anonymes
  4. Bannit les hôtes qui tentent de se connecter (LOGIN FAILED) via fail2ban
  5. Utilise le system PAM interne pour l’authentification
  6. Ne requiert pas d’usager local (pas de risque de tentative de connection SSH, usager séparés)
  7. Le serveur FTP roule sur son propre usager

Continue reading “Procédure pour créer un serveur FTP sécurisé SSL forcé avec usager virtuels sous Ubuntu Linux avec vsFTPd”

Comment dire à Apache le mime-type d’un document Office 2007

J’ai entendu parler de certains Problèmes avec les documents .docx qui son considérés comme étant des fichiers zip. J’ai pensé partager avec vous comment j’ai réparé la situation.

Il est possible que le serveur apache ne considère pas les fichiers doc sur le serveur comme étant des fichiers office. Normalement un navigateur téléchargera le fichier et ouvrira avec le programme qu’il considère comme étant le bon.

A moins que l’ordinateur du visiteur ait pas de bonne association de fichier, dans ce cas, on peut rien y faire.

Pour aider, on peut annoncer au serveur web les associations MIME.

Le problème avec cette méthode qui ne sert presque a rien, c’est que ça ne changera rien si

  1. Le visiteur n’a pas de bonne association sur son système d’exploitation
  2. Le visiteur n’a pas Microsoft Office 2007 ou Open Office

Continue reading “Comment dire à Apache le mime-type d’un document Office 2007”

Les différentes versions du service de tâches planifié CRON

Suite a mon article «Comment automatiser une tâche avec CRON en utilisant Vim» je me suis venu aux questions sur les différences essentielles entre les versions de CRON.

Le concept de CRON est, un «lanceur de commandes» planifié pour les systèmes UNIX. Le nom est inspiré du dieu grec Chronos.

Ayant déjà utilise Gentoo Linux j’avait vu qu’il était possible d’utiliser plus d’une version de CRON mais je ne m’était jamais penché sur les différences. Je l’ai fait aujourd’hui.

Continue reading “Les différentes versions du service de tâches planifié CRON”

Script bash pour transférer une base de donnée MySQL d’un serveur à l’autre

Il m’est arrivé récemment de devoir transférer plusieurs dizaines de sites web d’un serveur à l’autre manuellement.

Dans ce billet j’expliquerai le processus que j’ai utilisé pour en finir par produire un script bash qui pourrait vous être utile.

à propos du projet

Considérant que certains sites avaient plus d’une base de données il était hors de question de faire a bras les lignes mysqldump, ssh (en fait le transfert se fait en compressant le fichier et le copiant via une redirection gzip avec cat), mysql pour, en ordre, dumper la base de données, la transférer, et la restaurer…. sans oublier les CREATE users pour chaque.

Je me suis dit: faisons-en un script!

 

Continue reading “Script bash pour transférer une base de donnée MySQL d’un serveur à l’autre”

Une VM Linux qui sert au développement PHP 5.3 avec Eclipse – partie III

Ce billet est le troisième d’une série d’articles décrivant la fabrication d’une Machine Virtuelle (VM) de développement pour une équipe de dévelopeurs.

Cette partie couvrira l’installation de Apache et de PHP 5.3 (la dernière version depuis Juin 2009) qui offre beaucoup d’avancées. Je pense que c’est devenu le juste minimum a cause de ces nouvelles fonctionnalités. Voir articles faits par IBM developerworksWhat’s new in PHP 5.3 (part 1, part 2, part 3, and part 4)“.

Continue reading “Une VM Linux qui sert au développement PHP 5.3 avec Eclipse – partie III”

Une VM Linux qui sert au développement PHP 5.3 avec Eclipse – partie II

Ce billet est le deuxième d’une série d’articles décrivant la fabrication d’une Machine Virtuelle (VM) de développement pour une équipe de dévelopeurs.

Ce billet expliquera comment j’installe un système Linux que je considère de base pour une infrastructure d’hébergement applicatif. Je ne couvrirai pas les configurations plus avancés pour améliorer la sécurité. Je risque de le faire plus tard.
Continue reading “Une VM Linux qui sert au développement PHP 5.3 avec Eclipse – partie II”

Une VM Linux qui sert au développement PHP 5.3 avec Eclipse – partie I

La Virtualisation c'est comme des roches en équilibreCe billet est le premier d’une série d’articles décrivant la fabrication d’une Machine Virtuelle (VM) de développement pour une équipe de dévelopeurs.

Je mentionne PHP 5.3 mais en fait ce type d’installation pourrait être utilisé pour n’importe quelle technologie web qui peut rouler sous Linux (Ruby on Rails, Java, Perl, etc).

J’ai séparé cette série en quatre volets.

  1. Description du concept (cet article)Ce que je vais discuter dans cette série d’articles n’est pas nécessairement connu de tous. Je vais donc vulgariser un peu avant de commencer.
  2. Installation du systèmeJe donne ici mon secret de magicien avec quelques configurations que je considère importantes pour un environement d’hébergement web pour améliorer la sécruité (le strict minimum pour cette série d’articles. Je pourrai en faire un plus poussé plus tard).
  3. Compilation de PHP 5.3Comment installer Apache 2.x avec le dernier cutting-edge PHP.
  4. Installation de l’environnement de développement avec Eclipse PDT (à venir)La magie se passe par là! Avec ce setup votre équipe pourra répliquer l’installation de développement a volonté.

Mise à jour et façon différente de fonctionner

Dans un billet plus récent (que celui-ci) j’explique comment le faire pour un Mac.

Mise en contexte

Pour développer, j’utilise depuis deux ans une machine virtuelle (VM) Linux (minimale) qui me sert de “bac à sable”… Le but de cette série d’articles. Dans cette VM il y a tout les outils nécessaires aux projets en-cours et ils sont configurés pour refléter l’environnement de production où je déploie mon travail.

Ce type d’installation est idéal car il permet d’avoir a installer les prérequis une seule fois et pouvoir les dupliquer pour tout les dévelopeurs. Sans oublier que vous n’avez plus de préoccupations de licences logicielles.

A la fin de cette série d’articles vous aurez accès a une VM qui représentera votre environement de production (ajuster à vos besoins de production, évidemment).
Continue reading “Une VM Linux qui sert au développement PHP 5.3 avec Eclipse – partie I”

Un firewall simple sous Linux avec «Ferm»

Attention: Article Technique!

Dans le but de faire profiter la postérité et ma mémoire personnelle voici mon premier post d’une série d’articles spécialisée sur Linux.

Ces articles proviennent de ma voûte documentaire professionnelle et personnelle.

Évidemment pour les publier ici je dois censurer les détails sensibles, vous me comprendrez (!)

Le fait de les avoir dans le format Wiki Markup de Confluence… et les traduire ici demande du temps pour les reformatter pour mon blogue.

D’autres articles spécialisés Debian Linux

D’autres articles technique (pour Debian Linux) seront aussi disponibles dans les prochaines semaines.

Voici une liste de quelques uns que je compte publier:

  1. Monter une machine en SNMP v2c en lecture seule
  2. Permettre des updates aux serveurs NTP a l’heure
  3. Installer VMware server 2 sur Debian
  4. Augumenter le niveau de sécurité pour Infra Publique sous Debian
  5. Procédure configuration SYSLOG-NG vers un serveur de log

J

Continue reading “Un firewall simple sous Linux avec «Ferm»”

Créer un tunnel SSH avec session distante en Console VMWare

Il existe plusieurs page de how-to’s pour se connecter a une application a distance. Mais j’ai envie de mettre pour mes propres archives.

Ce billet prend en considérations que…

  • Vous voulez vous connecter a un service précis (disons VMWare Server Console)
  • Sur une machine parmi un réseau de X ordinateurs
  • Le gateway (routeur) relie toutes les connections vers un host en Linux (proxysrv) qui sert a s’authentifier et accéder au reste du réseau.
  • Le serveur sur le réseau qui héberge des machines virtuelles avec VMWare Server (vmserver1).
  • Le port 902 (le port TCP que vous voulez utiliser) sur le firewall interne (de vmserver1) est ouvert. Et
  • Vous voulez vous connecter a un de ses VM.

Mise à jour

Ce billet a été écrit originalement en 2007. À l’époque il n’existait pas de VMware ESXi, ni de VMware Server 2. Les concepts sont toujours bons par contre.

Continue reading “Créer un tunnel SSH avec session distante en Console VMWare”

Lorsque gérer un réseau peut rimer avec vigilance plutôt que réparation

Les collègues qui travaillent avec moi pour le réseau savent ce que qu’implique chaque modification dans le réseau. Nous travaillons pour remonter le réseau et atteindre un certain niveau côté qualité qui rendra notre travail plus facile pour tous.

Parmi ces améliorations, il s’agit d’un moyen de savoir si tout est correct et être averti si un changement à été opéré et même savoir “où est le bobo”.

Il s’agit du service de monitoring avec Nagios. Il ne s’agit ici pas d’un howo-to technique mais plutôt ma “review” de ce que l’installation que j’ai monté peut faire.

Continue reading “Lorsque gérer un réseau peut rimer avec vigilance plutôt que réparation”

Copier un fichier d’un serveur à l’autre en le compressant pour la route via NetCat et

J’ai voulu un jour transférer des fichiers entre deux machines et les fichiers je les trouvaient lourds. Habituellement j’aurait utilisé soit rsync ou scp mais cette fois ci je voulait utiliser un processus un peu différent. Pourquoi ne pas compresser le contenu durant le transfert? Continue reading “Copier un fichier d’un serveur à l’autre en le compressant pour la route via NetCat et”

Installer VMWare sur Ubuntu server avec le repositoire de Canonical

UPDATE 2009-08: Je prévois faire un nouvel article pour couvrir ce sujet car cette version de Ubuntu est désuète.

Personnellement, je n’utilise plus Ubuntu comme un serveur. J’utiliser Debian Linux pour mes serveurs. Ubuntu demeure mon poste de travail favori.

Je donnerai le lien du bon post une fois qu’il sera en ligne.

 

L’idée c’est d’avoir un serveur rack-mount minimal fait pour héberger les VM d’infrastructure du réseau. Actuellement plusieurs de nos serveurs *physiques* ont déjà X-Windows sur leur hôtes (SuSE v10, RHEL 4 U5, Gentoo 2007.0, Ubuntu, etc.) Mais ce sont des installations qui ont été faites avec tout ce qu’il sortait sans réfléchir ou se pencher sur l’économie de ressources. Ce serveur sera minimal coté installation, et maximisé sur VMWare… voici les étapes que j’ai fait.

Continue reading “Installer VMWare sur Ubuntu server avec le repositoire de Canonical”

Doubler la fiabilité avec un miroir MySQL, un mini-Howto

Imaginez que vous avec plusieurs sites a gérer. Sur un serveur, disons, monté en RAID-1 sur deux disques SATA en md-devices. C’est bien, les données sont dupliqués et si un disque dur brise, les données survivent. Évidemment ça ne nous protège pas des erreur de manipulation.

Une redondance comme je l’ai monté implique deux serveurs distincts qui ont chacun leur adresse ip et leur setup. Les serveurs ont deux adapteurs réseau et je les ai reliés ensemble et donné une adresse ip privé pour qu’ils puissent parler ensemble sans passer par Internet. Chaque serveur à les fichiers de sites pour chaque usager et chacun se connecte a mysql en localhost. La réplication se passe donc par l’adresse privée donc aucune encryption est nécessaire entre les peers.

Plus tard je devrai monter un service de miroirisation via rsync mais ce n’est pas le but de “ce” post.

Veuillez noter qu’il s’agit d’un howto TR√àS TECHNIQUE et je NE PEUT PAS nécessairement GARANTIR le FONCTIONNEMENT si vous faites simplement que COPIER SANS RÉFLÉCHIR.
Continue reading “Doubler la fiabilité avec un miroir MySQL, un mini-Howto”