Outils de déploiement

Afin de permettre le développement et les expérimentations autour de OSFS, il est souhaitable d'automatiser autant que possible les phases d'installation et de paramétrage de la plateforme. De plus, il est préférable d'avoir un processus commun entres les différents types de plateforme. Notre choix de plateforme commune réside dans un environnement salt-ready. À partir de cette étape le déploiement et la configuration des systèmes peut être réalisée de manière commune.

Plateforme visée

Cette section reprend les principales étapes de déploiement pour chacune des deux plateformes visées.

Plateforme virtuelle

Le processus décrit dans la suite de cette section vise à mettre en place la plateforme expérimentale décrite précédemment.

plateforme virtuelle de développement

Architecture système de la plateforme de développement (virtualisée)

Préparation de l'hyperviseur

Installation de paquets

Les paquets suivants sont nécessaires à la plateforme:

  • libvirt-bin: environnement de virtualisation libvirt qui par dépendance déploie aussi QEmu.
  • bridge-utils: CLI pratique pour certaine opération sur les bridges.
  • salt (dépôt et binaire): infrastructure de configuration et de gestion (détails ici)
  • virtinst: pour la construction de VM en ligne de commande

Ce qui se traduit par:

$ sudo apt-get install libvirt-bin bridge-utils
$ wget -O - https://repo.saltstack.com/apt/debian/8/amd64/latest/SALTSTACK-GPG-KEY.pub | sudo apt-key add -
$ sudo /bin/sh -c 'echo "deb http://repo.saltstack.com/apt/debian/8/amd64/latest jessie main" > /etc/apt/sources.list.d/salt.list'
$ sudo apt-get update
$ sudo apt-get install salt-ssh salt-master
Paramétrage disque

Afin de permettre un maximum de flexibilité, les unités de stockage sont:

  • construite avec LVM,
  • puis des snapshot et des merge sont réalisés au cours des divers cycles de développement.
$ sudo lvcreate -n ctrl-1 -L 10G data  # création, à partir du VG data, du disque /dev/data/ctrl-1 de 10Go
$ sudo lvcreate -n ctrl-1_snap -L 10G -s /dev/data/ctrl-1 # création d'un snapshot COW intégral du disque ctrl-1 nommé ctrl-1_snap
$ sudo lvconvert --merge data/ctrl-1_snap # merge du snapshot ctrl-1_snap dans son disque d'origine
Paramétrage réseau

Dans le contexte de la plateforme expérimentale virtuelle, les réseaux, au niveau de l'hyperviseur, sont constitués par des bridges. La mise en place de ces réseaux se fait à l'aide de libvirt. Le paramétrage d'un nouveau réseau se fait à l'aide d'une description en XML

<network>
  <name>default</name>
  <forward mode='nat'/>
  <bridge name='virbr0' stp='on' delay='0'/>
  <ip address='192.168.122.254' netmask='255.255.255.0'>
    <dhcp>
      <range start='192.168.122.100' end='192.168.122.200'/>
    </dhcp>
  </ip>
</network>

Dans cette description sont spécifiés:

  • name: le nom du réseau
  • forward: la mise en place d'un NAT pour la sortie du réseau
  • bridge: la création du bridge virbr0 pour instancier ce réseau sur l'hyperviseur
  • ip: pour définir l'adresse IP du l'interface virbr0
  • dhcp: la définition d'un serveur DHCP sur le réseau en cours de création avec la plage d'adresse dynamique

Lorsqu'aucune sortie du réseau n'est voulue, la description XML du réseau peut se réduire à:

<network>
  <name>data</name>
  <bridge name='virbr1' stp='on' delay='0'/>
</network>
Paramétrage de salt-ssh

Création des VMs

Toujours avec l'aide de la libvirt, les VM sont créées de manière automatique avec:

  • virt-install
  • une configuration preseed de Debian
Utilisation de virt-install
$ sudo /usr/bin/virt-install \
    --name ctrl-1 \               # nom de la VM
    --ram=4096 \                  # quantité de RAM (en Mo)
    --vcpu=2 \                    # nombre de vCPUs
    --os-type linux \             # définie le type d'OS dans la VM
    --os-variant debianwheezy \   # définie un sous-type
    --graphics none \             # pas d'interface graphique
    --console "pty,target_type=serial" \            # définition et usage de la console sur port série
    --location "http://ftp.fr.debian.org/debian/dists/jessie/main/installer-amd64/" \ # source d'installation de Debian
    --initrd-inject=/tmp/preseed \                  # localisation du fichier preseed
    --extra-args "console=ttyS0,115200n8 serial" \  # paramètre noyau pour la déclaration de la console sur port série
    --noautoconsole \                               # pas d'ouverture automatique d'une console pendant l'installation
    --disk /dev/data/ctrl-1 \     # rattachement du disque /dev/data/ctrl-1 à la VM
    --network bridge=virbr0       # connection de l'interface réseau à un bridge (virbr0)

