Automatisation DevOps avec Linux
Automatisation DevOps avec Linux
GNU/Linux
Automatisation - DevOPS
1.2, 23-08-2017
Table des matières
Préface. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
Crédits . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
Licence . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
Généralités devops . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
Le vocabulaire DEVOPS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
La gestion de configuration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
Puppet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
Vocabulaire Puppet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
Architecture . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
Installation. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
Hello world . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
Depuis internet :. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
Documentation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
Commandes utiles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
Cas concrets. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
Modification de valeurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
Ansible . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
Le vocabulaire ansible . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
Utilisation. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
Les modules . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
Exemple d’installation logiciel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
Les playbooks . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
Les rôles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
La commande ansible-galaxy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
Ansible Niveau 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
Les variables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
Le module ini_file . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
Le module lineinfile . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
Le module copy. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
Le module fetch . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
Le module template . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
Le module get_url . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
Les rôles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
La commande ansible-galaxy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
Ansistrano . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40
Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40
Module 4 : Ansistrano . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
Installation. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59
Configuration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60
Utiliser RunDeck. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60
Créer un projet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61
Installation. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65
En mode standalone . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65
Installer Nginx . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67
Configuration de Jenkins . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69
Sources . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75
Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76
Le format asciidoc . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76
Compiler sa documentation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77
Références . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78
Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79
La HCL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80
Les providers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80
Les actions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81
Les provisionners. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83
Les variables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83
TD. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85
Glossaire . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86
Index . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89
FORMATUX - Support de cours GNU/Linux
Préface
GNU/Linux est un système d’exploitation libre fonctionnant sur la base d’un noyau Linux,
également appelé kernel Linux.
Linux est une implémentation libre du système UNIX et respecte les spécifications POSIX.
GNU/Linux est généralement distribué dans un ensemble cohérent de logiciels, assemblés autour
du noyau Linux et prêt à être installé. Cet ensemble porte le nom de “Distribution”.
• Les plus connues et utilisées sont les distributions Debian, RedHat et Arch, et servent de base
pour d’autres distributions comme Ubuntu, CentOS, Fedora, Mageia ou Manjaro.
Chaque distribution présente des particularités et peut être développée pour répondre à des
besoins très précis :
• services d’infrastructure ;
• pare-feu ;
• serveur multimédia ;
• serveur de stockage ;
• etc.
La distribution présentée dans ces pages est la CentOS, qui est le pendant gratuit de la distribution
RedHat. La distribution CentOS est particulièrement adaptée pour un usage sur des serveurs
d’entreprises.
Crédits
Ce support de cours a été rédigé par les formateurs :
• Patrick Finet ;
• Antoine Le Morvan ;
• Xavier Sauvignon ;
• Nicolas Kovacs.
Licence
Formatux propose des supports de cours Linux libres de droits à destination des formateurs ou des
personnes désireuses d’apprendre à administrer un système Linux en autodidacte.
Les supports de Formatux sont publiés sous licence Creative Commons-BY-SA et sous licence Art
Libre. Vous êtes ainsi libre de copier, de diffuser et de transformer librement les œuvres dans le
Préface | 1
FORMATUX - Support de cours GNU/Linux
Les documents de Formatux et leurs sources sont librement téléchargeables sur framagit :
• [Link]
A partir des sources, vous pouvez générer votre support de formation personnalisé. Nous vous
recommandons le logiciel AsciidocFX téléchargeable ici : [Link]
2 | Préface
FORMATUX - Support de cours GNU/Linux
Généralités devops
Attendus du cours
Connaissances :
Niveau technique :
Le mouvement devops cherche à optimiser le travail de toutes les équipes intervenant sur un
système d’information.
• Les développeurs (les dev) cherchent à ce que leurs applications soient déployées le plus
souvent et le plus rapidement possible.
• Les administrateurs systèmes, réseaux ou de bases de données (les ops) cherchent à garantir la
stabilité, la sécurité de leurs systèmes et leur disponibilité.
Les objectifs des dev et des ops sont donc bien souvent opposés, la communication entre les
équipes parfois difficile : les dev et les ops n’utilisent pas toujours les mêmes éléments de langage.
• Il n’y a rien de plus frustrant pour un développeur que de devoir attendre la disponibilité d’un
administrateur système pour voir la nouvelle fonctionnalité de son application être mise en
ligne ;
• Quoi de plus frustrant pour un administrateur système de devoir déployer une nouvelle mise à
jour applicative manuellement alors qu’il vient de finir la précédente ?
La philosophie devops regroupe l’ensemble des outils des deux mondes, offre un langage commun,
afin de faciliter le travail des équipes avec comme objectif la performance économique pour
l’entreprise.
Le travail des développeurs et des administrateurs doit être simplifié afin d’être automatisé avec
des outils spécifiques.
Le vocabulaire DEVOPS
• le build : concerne la conception de l’application ;
• l'intégration continue (Continuous Integration CI) : chaque modification d’un code source
entraîne une vérification de non-régression de l’application.
Généralités devops | 3
FORMATUX - Support de cours GNU/Linux
• idempotence : une opération est idempotente si elle a le même effet qu’on l’applique une ou
plusieurs fois. Les outils de gestion de configuration sont généralement idempotent.
4 | Généralités devops
FORMATUX - Support de cours GNU/Linux
Même si la connaissance du Bash est une exigence de base pour un administrateur système,
celui-ci est un langage de programmation interprété "impératif". Il exécute les instructions
les unes à la suite des autres.
Les langages dédiés au domaine (DSL Domain Specific Language) comme Ansible ou Puppet,
quant à eux, ne spécifient pas les étapes à réaliser mais l’état à obtenir.
Parce qu’Ansible ou Puppet utilisent un langage déclaratif, ils sont très simples. Il suffit de
leur dire "Fais cette action" ou "Met le serveur dans cet état". Ils considéreront l’état désiré
indépendamment de l’état initial ou du contexte. Peu importe dans quel état le serveur se
situe au départ, les étapes à franchir pour arriver au résultat, le serveur est mis dans l’état
désiré avec un rapport de succès (avec ou sans changement d’état) ou d’échec.
La même tâche d’automatisation en bash nécessiterait de vérifier tous les états possibles, les
autorisations, etc. afin de déterminer la tâche à accomplir avant de lancer l’exécution de la
commande, souvent en imbriquant de nombreux "si", ce qui complique la tâche, l’écriture et
la maintenance du script.
◦ Puppet
◦ Ansible
◦ Saltstack
◦ Chef
• Intégration continue
◦ Jenkins
◦ Gitlab-ci
◦ Rundeck
Généralités devops | 5
FORMATUX - Support de cours GNU/Linux
Lorsque les environnements grossissent ou que les équipes accueillent de plus en plus de
techniciens, ces méthodes sont difficiles à maintenir et à optimiser. Elles peuvent causer des
risques pour la sécurité du système, incluant des erreurs de configuration, ce qui au final, peut
faire réduire la productivité.
Parmi les systèmes de gestion de configurations, plusieurs systèmes ont fait leur apparition :
• puppet ;
• chef ;
• ansible ;
• etc.
Des outils ont également fait leur apparition pour encore faciliter l’administration de ces systèmes :
La gestion de configuration
La gestion de configuration est le processus de standardisation des configurations de ressources et
l’assurance de leur état dans l’infrastructure informatique, avec des méthodes automatisées mais
agiles. Le management de configurations est devenu critique pour le succès des projets
informatiques.
Concrètement, lors de l’ajout d’un nouveau serveur au sein d’une infrastructure informatique
complexe, les administrateurs système ne doivent pas perdre de temps pour la configuration des
briques de base du système : la configuration des services NTP, DNS, SMTP, SSH, la création des
comptes utilisateurs, etc… doit être totalement automatisée et transparente aux équipes.
système.
Puppet
Puppet a été conçu pour fonctionner en mode client-serveur. Son utilisation en mode de
fonctionnement « autonome » est également possible et facile. La migration vers un système de
clients « Puppet / Master Puppet » n’est pas d’une réalisation complexe.
Puppet est un logiciel d’automatisation qui rend simple pour l’administrateur système le
provisionnement (la description matérielle d’une machine virtuelle), la configuration et la gestion
de l’infrastructure tout au long de son cycle de vie. Il permet de décrire l’état de configuration d’un
ensemble hétérogène de stations de travail ou de serveurs et de s’assurer que l’état réel des
machines correspond bien à l’état demandé.
Par sa structure de langage, il fait le lien entre les bonnes pratiques, le cahier de procédures et l’état
effectif des machines.
Vocabulaire Puppet
• Module : unité de code Puppet qui est réutilisable et pouvant être partagé ;
• Facter : librairie multi-plateforme qui fournit à Puppet sous forme de variables les
informations propres au système (nom, adresse ip, système d’exploitation, etc.) ;
• Ressource (Resource): objet que Puppet peut manipuler (fichier, utilisateur, service, package,
etc.) ;
Architecture
Puppet conseille de coupler son fonctionnement avec un gestionnaire de version type « git ».
La communication est assurée via des canaux chiffrés, en utilisant le protocole https et donc TLS
Toute la configuration (le référentiel) de Puppet est centralisée dans l’arborescence /etc/puppet du
serveur de référence :
• /etc/puppet/manifests/[Link] : est le premier fichier analysé par Puppet pour définir son
référentiel. Il permet de définir les variables globales et d’importer des modules ;
Installation
Les dépôts Puppets doivent être activés :
[puppetlabs-deps]
name=Puppet Labs Dependencies EL 6 - $basearch
baseurl=[Link]
gpgkey=[Link]
enabled=1
gpgcheck=1
puis :
Hello world
Pour fonctionner, le client autonome puppet a besoin d’un fichier appelé manifeste, dont
l’extension sera en « .pp ».
L’installation d’un module complémentaire pourra se faire, soit directement depuis internet, soit
par le téléchargement manuel de l’archive .[Link].
Depuis internet :
export http_proxy=[Link]
export https_proxy=[Link]
Sans connexion internet, un module peut être installé en fournissant dans la commande puppet le
chemin vers le fichier [Link] :
Grâce aux modules du dépôt Puppet, les possibilités de l’outil sont quasiment infinies. Le
téléchargement et l’utilisation des modules du dépôt permettent un gain de temps confortable car
l’outil nécessite peu de compétences en développement.
Documentation
La liste des types et leurs attributs est consultable en ligne :
• [Link]
• [Link]
Commandes utiles
Lister les objets connus par puppet :
puppet describe -l
Cas concrets
La création d’un noeud (node)
Le code du manifeste doit être découpé en classe pour des raisons de maintenance et d’évolutivité.
Un objet de type node recevra les classes à exécuter. Le node « default » est automatiquement
exécuté.
node default {
include init_services
}
La classe init_services contient les services qui doivent être lancés sur le nœud et ceux qui doivent
être stoppés :
class init_services {
service { [“sshd”,”NetworkManager”,”iptables”,”postfix”,”puppet”,”rsyslog”,”sssd”,
”vmware-tools”]:
ensure => ‘running’,
enable => ‘true’,
}
service { [“atd”,”cups”,”bluetooth”,”ip6tables”,”ntpd”,”ntpdate”,”snmpd”,”snmptradp”]:
ensure => ‘stopped’,
enable => ‘false’,
}
}
La ligne ensure ⇒ a pour effet de démarrer ou non un service, tandis que la ligne enable ⇒ activera
ou non le démarrage du service au démarrage du serveur.
La classe create_users contiendra les utilisateurs de notre système. Pensez à ajouter l’appel de cette
classe dans le node default !
class create_users {
user { ‘antoine’:
ensure => present,
uid => ‘5000’,
gid => ‘users’,
shell => ‘/bin/bash’,
home => ‘/home/antoine’,
managehome => true,
}
}
node default {
include init_services
include create_users
}
Au départ du personnel pour mutation, il sera aisé de supprimer son compte en remplaçant la ligne
ensure ⇒ present par ensure ⇒ absent et en supprimant le reste des options.
La directive managehome permet de créer les répertoires personnels à la création des comptes.
group { "DSI":
ensure => present,
gid => 1001
}
file { '/etc/skel/boulot':
ensure => directory,
mode => 0644,
}
file { '/STAGE/utilisateurs/gshadow':
mode => 440,
owner => root,
group => root,
source => "/etc/gshadow"
}
Modification de valeurs
La commande augeas, développée par la société RedHat, permet de modifier les valeurs des
variables dans les fichiers de configuration. Son utilisation peut s’avérer autant puissante que
complexe.
Le contexte est suffixé de « /files/ » pour préciser qu’il s’agit d’un système de fichiers local.
exec { "Redirection":
command => "/usr/sbin/useradd -D > /STAGE/utilisateurs/defaut",
}
De manière générale, les commandes et les fichiers doivent être décrits en absolu
dans les manifestes.
Rappel : la commande whereis fournit le chemin absolu d’une commande.
Ansible
Objectifs
• sans agent (il ne nécessite pas de déploiements spécifiques sur les clients),
L’ouverture des flux SSH vers l’ensemble des clients depuis le serveur Ansible font
de lui un elément critique de l’architecture qu’il faudra attentivement surveiller.
14 | Ansible
FORMATUX - Support de cours GNU/Linux
Le vocabulaire ansible
• Le poste de gestion : la machine sur laquelle Ansible est installée. Ansible étant agentless,
aucun logiciel n’est déployé sur les serveurs gérés.
• Les tâches (tasks) : une tâche est un bloc définissant une procédure à exectuer (par exemple
créer un utilisateur ou un groupe, installer un paquet logiciel, etc.).
• Un module : un module rend abstrait une tâche. Il existe de nombreux modules fournis par
Ansible.
• Les playbooks : un fichier simple au format yaml définissant les serveurs cibles et les tâches
devant être effectuées.
• Un rôle : un rôle permet d’organiser les playbooks et tous les autres fichiers nécessaires
(modèles, scripts, etc.) pour faciliter le partage et la réutilisation du code.
• Les facts : ce sont des variables globales contenant des informations à propos du système (nom
de la machine, version du système, interface et configuration réseau, etc.).
• les handlers: il sont utilisés pour provoquer un arrêt ou un redémarrage d’un service en cas de
changement.
• Installation d’EPEL :
• Le fichier inventaire de gestion des machines clientes hosts : déclaration des clients, des
groupes.
Ansible | 15
FORMATUX - Support de cours GNU/Linux
Le fichier /etc/ansible/hosts
## [Link]
## [Link]
## [Link]
## [Link]
## [webservers]
## [Link]
## [Link]
## [Link]
## [Link]
...
Par exemple, un groupe centos7 est créé en insérant le bloc suivant dans ce fichier :
[centos7]
[Link]
[Link]
Exemples :
16 | Ansible
FORMATUX - Support de cours GNU/Linux
• Exécuter une commande sur un groupe d’hôtes en invoquant le module command avec des
arguments :
Option Information
-a 'arguments' Les arguments à passer au module.
-b -K Demande un mot de passe et lance la commande avec des privilèges
supérieurs.
--user=utilisateur Utilise cet utilisateur pour se connecter à l’hôte cible au lieu d’utiliser
l’utilisateur courant.
--become Exécute l’opération en tant que cet utilisateur (défaut : root).
-user=utilisateur
-C Simulation. Ne fait pas de changement sur la cible mais la teste pour voir ce
qui devrait être changé.
-m module Exécute le module appelé
Ansible | 17
FORMATUX - Support de cours GNU/Linux
Par défaut la connexion par mot de passe n’est pas autorisée par Ansible.
ask_pass = True
Le mot de passe root des serveurs distants vous est demandé, ce qui pose un
problème de sécurité…
18 | Ansible
FORMATUX - Support de cours GNU/Linux
# ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:RpYuJzkkaeZzve8La8Xd/8kTTE8t43DeS+L7WB26WF8 root@ansible-srv
The key's randomart image is:
+---[RSA 2048]----+
| |
| . . |
| = . + .|
| + o * . +.o|
| o * S. . *o*.|
| o * .o ..=+=|
| o. .oooE|
| .+ o.*o+|
| ...+o +o=+|
+----[SHA256]-----+
# ssh-copy-id root@[Link]
# ssh-copy-id root@[Link]
#ask_pass = True
Pour le prochain test, le module shell, permettant l’exécution de commandes à distance, est utilisé :
Ansible | 19
FORMATUX - Support de cours GNU/Linux
Aucun mot de passe n’est demandé, l’authentification par clé privée/publique fonctionne !
Lors de la création d’une instance Amazon, une clef privée est créée et téléchargée sur le poste
local.
ssh-add path/to/[Link]
Utilisation
Ansible peut être utilisé depuis l’interpréteur de commandes ou via des playbooks.
Les modules
Il existe un module pour chaque besoin ou presque ! Il est donc conseillé, au lui d’utiliser le module
shell, de chercher un module adapté au besoin.
Chaque catégorie de besoin dispose de son module. En voici une liste non exhaustive :
Type Exemples
Gestion du système user (création des utilisateurs), group (gestion
des groupes), etc.
Gestion des logiciels yum, apt, pip, npm
Gestion des fichiers copy, fetch, lineinfile, template, archive
Gestion des bases de données mysql, postgresql, redis
20 | Ansible
FORMATUX - Support de cours GNU/Linux
Type Exemples
Gestion du cloud amazon S3, cloudstack, openstack
Gestion d’un cluster consul, zookeeper
Envoyer des commandes shell, script, expect
Gestion des messages
Gestion du monitoring
Gestion du réseau get_url
Le module yum permet d’installer des logiciels sur les clients cibles :
Le logiciel installé étant un service, il faut maintenant le démarrer avec le module service (CentOS
6) ou systemd (CentOS 7) :
Ansible | 21
FORMATUX - Support de cours GNU/Linux
Les playbooks
Les playbooks ansible décrivent une politique à appliquer à des systèmes distants, pour forcer leur
configuration. Les playbooks sont écrits dans un format texte facilement compréhensible
regroupant un ensemble de tâches : le format yaml.
Code Erreur
0 OK ou aucun hôte correspondant
1 Erreur
2 Un ou plusieurs hôtes sont en échecs
3 Un ou plusieurs hôtes ne sont pas joignables
4 Erreur d’analyse
5 Mauvaises options ou options incomplètes
99 Execution interrompue par l’utilisateur
250 Erreur inattendue
Le playbook suivant permet d’installer Apache et MySQL sur nos serveurs cibles :
22 | Ansible
FORMATUX - Support de cours GNU/Linux
---
- hosts: centos7
remote_user: root
tasks:
- name: ensure apache is at the latest version
yum: name=httpd,php,php-mysqli state=latest
- name: ensure httpd is started
systemd: name=httpd state=started
- name: ensure mysql is at the latest version
yum: name=mysql-server state=latest
- name: ensure mysqld is started
systemd: name=mysqld state=started
$ ansible-playbook test
Ansible | 23
FORMATUX - Support de cours GNU/Linux
Dans ce playbook, un serveur va être installé et configuré pour héberger une base de données
MySQL.
Le playbook utilise :
• Des variables ;
• Créer une base de données, un utilisateur et lui donne tous les droits sur les bases de données.
24 | Ansible
FORMATUX - Support de cours GNU/Linux
---
- hosts: centos7
become: yes
vars:
mysqlpackage: "mariadb-server,MySQL-python"
mysqlservice: "mariadb"
mysql_port: "3306"
dbuser: "synchro"
dbname: "mabase"
upassword: "M!rro!r"
tasks:
- name: configurer le noeud 1 dans /etc/hosts
lineinfile:
dest: /etc/hosts
line: "[Link] [Link] mirroir1"
state: present
- name: configurer le noeud 2 dans /etc/hosts
lineinfile:
dest: /etc/hosts
line: "[Link] [Link] mirroir2"
state: present
- name: mariadb installe et a jour
yum: name="{{ mysqlpackage }}" state=latest
- name: mariadb est demarre
service: name="{{ mysqlservice }}" state=started
- name: creer la base de donnee
mysql_db: name="{{ dbname }}" state=present
- name: creer un utilisateur
mysql_user: name="{{ dbuser }}" password="{{ upassword }}" priv=*.*:ALL host='%'
state=present
- name: restart mariadb
service: name="{{ mysqlservice }}" state=restarted
...
• with_items
• with_file
• with_fileglob
• …
Ansible | 25
FORMATUX - Support de cours GNU/Linux
Les rôles
Un rôle Ansible est une unité favorisant la réutilisabilité des playbooks.
Un squelette de rôle, servant comme point de départ du développement d’un rôle personnalisé,
peut être généré par la commande ansible-galaxy :
La commande aura pour effet de générer l’arborescence suivante pour contenir le rôle formatux :
$ tree formatux
formatux/
├── defaults
│ └── [Link]
├── handlers
│ └── [Link]
├── meta
│ └── [Link]
├── [Link]
├── tasks
│ └── [Link]
├── tests
│ ├── inventory
│ └── [Link]
└── vars
└── [Link]
La commande ansible-galaxy
26 | Ansible
FORMATUX - Support de cours GNU/Linux
ansible-galaxy [import|init|install|login|remove|...]
Sous-commandes Observations
install installe un rôle
remove retire un ou plusieurs rôles
init génère un squelette de nouveau rôle
import importe un rôle depuis le site web galaxy. Nécessite un login au préalable.
Ansible | 27
FORMATUX - Support de cours GNU/Linux
Ansible Niveau 2
Objectifs
Les variables
Plus d’informations sur [Link]
playbooks_variables.html
• la valeur simple
• le dictionnaire
Une variable peut être définie dans un playbook, dans un rôle ou depuis la ligne de commande.
---
- hosts: apache1
remote_user: root
vars:
port_http: 80
service:
debian: apache2
centos: httpd
Une fois définie, une variable peut être utilisée en l’appellant entre doubles accolades :
28 | Ansible Niveau 2
FORMATUX - Support de cours GNU/Linux
Par exemple :
tasks:
- name: make sure apache is started
service: name={{ service['centos'] }} state=started
Evidemment, il est également possible d’accéder aux variables globales d’Ansible (type d’OS,
adresses IP, nom de la VM, etc.).
Les variables peuvent être déportées dans un fichier externe au playbook, auquel cas il faudra
définir ce fichier dans le playbook avec la directive vars_files :
---
- hosts: apache1
remote_user: root
vars_files:
- [Link]
Le fichier [Link]
---
port_http: 80
service:
debian: apache2
centos: httpd
Pour afficher une variable, il faut activer le mode debug de la façon suivante :
- debug:
msg: "Afficher la variable : {{ service['debian'] }}"
Pour enregistrer le retour d’une tâche et pouvoir y accéder plus tard, il faut utiliser le mot clef
register à l’intérieur même de la tâche.
Ansible Niveau 2 | 29
FORMATUX - Support de cours GNU/Linux
tasks:
- name: contenu de /home
shell: ls /home
register: homes
Les chaînes de caractères composant la variable enregistrée sont accessibles via la valeur stdout (ce
qui permet de faire des choses comme [Link]("core") != -1), de les exploiter en
utilisant une boucle (voir with_items), ou tout simplement par leurs indices comme vu dans
l’exemple précédent.
Il existe plusieurs types de boucles sous Ansible, en fonction de l’objet que vous voulez manipuler :
• with_items
• with_file
• with_dict
• with_fileglob
• …
Nous pouvons reprendre l’exemple vu durant l’étude des variables stockées pour l’améliorer :
30 | Ansible Niveau 2
FORMATUX - Support de cours GNU/Linux
tasks:
- name: contenu de /home
shell: ls /home
register: homes
Une fois un dictionnaire créé, celui-ci peut être parcouru en utilisant la variable item comme index :
---
- hosts: ansiblecli
remote_user: ansible
become: true
vars:
users:
antoine:
group: users
state: present
erwan:
group: users
state: absent
tasks:
Les conditions
Plus d’informations sur [Link]
playbooks_conditionals.html
L’instruction when est très pratique dans de nombreux cas : ne pas effectuer certaines actions sur
certains type de serveur, si un fichier ou un n’utilisateur n’existe pas, etc.
Ansible Niveau 2 | 31
FORMATUX - Support de cours GNU/Linux
Derrière l’instruction when les variables ne nécessitent pas de doubles accolades (il
s’agit en fait d’expressions Jinja2…).
tasks:
- name: "ne redemarre que les OS Debian"
command: /sbin/shutdown -r now
when: ansible_os_family == "Debian"
tasks:
- name: "ne redémarre que les CentOS version 6 et Debian version 7"
command: /sbin/shutdown -r now
when: (ansible_distribution == "CentOS" and ansible_distribution_major_version ==
"6") or
(ansible_distribution == "Debian" and ansible_distribution_major_version ==
"7")
Les conditions correspondant à un ET logique peuvent être fournies sous forme de liste :
tasks:
- name: "ne redémarre que les CentOS 6"
command: /sbin/shutdown -r now
when:
- ansible_distribution == "CentOS"
- ansible_distribution_major_version == "6"
Le résultat de la variable peut aussi être utilisé conjointement aux conditions when et son absence
de contenu évalué :
tasks:
32 | Ansible Niveau 2
FORMATUX - Support de cours GNU/Linux
En fonction de votre besoin, vous allez être amenés à utiliser différents modules Ansible pour
modifier les fichiers de configuration du système.
Le module ini_file
Lorsqu’il s’agit de modifier un fichier de type INI (section entre [] puis paires de clef=valeur), le plus
simple est d’utiliser le module ini_file.
Le module nécessite :
• La valeur de la section
• Le nom de l’option
• La nouvelle valeur
Exemple d’utilisation :
Le module lineinfile
Pour s’assurer qu’une ligne est présente dans un fichier, ou lorsqu’une seule ligne d’un fichier doit
être ajoutée ou modifiée.
Voir [Link]
Dans ce cas, la ligne à modifier d’un fichier sera retrouvée à l’aide d’une regexp.
Par exemple, pour s’assurer que la ligne commençant par 'SELINUX=' dans le fichier
/etc/selinux/config contiennent la valeur enforcing :
- lineinfile:
path: /etc/selinux/config
regexp: '^SELINUX='
line: 'SELINUX=enforcing'
Ansible Niveau 2 | 33
FORMATUX - Support de cours GNU/Linux
Le module copy
Lorsqu’un fichier doit être copié depuis le serveur Ansible vers un ou plusieurs hosts, dans ce cas il
est préférable d’utiliser le module copy :
- copy:
src: /data/ansible/sources/[Link]
dest: /etc/[Link]
owner: root
group: root
mode: 0644
Le module fetch
Lorsqu’un fichier doit être copié depuis un serveur distant vers le serveur local.
- fetch:
src: /etc/[Link]
dest: /data/ansible/backup/monfichier-{{ inventory_hostname }}.conf
flat: yes
Le module template
- template:
src: /data/ansible/templates/monfichier.j2
dest: /etc/[Link]
owner: root
group: root
mode: 0644
Il est possible d’ajouter une étape de validation si le service ciblé le permet (par exemple apache
avec la commande apachectl -t) :
34 | Ansible Niveau 2
FORMATUX - Support de cours GNU/Linux
- template:
src: /data/ansible/templates/vhost.j2
dest: /etc/httpd/sites-available/[Link]
owner: root
group: root
mode: 0644
validate: '/usr/sbin/apachectl -t'
Le module get_url
Pour télécharger vers un ou plusieurs hôtes des fichiers depuis un site web ou ftp.
- get_url:
url: [Link]
dest: /tmp/[Link]
mode: 0640
checksum: sha256:f772bd36185515581aa9a2e4b38fb97940ff28764900ba708e68286121770e9a
En fournissant un checksum du fichier, ce dernier ne sera pas re-téléchargé s’il est déjà présent à
l’emplacement de destination et que son checksum correspond à la valeur fournie.
Les handlers
Plus d’informations sur [Link]
playbooks_intro.html#handlers-running-operations-on-change
Les handlers permettent de lancer des opérations, comme relancer un service, lors de
changements.
Un module, étant idempotent, un playbook peut détecter qu’il y a eu un changement significatif sur
un système distant, et donc déclencer une opération en réaction à ce changement. Une notification
est envoyée à la fin d’un bloc de tâche du playbook, et l’opération en réaction ne sera déclenchée
qu’une seule fois même si plusieurs tâches différentes envoient cette notification.
Par exemple, plusieurs tâches peuvent indiquer que le service httpd nécessite une relance à cause
d’un changement dans ses fichiers de configuration. Mais le service ne sera redémarré qu’une seule
fois pour éviter les multiples démarrages non nécessaires.
Ansible Niveau 2 | 35
FORMATUX - Support de cours GNU/Linux
Un handler est une sorte de tâche référencé par un nom unique global :
• Il ne se lance pas immédiatement, mais attend que toutes les tâches soient complètes pour
s’exécuter.
Exemple de handlers
handlers:
- name: restart memcached
service: name=memcached state=restarted
- name: restart httpd
service: name=httpd state=restarted
Depuis la version 2.2 d’Ansible, les handlers peuvent se mettre directement à l’écoute des tâches :
handlers:
- name: restart memcached
service: name=memcached state=restarted
listen: "restart web services"
- name: restart apache
service: name=apache state=restarted
listen: "restart web services"
tasks:
- name: restart everything
command: echo "this task will restart the web services"
notify: "restart web services"
Les rôles
Plus d’informations sur [Link]
playbooks_reuse_roles.html
Un squelette de rôle, servant comme point de départ du développement d’un rôle personnalisé,
peut être généré par la commande ansible-galaxy :
La commande aura pour effet de générer l’arborescence suivante pour contenir le rôle claranet :
36 | Ansible Niveau 2
FORMATUX - Support de cours GNU/Linux
$ tree claranet
claranet/
├── defaults
│ └── [Link]
├── handlers
│ └── [Link]
├── meta
│ └── [Link]
├── [Link]
├── tasks
│ └── [Link]
├── tests
│ ├── inventory
│ └── [Link]
└── vars
└── [Link]
Les rôles permettent de s’affranchir totalement de l’inclusion des fichiers. Plus besoin de spécifier
les chemins d’accès aux fichiers, les directives include dans les playbook. Il suffit de spécifier une
tâche, ansible s’occupe des inclusions.
La commande ansible-galaxy
ansible-galaxy [import|init|install|login|remove|...]
Sous-commandes Observations
install installe un rôle
remove retire un ou plusieurs rôles
init génère un squelette de nouveau rôle
import importe un rôle depuis le site web galaxy. Nécessite un login au préalable.
Par défaut, les connexions SSH vers les hosts restent ouvertes durant l’exécution des différentes
tâches d’un playbook sur l’ensemble des noeuds.
Ansible Niveau 2 | 37
FORMATUX - Support de cours GNU/Linux
Dans ce cas, il faudra basculer en mode asynchrone et spécifier un temps maximum d’exécution
ainsi que la fréquence (par défaut à 10s) avec laquelle vous allez vérifier le status de l’hôte.
En spécifiant une valeur de poll à 0, Ansible va exécuter la tâche et continuer sans se soucier du
résultat.
Voici un exemple mettant en oeuvre les tâches asynchrones, qui permet de relancer un serveur et
d’attendre que le port 22 soit de nouveau joignable :
ssh-add path/to/[Link]
38 | Ansible Niveau 2
FORMATUX - Support de cours GNU/Linux
Ansible Niveau 2 | 39
FORMATUX - Support de cours GNU/Linux
Ansistrano
Objectifs
Introduction
Ansistrano est un rôle Ansible pour déployer facilement des applications PHP, Python, etc. Il se base
sur le fonctionnement de Capistrano
Il peut télécharger le code source depuis rsync, git, scp, http, S3, …
• Symlink Shared et Symlink : après avoir déployé la nouvelle release, le lien symbolique current
est modifié pour pointer vers cette nouvelle release
40 | Ansistrano
FORMATUX - Support de cours GNU/Linux
/var/www/site/
├── current -> ./releases/20180821070043Z
├── releases
│ └── 20180821070043Z
│ ├── css -> ../../shared/css/
│ ├── img -> ../../shared/img/
│ └── REVISION
├── repo
└── shared
├── css/
└── img/
Ansistrano | 41
FORMATUX - Support de cours GNU/Linux
• La VM de gestion :
• La VM cliente :
Pour gérer notre serveur web, nous allons utiliser le rôle [Link] qu’il faut installer sur
le serveur :
Une fois le rôle installé, nous allons pouvoir créer la première partie de notre playbook, qui va :
• Installer Apache,
Considérations techniques :
• Comme nous le verrons plus loin, ansistrano va créer un lien symbolique current vers le dossier
de la release en cours.
• Le code source à déployer contient un dossier html sur lequel le vhost devra pointer. Sa
DirectoryIndex est [Link].
42 | Ansistrano
FORMATUX - Support de cours GNU/Linux
---
- hosts: ansiblecli
become: yes
vars:
dest: "/var/www/site/"
apache_global_vhost_settings: |
DirectoryIndex [Link] [Link]
apache_vhosts:
- servername: "website"
documentroot: "{{ dest }}current/html"
tasks:
roles:
- { role: [Link] }
Ansistrano | 43
FORMATUX - Support de cours GNU/Linux
Pour cela, nous allons utiliser le rôle [Link] dans un second playbook dédié au
déploiement applicatif (pour plus de lisibilité).
---
- hosts: ansiblecli
become: yes
vars:
dest: "/var/www/site/"
ansistrano_deploy_via: "git"
ansistrano_git_repo: [Link]
ansistrano_deploy_to: "{{ dest }}"
roles:
- { role: [Link] }
Une redirection du port http a été mis en place pour accéder depuis l’extérieur à votre serveur.
44 | Ansistrano
FORMATUX - Support de cours GNU/Linux
Notez :
Ansistrano | 45
FORMATUX - Support de cours GNU/Linux
• Depuis le serveur ansible, relancer 3 fois le déploiement, puis vérifier sur le client.
Notez :
Module 4 : Ansistrano
Exercice 4.1 : Limiter le nombre de releases
46 | Ansistrano
FORMATUX - Support de cours GNU/Linux
---
- hosts: ansiblecli
become: yes
vars:
dest: "/var/www/site/"
ansistrano_deploy_via: "git"
ansistrano_git_repo: [Link]
ansistrano_deploy_to: "{{ dest }}"
ansistrano_keep_releases: 3
roles:
- { role: [Link] }
---
[ansiblesrv] $ ansible-playbook -i hosts [Link]
Sur le client :
Ansistrano | 47
FORMATUX - Support de cours GNU/Linux
---
- hosts: ansiblecli
become: yes
vars:
dest: "/var/www/site/"
ansistrano_deploy_via: "git"
ansistrano_git_repo: [Link]
ansistrano_deploy_to: "{{ dest }}"
ansistrano_keep_releases: 3
ansistrano_shared_paths:
- "img"
- "css"
ansistrano_shared_files:
- "logs"
roles:
- { role: [Link] }
TASK [[Link] : ANSISTRANO | Create softlinks for shared paths and files]
**************************************************
changed: [[Link]] => (item=img)
changed: [[Link]] => (item=css)
changed: [[Link]] => (item=logs)
Sur le client :
48 | Ansistrano
FORMATUX - Support de cours GNU/Linux
Dès lors, les fichiers contenus dans ces 2 dossiers et le fichier logs sont toujours accessibles via les
chemins suivants :
• /var/www/site/current/css/,
• /var/www/site/current/img/,
• /var/www/site/current/logs,
Ansistrano | 49
FORMATUX - Support de cours GNU/Linux
Dans notre cas, le dépôt contient un dossier html, qui contient les fichiers du site.
---
- hosts: ansiblecli
become: yes
vars:
dest: "/var/www/site/"
apache_global_vhost_settings: |
DirectoryIndex [Link] [Link]
apache_vhosts:
- servername: "website"
documentroot: "{{ dest }}current/" ①
tasks:
roles:
- { role: [Link] }
50 | Ansistrano
FORMATUX - Support de cours GNU/Linux
---
- hosts: ansiblecli
become: yes
vars:
dest: "/var/www/site/"
ansistrano_deploy_via: "git"
ansistrano_git_repo: [Link]
ansistrano_deploy_to: "{{ dest }}"
ansistrano_keep_releases: 3
ansistrano_shared_paths:
- "img"
- "css"
ansistrano_shared_files:
- "log"
ansistrano_git_repo_tree: 'html' ①
roles:
- { role: [Link] }
Ansistrano | 51
FORMATUX - Support de cours GNU/Linux
52 | Ansistrano
FORMATUX - Support de cours GNU/Linux
---
- hosts: ansiblecli
become: yes
vars:
dest: "/var/www/site/"
ansistrano_deploy_via: "git"
ansistrano_git_repo: [Link]
ansistrano_deploy_to: "{{ dest }}"
ansistrano_keep_releases: 3
ansistrano_shared_paths:
- "img"
- "css"
ansistrano_shared_files:
- "log"
ansistrano_git_repo_tree: 'html'
ansistrano_git_branch: 'releases/v1.1.0'
roles:
- { role: [Link] }
Vous pouvez vous amuser, durant le déploiement, à rafraichir votre navigateur, pour voir en 'live'
le changement s’effectuer.
Ansistrano | 53
FORMATUX - Support de cours GNU/Linux
54 | Ansistrano
FORMATUX - Support de cours GNU/Linux
---
- hosts: ansiblecli
become: yes
vars:
dest: "/var/www/site/"
ansistrano_deploy_via: "git"
ansistrano_git_repo: [Link]
ansistrano_deploy_to: "{{ dest }}"
ansistrano_keep_releases: 3
ansistrano_shared_paths:
- "img"
- "css"
ansistrano_shared_files:
- "log"
ansistrano_git_repo_tree: 'html'
ansistrano_git_branch: 'v2.0.0'
roles:
- { role: [Link] }
Vous pouvez vous amuser, durant le déploiement, à rafraichir votre navigateur, pour voir en 'live'
le changement s’effectuer.
• Setup
• Update Code
• Symlink Shared
Ansistrano | 55
FORMATUX - Support de cours GNU/Linux
• Symlink
• Clean Up
Un playbook peut être inclu par les variables prévues à cet effet :
• ansistrano_before_<task>_tasks_file
• ou ansistrano_after_<task>_tasks_file
---
- hosts: ansiblecli
become: yes
vars:
dest: "/var/www/site/"
ansistrano_deploy_via: "git"
ansistrano_git_repo: [Link]
ansistrano_deploy_to: "{{ dest }}"
ansistrano_keep_releases: 3
ansistrano_shared_paths:
- "img"
- "css"
ansistrano_shared_files:
- "logs"
ansistrano_git_repo_tree: 'html'
ansistrano_git_branch: 'v2.0.0'
ansistrano_before_setup_tasks_file: "{{ playbook_dir }}/deploy/before-setup-
[Link]"
roles:
- { role: [Link] }
56 | Ansistrano
FORMATUX - Support de cours GNU/Linux
Le fichier deploy/[Link]
---
- name: Envoyer un mail
mail:
subject: Debut de MEP sur {{ ansible_hostname }}.
delegate_to: localhost
[root] # mailx
Heirloom Mail version 12.5 7/5/10. Type ? for help.
"/var/spool/mail/root": 1 message 1 new
>N 1 root@[Link] Tue Aug 21 14:41 28/946 "Debut de MEP sur localhost."
Ansistrano | 57
FORMATUX - Support de cours GNU/Linux
---
- hosts: ansiblecli
become: yes
vars:
dest: "/var/www/site/"
ansistrano_deploy_via: "git"
ansistrano_git_repo: [Link]
ansistrano_deploy_to: "{{ dest }}"
ansistrano_keep_releases: 3
ansistrano_shared_paths:
- "img"
- "css"
ansistrano_shared_files:
- "logs"
ansistrano_git_repo_tree: 'html'
ansistrano_git_branch: 'v2.0.0'
ansistrano_before_setup_tasks_file: "{{ playbook_dir }}/deploy/before-setup-
[Link]"
ansistrano_after_symlink_tasks_file: "{{ playbook_dir }}/deploy/after-symlink-
[Link]"
roles:
- { role: [Link] }
Le fichier deploy/[Link]
---
- name: restart apache
service:
name: httpd
state: restarted
58 | Ansistrano
FORMATUX - Support de cours GNU/Linux
Rundeck est un ordonnanceur centralisé open source (licence Apache) écrit en Java.
Depuis l’interface de Rundeck, il est possible de gérer les différents travaux (commandes ou scripts)
à exécuter sur les serveurs distants.
Fonctionnalités :
• Notifications ;
Rundeck peut être intégré aux autres outils de gestion de configuration comme Puppet, Ansible et
d’intégration continue comme Jenkins, etc.
Installation
Rundeck utilisant le protocle SSH pour se connecter aux systèmes distants, un
compte avec les droits sudo est nécessaire sur chacun des stations clientes.
# wget [Link]
# dpkg -i ./[Link]
• Sur CentOS 7 :
Configuration
Par défaut, Rundeck n’est configuré en écoute que sur l’adresse de boucle interne (localhost).
Si vous ne souhaitez pas mettre en place un proxy inverse (Apache, Nginx ou HAProxy), éditez les
fichiers /etc/rundeck/[Link] et /etc/rundeck/[Link] et remplacer
localhost par l’adresse IP du serveur, pour mettre en écoute Rundeck sur son interface réseau :
[Link] = [Link]
[Link]=[Link]
Utiliser RunDeck
Le compte par défaut pour se connecter à l’interface web est admin (mot de passe : admin). Pensez à
changer le mot de passe le plus rapidement possible.
Créer un projet
Un nouveau projet peut être ajouté en cliquant sur le lien Nouveau projet.
Dans la section Resource Model Source, cliquer sur le bouton Edit et choisir Require File Exists `,
puis cliquer sur `Save.
Dans la section Default Node Executor, choisir password pour l’authentification par SSH (pour une
meilleure gestion de la sécurité, l’utilisation d’une clef SSH est recommandée).
Le serveur est prêt à recevoir une première tâche. Cette tâche consiste en une connection SSH pour
lancer une commande distante.
Donner un nom pour l’option (par exemple sshPassword) et une valeur par défaut qui correspond à
votre mot de passe.
Dans le champ Input Type, choisir Secure Remote Authentication et mettre Required à Yes.
Dans la section Add a Step, choisir Command. Fournir la commande dans le champ Command. Par
exemple :
Pour appliquer cette tâche à un système distant (appelé noeud), éditer le fichier de configuration du
noeud :
vi /var/rundeck/projects/your_project_name/etc/[Link]
Interfacé avec des systèmes de gestion de version tel que Git, Subversion etc., il peut être utilisé
pour compiler, tester et déployer des scripts shell ou des projets Ant, Maven, etc, selon des
planifications ou des requêtes à des URLs.
• testé automatiquement ;
Ainsi, les problèmes d’intégrations peuvent être corrigés au plus tôt et la dernière version stable de
l’application est connue.
Installation
Jenkins peut fonctionner :
En mode standalone
Installation de Jenkins :
• Sous debian :
Installation :
# apt-get update
# apt-get install jenkins
• Sous RedHat :
Installation du paquet :
# yum update
# yum install java-1.8.0-openjdk jenkins
• [Link]
Installation de tomcat :
• Sous debian :
• Sous redhat :
Téléchargement de l’application :
cd /var/lib/tomcat6/webapps
wget [Link]
• [Link]
Installer Nginx
Un proxy inverse Nginx (mais Apache ou HAproxy sont de bonnes alternatives) va permettre
d’accéder à l’application sur le port standard 80.
# vim /etc/nginx/conf.d/[Link]
upstream jenkins{
server [Link]:8080;
}
server{
listen 80;
server_name [Link];
access_log /var/log/nginx/[Link];
error_log /var/log/nginx/[Link];
proxy_buffers 16 64k;
proxy_buffer_size 128k;
location / {
proxy_pass [Link]
proxy_next_upstream error timeout invalid_header http_500 http_502 http_503
http_504;
proxy_redirect off;
Vous pouvez alternativement installer un proxy inversé Apache. Dans ce cas, le VHOST suivant
pourra être utilisé :
<Virtualhost *:80>
ServerName [Link]
ProxyRequests Off
ProxyPreserveHost On
AllowEncodedSlashes NoDecode
<Proxy [Link]
Order deny,allow
Allow from all
</Proxy>
# setsebool httpd_can_network_connect 1 -P
Configuration de Jenkins
L’interface de gestion web du serveur d’intégration continue Jenkins est accessible à l’adresse
[Link] si le proxy inverse a été configuré ou à l’adresse
[Link] dans les autres cas.
Cette page demande un mot de passe admin initial, qui a été généré lors de l’installation et qui est
stocké dans le fichier /var/lib/jenkins/secrets/initialAdminPassword.
cat /var/lib/jenkins/secrets/initialAdminPassword
L’assistant va ensuite demander quels plugins doivent être installés et proposer l’installation des
plugins suggérés.
En choisissant Installer les plugins suggérés, tous les plugins nécessaire pour bien commencer
seront installés :
L’étape suivante consiste à créer un utilisateur avec les droits d’administration pour l’accès à la
console de gestion :
Saisir un nom pour la tâche, par exemple test. Choisir Freestyle Project et cliquer sur OK.
Aller dans l’onglet Build. Dans Add build step, selectionner l’option Execute shell.
top -b -n 1 | head -n 5
Dans la page dédiée à la tâche test, cliquer sur Build Now pour executer la tâche test.
Une fois que la tâche a été executée, vous verrez l’historique du Build. Cliquer sur la première tâche
Sources
Source principale : howtoforge.
Pour favoriser la rédaction de documentations de qualité, les mêmes outils que ceux utilisés pour
coder sont utilisés :
• gestionnaire de bugs,
• revue de code,
• tests automatiques.
• le Markdown,
• le reStructuredText,
• l’Asciidoc.
• Le rédacteur se concentre uniquement sur le contenu et non sur la mise en forme comme c’est
malheureusement trop souvent le cas avec les éditeurs de texte WYSIWYG (openoffice, word,
etc.),
• Le même code source permet de générer des formats différents : pdf, html, word, confluence,
epub, manpage, etc.
• Le travail collaboratif est grandement simplifié : code review, merge request, etc.
• Gestion des versions par branches ou tags git (pas une copie de fichier .doc).
Le format asciidoc
Ce langage de balisage léger a été créé en 2002 !
Le processeur initial était développé en python mais à depuis été réécrit en ruby
([Link]
= Hello, AsciiDoc!
Doc Writer <doc@[Link]>
An introduction to [Link]
== First Section
* item 1
* item 2
Comme vous pouvez le constater, le texte (malgré le balisage) reste lisible, la syntaxe est facilement
assimilable et n’est pas trop lourde comparée à ce qui se faisait en latex.
— Linus Torvalds
• [Link]
Compiler sa documentation
Après avoir installé l’environnement asciidoc, la commande suivante permet de compiler son
document .adoc en html5 (format par défaut) :
asciidoctor [Link]
Une image docker existant, il est facile d’utiliser la CI d’un environnement tel que GitLab pour
générer automatiquement la documentation à chaque commit, tag, etc.
build:
stage: build
image: asciidoctor/docker-asciidoctor
script:
- asciidoctor-pdf -a icons="font" -a lang="fr" -D public [Link]
only:
- master
artifacts:
name: "compilation-pdf"
paths:
- public/
• asciidoc-image-helper
• asciidoc-assistant
• asciidoc-preview
• autocomplete-asciidoc
• language-asciidoc
Références
• [Link]
• [Link]
• planifier le déploiement,
• créer l’infrastructure.
Les changements apportés par une modification de code à l’infrastructure sont prédictifs.
Le même outil permet de créer des ressources chez les plus grands fournisseurs d’infrastructure :
• AWS,
• GCP,
• Azure,
• OpenStack,
• VMware,
• etc.
/* Un enregistrement DNS
en IPV4 type "A"
*/
resource "dnsimple_record" "hello" {
domain = "[Link]"
name = "test"
value = "${digitalocean_droplet.web.ipv4_address}"
type = "A"
}
La HCL
Le langage HashiCorp Configuration Language est spécifique. Voici quelques points d’attention :
• Les variables sont assignées avec la syntaxe key = value (aucune importance concernant les
espaces). Les valeurs peuvent être des primitives string, number ou boolean ou encore une list
ou une map.
Les providers
Terraform est utilisé pour gérer des ressources qui peuvent être des serveurs physiques, des VM,
des équipements réseaux, des containeurs, mais aussi pourquoi pas des utilisateurs grafana, etc.
En voici quelques-uns :
• AWS,
• Azure,
• VMware vSphere
• Gitlab,
• Datadog, PagerDuty,
• MySQL,
• Active Directory
• …
Chaque provider venant avec ses propres ressources, il faut lire la doc !
Les actions
• terraform init
La première commande à lancer pour une nouvelle configuration qui va initialiser la configuration
locale (import de modules par exemple).
• terraform plan
La commande terraform plan permet d’afficher le plan d’exécution, qui décrit quelles actions
Terraform va prendre pour effectuer les changements réels de l’infrastructure.
Si une valeur est affichée comme <computed>, cela veut dire que cette valeur ne sera connue qu’au
moment de l’exécution du plan.
• terraform apply
La commande terraform apply va réellement appliquer les changements tels qu’ils ont été décrits
par la commande terraform plan.
• terraform show
Une fois que l’infrastructure est gérée via Terraform, il est préférable d’éviter de la
modifier manuellement.
• terraform destroy
Avec l’avènement du cloud, le cycle de vie d’un serveur et notre façon de consommer les ressources
ont considérablement changé. Une VM ou une infrastructure doit tout aussi facilement pouvoir être
créée que supprimée.
Avec Terraform, une infrastructure complète peut être déployée juste à l’occasion des tests de non
régréssion lors de la création d’une nouvelle version logicielle par exemple et être totalement
détruite à la fin de ceux-ci pour réduire les coûts d’infrastructure au plus juste.
# Le VPC de la plateforme
resource "cloudstack_vpc" "default" {
name = "our-vpc"
cidr = "[Link]/16"
vpc_offering = "Default VPC offering"
zone = "EU-FR-IKDC2-Z4-ADV"
}
Dans l’exemple ci-dessus, un VPC (Virtual Private Cloud) est créé ainsi qu’un réseau privé. Ce réseau
privé est rattaché à son VPC en lui fournissant son id connu dans terraform en tant que
${cloudstack_vpc.[Link]} où :
Les informations de dépendances déterminent l’ordre dans lequel Terraform va créer les
ressources.
Les provisionners
Les provisionners permettent d’initialiser les instances une fois qu’elles ont été créées (lancer un
playbook ansible par exemple).
provisioner "local-exec" {
command = "echo ${aws_instance.example.public_ip} > ip_address.txt"
}
}
Lors de la création de la nouvelle VM, son adresse IP publique est stockée dans un fichier
ip_address.txt, mais elle aurait très bien pu être envoyée à la CMDB par exemple.
Le provisioner local-exec exécute une commande localement, mais il existe de nombreux autres
provisionners : [Link]
Les variables
Une variable est définie comme suit :
# definition explicite
variable "cidrs" { type = "list" }
provider "aws" {
access_key = "${var.access_key}"
secret_key = "${var.secret_key}"
region = "${[Link]}"
}
Vous pouvez stocker vos variables dans un fichier externe (par exemple
[Link]) sachant que tous fichiers ayant pour extension .tf du répertoire
courant seront chargés.
L’exemple du chapitre précédent peut être repris pour variabiliser la zone de déploiement de nos
ressources :
# Le VPC de la plateforme
resource "cloudstack_vpc" "default" {
name = "our-vpc"
cidr = "[Link]/16"
vpc_offering = "Default VPC offering"
zone = "${[Link]}"
}
Les variables peuvent être également définies depuis la ligne de commande ou un fichier externe
[Link] qui sera chargé automatiquement à l’exécution.
Il est d’usage de stocker les variables critiques (api key, mots de passe, etc.) dans un
fichier [Link] et d’exclure ce fichier de votre configuration git.
Voir la documentation pour plus d’informations sur les variables (Maps, etc.) :
[Link]
TD
Plusieurs possibilités :
• Installer grafana ou un autre logiciel disposant d’un provider sur une de vos VM et utiliser les
ressources de ce provider.
Glossaire
BASH
Bourne Again SHell
BIOS
Basic Input Output System
CIDR
Classless Inter-Domain Routing
Daemon
Disk And Execution MONitor
DHCP
Dynamic Host Control Protocol
DNS
Domain Name Service
FIFO
First In First Out
FQDN
Fully Qualified Domain Name
GNU
Gnu is Not Unix
HA
High Availability (Haute Disponibilité)
HTTP
HyperText Transfer Protocol
ICP
Internet Cache Protocol
IFS
Internal Field Separator
LAN
Local Area Network
LDIF
86 | Glossaire
FORMATUX - Support de cours GNU/Linux
NTP
Network Time Protocol
nsswitch
Name Service Switch
OTP
One Time Password
POSIX
Portable Operating System Interface
POST
Power On Self Test
RDBMS
Relational DataBase Managed System
SGBD-R
Systèmes de Gestion de Base de Données Relationnelles
SHELL
En français "coquille". Á traduire par "interface système".
SMB
Server Message Block
SMTP
Simple Mail Tranfer Protocol
SSH
Secure SHell
SSL
Secure Socket Layer
TLS
Transport Layer Security, un protocole de cryptographie pour sécuriser les communications IP.
TTL
Time To Live
TTY
teletypewriter, qui se traduit téléscripteur. C’est la console physique.
Glossaire | 87
FORMATUX - Support de cours GNU/Linux
UEFI
Unified Extensible Firmware Interface
88 | Glossaire
FORMATUX - Support de cours GNU/Linux
Index
A
augeas, 13
D
devops, 3
H
HCL, 79
J
Jenkins, 65
P
puppet, 6
R
Rundeck, 59
Index | 89