Table of Contents

VAGRANT: Provisionnement Chef Server

Chef Server permet de provisionner une machine virtuelle sans avoir à conserver les livres de recettes dans le référentiel lui-même. Cette approche présente divers avantages, tels que la possibilité d'utiliser des livres de recettes de production à partir du serveur Chef pour approvisionner un environnement de développement.

Créer et initialiser Vagrantfile

Le fichier Vagrant est écrit dans un langage DSL ( Ruby Domain Specific Language) pour la configuration des machines virtuelles Vagrant.

Le minimum requis pour provisionner à l'aide du client Chef consiste à fournir l'URL du serveur Chef, ainsi que le chemin d'accès à la clé de validation, afin que le nœud puisse s'enregistrer auprès du serveur Chef. Le nœud sera enregistré avec le serveur Chef spécifié.

Création de l'objet config

Vagrant utilisera cet objet config pour configurer la machine virtuelle:

 Vagrant.configure ("2") do |config|
 ...
 end

Définir les options de de soclage

Dans le bloc de configuration, indiquer à Vagrant quelle image de machine virtuelle utiliser pour démarrer le nœud:

 config.vm.box = "dgfip/centos7"
 config.vm.box_url = "http://xx.xx.xxx.xxx:8089/boxes/vagrant/boxes/dgfip-rhel7-0.4.0.box"

Définir les options réseau

config.vm.define "dgfip-rhel7"
config.vm.network "private_network", libvirt__network_name: "br0"

Création et configuration du bloc chef_client

Après avoir sélectionné l'image de la machine virtuelle à démarrer, configurer la mise en service de la boîte à l'aide de Chef. La configuration de Chef se fait dans un bloc Ruby imbriqué:

 config.vm.provision: chef_client do |chef|

 end

Dans ce bloc on doit indiquer à Vagrant comment connecter le nœud virtuel au serveur Chef.

Tout d'abord, indiquer à Vagrant où stocker tous les éléments Chef sur le nœud:

 chef.provisioning_path = "/etc/chef"

Définition de l'URL du serveur Chef

La première étape du provisionnement avec le serveur chef consiste à indiquer à Vagrant l'emplacement du serveur. Ceci est fait ci-dessous:

Indiquer à vagrant le point de terminaison de l'API du serveur Chef en utilisant le nom de l'organisation qui a été créée dans le compte sur Hosted Chef.

 chef.chef_server_url = "https://xx.xx.xxx.xxx:10443/organizations/dgfip/"

Définition des options de validation

Adapter les options de validationation à celles définies lors de la création de l'organization:

chef.validation_client_name = "jacques"
chef.client_key_path = "/etc/chef"

Définition du chemin de la clé de validation

Le serveur Chef utilise des paires de clés afin de vérifier et d’enregistrer des nœuds auprès du serveur Chef (comme pour l’authentification basée sur une clé SSH). La clé de validation est utilisée par un client non enregistré pour se vérifier et s’enregistrer auprès du serveur Chef. Vagrant doit connaître le chemin d'accès à cette clé de validation afin de configurer le client pour le serveur Chef.

Indiquer à vagrant où trouver la clé privée téléchargée lors de la création de l'organisation sur Hosted Chef:

 chef.validation_key_path = "/etc/chef/jacques-validator.pem"

Personnaliser les éléments d'identification du noeud

Indiquer à Vagrant comment nommer le nœud:

 chef.node_name = "serveur"

Définir les options de provisionnement

Adapter le réseau

Le noeud est fournit avec deux interfaces:

Il faut modifier l'adresse de l'interface eth1 pour lui donner une autre adresse (sinon toutes les machines auront la mêmme adresse) ainsi que la route par défaut (GATEWAY).

config.vm.provision "shell", run: "always", inline: <<-SHELL

ifconfig eth1 xx.xx.xxx.xxx netmask 255.255.255.0 up
route del default gw 192.168.121.1
route add default gw xx.xx.xxx.x

SHELL

La syntaxe du script shell est importante :
* les délimiteurs EOF et SHELL ne doivent ni être précédés ni suivis d'aucun caractère
* le saut de ligne après «-SHELL et après «-EOF est nécessaire

Spécifier la liste d'exécution (run list)

La liste d'exécution est la liste des tâches à exécuter sur le nœud, qui sont des recettes et/ou des rôles. Habituellement, la liste d’exécution est gérée par le serveur Chef. Dans ce cas, vous n'avez rien à faire, car par défaut, Vagrant extraira la liste des exécutions du serveur du chef. Mais on peut spécifier directement la liste des tâches en utilisant les aides fournies par la configuration, qui s’expliquent assez bien:

Vagrant::Config.run do |config|
  config.vm.provision :chef_client do |chef|
    # Provision with the apache2 recipe
    chef.add_recipe("apache2")

    # Provision with the database role
    chef.add_role("database")
  end
end

Si on doit accéder directement à la liste d'exécution, on peut également utiliser l'accesseur run_list :

Vagrant::Config.run do |config|
  config.vm.provision :chef_client do |chef|
    # Modifying the run list directly
    chef.run_list = ["recipe[foo]", "role[bar]"]
  end
end

Spécifier l'environnement

Depuis Chef 0.10 on peut configurer l'environnement dont un nœud fait partie, en utilisant l'option de configuration de l'environment :

Vagrant::Config.run do |config|
  config.vm.provision :chef_client do |chef|
    # Set the environment for the chef server
    chef.environment = "development"
  end
end

Nettoyer la configuration

Lorsqu'on configure une machine virtuelle Vagrant avec le serveur Chef, il crée une nouvelle entrée de nœud Chef et une entrée Client Chef sur le serveur Chef, à l'aide du nom d'hôte de la machine (par exemple, vagrant-ubuntu-oneiric ). Après avoir démonté la machine virtuelle, on doit explicitement supprimer ces entrées du serveur Chef avant d'en configurer une nouvelle avec le serveur Chef. Par exemple, en utilisant knife :

$ knife node delete vagrant-ubuntu-oneiric 
$ knife client delete vagrant-ubuntu-oneiric 

Si on ne le fait pas, on obtiendra le message d'erreur suivant lorsqu'on tentera de provisionner une nouvelle machine virtuelle avec le même nom d'hôte:

HTTP Request Returned 409 Conflict: Client already exists.