Les options --disk et --network peuvent être répétées autant que nécessaire pour disposer de plusieurs disques ou de plusieurs interfaces réseau.

Définition du fichier preseed

Le fichier preseed précédemment fournit à l'installateur est présenté ci-dessous. Il s'agit d'une version allégée du fichier exemple fournit par Debian (ici).

L'objet de ce fichier est de répondre à toutes les questions de l'installateur Debian de manière automatique. En particulier, le fichier contient:

  • le nom de la machine
  • l'interface réseau sélectionnée ainsi que les paramètres réseaux (en configuration statique)
  • la configuration du disque dur
  • le choix des paquets à installer
  • la mise en place d'une clé publique SSH pour les connexions ultérieures

Dans le contexte de OSFS, le choix est fait de générer autant de fichiers preseed que de systèmes voulus.

preseed.cfg (Source)

# The values can also be preseeded individually for greater flexibility.
d-i debian-installer/language string en
d-i debian-installer/country string FR
d-i debian-installer/locale string en_US.UTF-8

# Keyboard selection.
# keymap is an alias for keyboard-configuration/xkb-keymap
d-i keyboard-configuration/xkb-keymap select fr
d-i keyboard-configuration/toggle select No toggling

# Continue the install without loading kernel modules?
d-i anna/no_kernel_modules boolean yes

# To pick a particular interface instead:
d-i netcfg/choose_interface select eth0

# If you prefer to configure the network manually, uncomment this line and
# the static network configuration below.
d-i netcfg/disable_autoconfig boolean true

# Static network configuration.
#
# IPv4 example
d-i netcfg/get_ipaddress string 192.168.122.11
d-i netcfg/get_netmask string 255.255.255.0
d-i netcfg/get_gateway string 192.168.122.254
d-i netcfg/get_nameservers string 192.168.122.254
d-i netcfg/confirm_static boolean true

# Any hostname and domain names assigned from dhcp take precedence over
# values set here. However, setting the values still prevents the questions
# from being shown, even if values come from dhcp.
d-i netcfg/get_hostname string ctrl-1
d-i netcfg/get_domain string api.runstack.net

# Disable that annoying WEP key dialog.
d-i netcfg/wireless_wep string

### Mirror settings
# If you select ftp, the mirror/country string does not need to be set.
#d-i mirror/protocol string ftp
d-i mirror/country string manual
d-i mirror/http/hostname string http.us.debian.org
d-i mirror/http/directory string /debian

# Suite to install.
d-i mirror/suite string jessie

# Root password, either in clear text
d-i passwd/root-password password xxxx
d-i passwd/root-password-again password xxxx

# To create a normal user account.
d-i passwd/user-fullname string cephsrv
d-i passwd/username string cephsrv
d-i passwd/user-password password xxxx
d-i passwd/user-password-again password xxxx

### Clock and time zone setup
# Controls whether or not the hardware clock is set to UTC.
d-i clock-setup/utc boolean true

# You may set this to any valid setting for $TZ; see the contents of
# /usr/share/zoneinfo/ for valid values.
d-i time/zone string Europe/Paris

# Controls whether to use NTP to set the clock during the install
d-i clock-setup/ntp boolean true

# Alternatively, you may specify a disk to partition. If the system has only
# one disk the installer will default to using that, but otherwise the device
# name must be given in traditional, non-devfs format (so e.g. /dev/hda or
# /dev/sda, and not e.g. /dev/discs/disc0/disc).
# For example, to use the first SCSI/SATA hard disk:
d-i partman-auto/disk string /dev/vda
# In addition, you'll need to specify the method to use.
# The presently available methods are:
# - regular: use the usual partition types for your architecture
# - lvm:     use LVM to partition the disk
# - crypto:  use LVM within an encrypted partition
d-i partman-auto/method string lvm

# If one of the disks that are going to be automatically partitioned
# contains an old LVM configuration, the user will normally receive a
# warning. This can be preseeded away...
d-i partman-lvm/device_remove_lvm boolean true
# The same applies to pre-existing software RAID array:
d-i partman-md/device_remove_md boolean true
# And the same goes for the confirmation to write the lvm partitions.
d-i partman-lvm/confirm boolean true
d-i partman-lvm/confirm_nooverwrite boolean true

# You can choose one of the three predefined partitioning recipes:
# - atomic: all files in one partition
# - home:   separate /home partition
# - multi:  separate /home, /usr, /var, and /tmp partitions
d-i partman-auto/choose_recipe select multi

