Introduction Système, LP ASUR 2018 - 2019

Plan du cours


Programmation shell

Démarrer avec RosettaHub

Quelques outils pour installer des paquets : la problématique des dépendances

Conteneurs et composants d'isolation (LXC, cgroup, namespace) : environnements virtualisés

Introduction aux technologies DevOps


Programmation shell

Le shell est un interpréteur de commandes et aussi un langage de programmation. Il existe de nombreux shell (interpréteurs de commandes), parmi lesquels sh, bash, tcsh, zsh... Sur un système d'exploitation Unix, il est utilisé pour programmer des enchainements de tâches visant par exemple le déploiement, l'installation et la configuration d'un Service. Sur ma machine personnelle, je trouve par exemple les scripts suivants :

MBPdeChristophe:local christophecerin$ cd /
MBPdeChristophe:/ christophecerin$ find . -iname "*.sh"
./usr/bin/power_report.sh
./usr/libexec/feedback/sleepwake.sh
./usr/libexec/postfix/mk_postfix_spool.sh
./usr/libexec/postfix/set_credentials.sh
find: ./usr/sbin/authserver: Permission denied
./usr/local/go/misc/ios/clangwrap.sh
./usr/local/go/src/cmd/go/mkalldocs.sh
./usr/local/go/src/cmd/vendor/github.com/google/pprof/test.sh
./usr/local/go/src/runtime/mknacl.sh
./usr/local/go/src/syscall/mkall.sh
./usr/local/go/src/syscall/mkerrors.sh
./usr/local/go/src/syscall/mksysnum_plan9.sh
./usr/local/bin/pv.sh
./usr/local/bin/unix-lpr.sh
./usr/local/bin/gvmap.sh
./usr/local/bin/lprsetup.sh

Remise en forme / Révisions Relire les chapitres d'un cours de système du semestre 1 : Chapitre 4 et Chapitre 5. Pour continuer à réviser les notions vues au réalable voir le lien suivant à l'Idris. Vous pouvez aussi consulter Wikipedia pour un résumé des principales commandes Unix. Encore mieux : le super résumé des commandes Bash. Il y a aussi un point spécial pour lire des fichiers texte.

Ecriture de scripts. Les objectifs de ce polycopié sont d'introduire la syntaxe du langage de commande bash et de faire du lien avec les notions fondamentales de tout langage de programmation : mise en séquence, choix et itération. Par ailleurs on remarquera que bash est un langage beaucoup moins typé que C par exemple : on peut ranger dans i un entier puis, plus loin dans le code source, une chaine. Par ailleurs, bash possède un mécanisme d'évaluation d'expressions un peu particulier et ne permet pas de faire directement de l'arithmétique sur les réels. Cela constitue également deux points de discussion du cours. En un mot, bash est replacé dans un contexte permettant de le situer entre les langages «à la C» et les langages dits de script (Perl, Python...).

Introduction aux expressions régulières. Il s'agit de décrire des motifs au moyen de classes prédéfinies normalisées. Ces classes prédéfinies sont des raccourcis pour faciliter la tâche du programmeur. Différents exemples de description de motifs via des classes sont présentés dans différents outils/langages. Par ailleurs et bien que non étudiées, voir aussi les pages sur la norme UNICODE pour exprimer des motifs.

Unix tools et REGEX (introduction à sed, cut, tail, head et notions de awk). Bash peut être utilisé pour l'administration d'un système : des fichiers en langage bash permettent l'activation de services, la vérification qu'un service est actif... Pour réaliser ces tâches, les outils sed, tail, head et awk sont introduits pour filtrer le résultat de commandes Unix (cp, ls, ps, cut ...) ou de scripts bash (un script bash est un programme dans la syntaxe du langage bash qui peut faire des appels à des commandes Unix externes au langage). On en profite pour compléter la description de motifs qui sont mis en correspondance avec un texte à vérifier (notion d'expression régulière).

Le cours sur le langage C et les appels système. Les objectifs sont d'être sensibilisé à la hiérarchie des droits entre utilisateurs et d'apprendre à programmer des appels aux fonctions internes du système d'exploitation. Les appels systèmes renvoient aux structures de données du noyau Unix. Les appels systèmes peuvent être effectués en mode utilisateur (un utilisateur ayant des droits minimaux peut les appeler) ou en mode noyau (le super utilisateur seul peut les effectuer – par exemple, reprogrammer l'ordonnanceur des processus). Ensuite nous passerons à la présentation des outils make et des outils d'archivage ... Il s'agit ici d'aspects organisationnels visant à structurer les différentes phases permettant de passer d'un code source à un code exécutable. A cette occasion nous parlerons aussi des fichiers objets, des librairies partagées, des librairies statiques.

Les exercices sont ici ou encore . Il y a également des exercices pour SED. Enfin vous pouvez consulter les questions et réponses à certains problèmes récurrents.


Démarrer avec RosettaHub

La ressource informatique (CPU, disque, réseau) est abondante... et parfois gratuite. Nous allons utiliser la plateforme RosettaHub pour prendre des machines viruelles chez Amazon. Le point d'entrée et la documentation à lire est le suivant.

Je vais commenter toute la documentation et nous allons réaliser la réservation d'instances chez Amazon.