# This makes partman automatically partition without confirmation, provided
# that you told it what to do using one of the methods above.
d-i partman-partitioning/confirm_write_new_label boolean true
d-i partman/choose_partition select finish
d-i partman/confirm boolean true
d-i partman/confirm_nooverwrite boolean true
d-i partman-basicfilesystems/no_mount_point yes

# Next you need to specify the physical partitions that will be used.
d-i partman-md/confirm boolean true
d-i partman-md/confirm_nooverwrite boolean true

# This makes partman automatically partition without confirmation.
d-i partman-md/confirm boolean true
d-i partman-md/confirm_nooverwrite boolean true
d-i partman-partitioning/confirm_write_new_label boolean true
d-i partman/choose_partition select finish
d-i partman/confirm boolean true
d-i partman/confirm_nooverwrite boolean true

### Apt setup
# You can choose to install non-free and contrib software.
d-i apt-setup/non-free boolean true
d-i apt-setup/contrib boolean true
d-i apt-setup/services-select multiselect security, updates, backports
d-i apt-setup/security_host string security.debian.org

# Additional repositories, local[0-9] available
d-i apt-setup/local0/repository string \
       http://ftp.fr.debian.org/debian/ jessie-backports main contrib non-free
d-i apt-setup/local0/comment string Jessie backports

### Package selection
tasksel tasksel/first multiselect standard, ssh-server

d-i pkgsel/upgrade select full-upgrade

# Some versions of the installer can report back on what software you have
# installed, and what software you use. The default is not to report back,
# but sending reports helps the project determine what software is most
# popular and include it on CDs.
popularity-contest popularity-contest/participate boolean false

d-i grub-installer/only_debian boolean false
d-i grub-installer/with_other_os boolean true
d-i grub-installer/bootdev  string /dev/vda
d-i debian-installer/add-kernel-opts string console=ttyS0,115200n8 serial

# Avoid that last message about the install being complete.
d-i finish-install/reboot_in_progress note

# This is how to make the installer shutdown when finished, but not
# reboot into the installed system.
#d-i debian-installer/exit/halt boolean true
# This will power off the machine instead of just halting it.
d-i debian-installer/exit/poweroff boolean true

d-i preseed/late_command string \
  in-target mkdir /root/.ssh ; \
  echo "ssh-rsa AAAA..." > /target/root/.ssh/authorized_keys

Plateforme physique

/images/todo.jpg
  • Nécessité d'un équipement de déploiement
  • mise en place dhcp / pxe / tftp boot

Outils OSFS

Afin d'aider et de simplifier la mise en place des testbeds et l'automatisation du déploiement des plateformes, un outils est en cours de développement. L'outils osfs permettra:

  • installer les éléments nécessaire au déploiement de la plateforme (virtuelle ou physique)
  • générer les fichiers de configurations d'un nouvel environnement
  • exécuter les étapes de déploiement ainsi que leurs suivis
  • gérer les machines virtuelles d'une plateforme virtuelle

L'aide de la commande est la suivante:

$ osfs.py --help
usage: osfs.py [-h] [--cfg CFG] [--env ENV]
               {env-list,env-setdefault,env-register,env-unregister,env-reset,env-snap,env-rmsnap,env-info,env-build,lv-create,vm-create,vm-destroy,vm-rebuild,vm-reset,vm-snap,salt,salt-run,salt-state}
               ...

positional arguments:
  {env-list,env-setdefault,env-register,env-unregister,env-reset,env-snap,env-rmsnap,env-info,env-build,lv-create,vm-create,vm-destroy,vm-rebuild,vm-reset,vm-snap,salt,salt-run,salt-state}
                        availables sub-command
    env-list            list of registered environment
    env-setdefault      select a default environment
    env-register        register a new environment
    env-unregister      unregister an existing environment
    env-reset           Reset ALL the VM of an environment
    env-snap            create a new snap of all the VM of an environment
    env-rmsnap          delete a snap for all the VMs
    env-info            info about the current environment
    env-build           build the current environment
    lv-create           create a logical volume in thinpool
    vm-create           create a vm from scratch
    vm-destroy          totally destroy a vm
    vm-rebuild          destroy an create a vm
    vm-reset            reset a vm to its snapshot
    vm-snap             reset a vm to its snapshot
    salt                Run salt cmd
    salt-run            Run salt-rum cmd
    salt-state          Apply salt state to the vm

optional arguments:
  -h, --help            show this help message and exit
  --cfg CFG             config file
  --env ENV             select an environment

Installation

Commandes spécifiques: virtualisation

vm-create

vm-destroy

vm-rebuild

vm-reset

vm-snap

Commandes spécifiques: matérielle

Commandes communes

salt

salt-run