Il y a un point technique qui heurte souvent les étudiants : la notion de clés publiques / clés privées. Ces notions sont utiles pour les questions d'authentification qui reposent sur les certificats de confiance. Pour se familiariser avec ces notions, voir le cours de crypto ou encore, de manière pratique à ce document à la partie SSH. La génération de clés est détaillée ici. C'est très important pour nous puisqu'il va falloir s'authentifier auprès d'Amazon/RosettaHub. En fait il y a deux façons de voir les choses. Soit vous générez des clés et vous devez les déposer sur le "serveur", soit c'est le serveur qui vous donne des clés que vous devez déposer dans un répertoire .ssh de votre arborescence.


Quelques outils pour installer des paquets sous Linux : la problématique des dépendances

Historiquement il y avait plusieurs formats pour les applications packagées pour une distribution Linux : rpm, deb... De même, il y a plusieurs outils pour automatiser l'installation et la configuration d'une application que vous souhaitez installer. Vous pouvez prendre comme point d'entrée la documentation Ubuntu suivante.

Comme exercice d'application, vous pouvez prendre une machine virtuelle chez Amazon et demander l'installation de LAMP (Apache, PHP, Mysql).

Attention, Python par exemple a une gestion propre des paquets. Veuillez par exemple installer libcloud. Pour faire les exemples de la home page de libcloud, en utilisant EC2 comme provider, vous allez avoir besoin d'informations pour l'authentification auprès de AWS alors que nous utilisons la passerelle RosettaHub.

  Yep, un utilisateur RosettaHUB dispose d'un compte AWS (donc EC2)
  qui est lui est dedié. Il y accède a travers la console et une
  session STS (en cliquant sur "Go To Aws Console") ou bien
  programmatiquement a travers les clefs fournies en bas de la
  premiere colonne du dashboard RosettaHUB (section "Advanced
  Settings"). Pour les administrateurs, "advanced settings" apparait
  puis on sélectionne "My Details" en haut de la première colonne.
Le langage de programmation Go a aussi un mécanisme de gestion spécifique des librairies qui lui est propre. Voir ici pour installer une librairie de clustering (rassembler des objets identiques). A titre d'exercice, vous pouvez installer Go, puis cette librairie, puis vous pouvez faire tourner un des exemples proposé.


Conteneurs et composants d'isolation : environnements virtualisés

Les conteneurs offent des mécanismes de virtualisation des ressources du système d'exploitation. Ils sont en train de supplanter les mécanismes de machines virtuelles (VM) pour de nombreuses raisons. Ils sont par exemples moins gourmands en terme de mémoire consommée.

Un point d'entrée possible pour les notions de virtualisation est tout simplement la page Wikipedia. Je vais bien entendu commenter chacune des techniques. Nous allons plus particulièrement commenter les notions de cgroups et les name spaces qui regroupent les concepts (voir en bas de la page Wikipedia pour des tutoriels / documentation). Ces notions sont au coeur des projets orientés conteneurs comme Docker.

Pour jouer avec les conteneurs :

  • nous allons utiliser l'interface de programmation LXC. Je vous invite à suivre l'exemple Getting Started. Si nous étions plus ambitieux, nous pourrions nous servir de cet exemple pour concevoir un outil "à la Docker" c.à.d capable d'allouer, à partir d'une file de requêtes, des conteneurs sur différentes machines du cloud Amazon.
  • nous allons faire le TP suivant qui concerne les machines virtuelles (VMs) et les conteneurs.


Introduction aux technologies DevOps

Le devops est un mouvement en ingénierie informatique et une pratique technique visant à l'unification du développement logiciel (dev) et de l'administration des infrastructures informatiques (ops), notamment l'administration système. Nous allons nous contenter ici d'examiner un outil de la chaîne des outils de DevOps.

Nous pouvons effectivement suivre pas à pas l'utilisation de Ansible. Nous pouvons déployer 3 machines dans Amazon et automatiser le déploiement d'applications sur ces machines. Ansible est fait pour cela ! Enfin, pour nous qui sommes des grands débuttants avec ces technologies, c'est sur le papier. Nous allons voir ce que l'on peut vraiment faire en pratique. La clef du succès est d'être au clair sur les concepts d'Ansible, par exemple en lisant la page suivante issue du site du projet. Nous y verrons qu'Ansible est un outil "that automates cloud provisioning, configuration management, application deployment, intra-service orchestration, and many other IT needs." Un couteau Suisse ?

Pour votre information et concernant les outils DevOps pour configuration, provisionning et deploiement, l'univers de la distribution Linux Ubuntu utilise l'outil conjure-up qui est construit sur les technologies Juju, MAAS et LXD (voir le User manual). Conjure-up va vous permettre d'installer simplement des frameworks complexes tels que OpenStack ou Kubernetes.

Mais pour le TP, nous allons utiliser un autre outil dans la famille des outils DevOps : le sujet de votre travail est ici. Patience, patience !

Pour une discussion sur "Ansible et Vagrant", je vous recommande cette page et si nous avons du temps nous pourrions examiner ces exemples de couplage Ansible-Vagrant pour installer et configurer différentes VMs. Ce sont des exemple d'utilisation du provisionner Ansible dans Vagrant.