apt en lançant:$ sudo apt update
$ sudo apt install software-properties-common
$ sudo apt-add-repository --yes --update ppa:ansible/ansible
$ sudo apt install ansible
ansible --version
=> 2.8.x
ansible all -m ping. Que signifie-t-elle ?-vvv pour mettre en mode très verbeux. Ce mode est très efficace pour debugger lorsqu’une erreur inconnue se présente. Que se passe-t-il avec l’inventaire ?ansible en vous connectant à votre machine localhost et en utilisant le module ping.hotelocal ansible_host=127.0.0.1 dans l’inventaire par défaut (le chemin est /etc/ansible/hosts). Et pinguer hotelocal.LXD est une technologie de conteneurs actuellement promue par canonical (ubuntu) qui permet de faire des conteneur linux orientés systèmes plutôt qu’application. Par exemple systemd est disponible à l’intérieur des conteneurs contrairement aux conteneurs Docker.
LXD est déjà installé et initialisé sur notre ubuntu (sinon apt install snapd + snap install lxd + ajouter votre utilisateur courant au group unix lxd).
Il faut cependant l’initialiser avec : lxd init
Cette commande vous pose un certain nombre de questions pour la configuration et vous pouvez garder TOUTES les valeurs par défaut en fait ENTER simplement à chaque question.
Affichez la liste des conteneurs avec lxc list. Aucun conteneur ne tourne.
Maintenant lançons notre premier conteneur centos avec lxc launch images:centos/7/amd64 centos1.
Listez à nouveau les conteneurs lxc.
Ce conteneur est un centos minimal et n’a donc pas de serveur SSH pour se connecter. Pour lancez des commandes dans le conteneur on utilise une commande LXC pour s’y connecter lxc exec <non_conteneur> -- <commande>. Dans notre cas nous voulons lancer bash pour ouvrir un shell dans le conteneur : lxc exec centos1 -- bash.
Nous pouvons installer des logiciels dans le conteneur comme dans une VM. Pour sortir du conteneur on peut simplement utiliser exit.
Un peu comme avec Docker, LXC utilise des images modèles pour créer des conteneurs. Affichez la liste des images avec lxc image list. Trois images sont disponibles l’image centos vide téléchargée et utilisée pour créer centos1 et deux autres images préconfigurée ubuntu_ansible et centos_ansible. Ces images contiennent déjà la configuration nécessaire pour être utilisée avec ansible (SSH + Python + Un utilisateur + une clé SSH).
Supprimez la machine centos1 avec lxc stop centos1 && lxc delete centos1
Pour avoir tous les mêmes images de base générons-les depuis un script pré-installé, dans un terminal lancez :
bash /opt/lxd.sh
Créons à partir des images du remotes un conteneur ubuntu et un autre centos:
lxc launch ubuntu_ansible ubu1
lxc launch centos_ansible centos1
Pour se connecter en SSH nous allons donc utiliser une clé SSH appelée id_stagiaire qui devrait être présente dans votre dossier ~/.ssh/. Vérifiez cela en lançant ls -l /home/stagiaire/.ssh.
Déverrouillez cette clé ssh avec ssh-add ~/.ssh/id_stagiaire et le mot de passe devops101 (le ssh-agent doit être démarré dans le shell pour que cette commande fonctionne si ce n’est pas le cas eval $(ssh-agent)).
Essayez de vous connecter à ubu1 et centos1 en ssh pour vérifier que la clé ssh est bien configurée et vérifiez dans chaque machine que le sudo est configuré sans mot de passe avec sudo -i.
Lorsqu’on développe avec Ansible il est conseillé de le gérer comme un véritable projet de code :
inventory.cfg ou hosts et une configuration locale au projet ansible.cfgNous allons créer un tel projet de code pour la suite du tp1
tp1 sur le Bureau.Open Folder...Un projet Ansible implique généralement une configuration Ansible spécifique décrite dans un fichier ansible.cfg
ansible.cfg avec à l’intérieur:[defaults]
inventory = ./inventory.cfg
roles_path = ./roles
host_key_checking = false # nécessaire pour les labs où l'on créé et supprime des machines constamment avec des signatures SSH changées.
ansible.cfg et ajoutez à l’intérieur notre nouvelle machine hote1.Créez et complétez le fichier inventory.cfg d’après ce modèle:
ubu1 ansible_host=<ip>
[all:vars]
ansible_user=<votre_user>
Ansible cherche la configuration locale dans le dossier courant. Conséquence : on lance généralement toutes les commandes Ansible depuis la racine de notre projet.
Dans le dossier du projet, essayez de relancer la commande ad-hoc ping sur cette machine.
Ansible implique le cas échéant (login avec clé ssh) de déverrouiller la clé ssh pour se connecter à chaque hôte. Lorsqu’on en a plusieurs il est donc nécessaire de la déverrouiller en amont avec l’agent ssh pour ne pas perturber l’exécution des commandes ansible. Pour cela : ssh-add.
Créez un groupe adhoc_lab et ajoutez les deux machines ubu1 et centos1.
ping sur les deux machines.ansible.cfg. Cependant on peut aussi utiliser une connexion par mot de passe et préciser l’utilisateur et le mot de passe dans l’inventaire ou en lançant la commande.En précisant les paramètres de connexion dans le playbook il et aussi possible d’avoir des modes de connexion différents pour chaque machine.
adhoc_lab, centos_hosts et ubuntu_hosts avec deux machines dans chacun. (utilisez pour cela [adhoc_lab:children])[all:vars]
ansible_user=<votre_user>
[ubuntu_hosts]
ubu1 ansible_host=<ip>
[centos_hosts]
centos1 ansible_host=<ip>
[adhoc_lab:children]
ubuntu_hosts
centos_hosts
Dans un inventaire ansible on commence toujours par créer les plus petits sous groupes puis on les rassemble en plus grands groupes.
Nous allons maintenant installer nginx sur les 2 machines. Il y a plusieurs façons d’installer des logiciels grâce à Ansible: en utilisant le gestionnaire de paquets de la distribution ou un gestionnaire spécifique comme pip ou npm. Chaque méthode dispose d’un module ansible spécifique.
apt car centos utilise yum. Pour éviter ce problème on peut utiliser le module package qui permet d’uniformiser l’installation (pour les cas simples).
--become pour devenir root avant d’exécuter la commande (cf élévation de privilège dans le cours2)nginxepel-release sur la machine centos.nginx. Que remarque-t-on ?systemd et l’option --check pour vérifier si le service nginx est démarré sur chacune des 2 machines. Normalement vous constatez que le service est déjà démarré (par défaut) sur la machine ubuntu et non démarré sur la machine centos.L’option --check à vérifier l’état des ressources sur les machines mais sans modifier la configuration`. Relancez la commande précédente pour le vérifier. Normalement le retour de la commande est le même (l’ordre peu varier).
Lancez la commande avec state=stopped : le retour est inversé.
Enlevez le --check pour vous assurer que le service est démarré sur chacune des machines.
Visitez dans un navigateur l’ip d’un des hôtes pour voir la page d’accueil nginx.
Il existe trois façon de lancer des commandes unix avec ansible:
le module command utilise python pour lancez la commande.
le module shell utilise un module python qui appelle un shell pour lancer une commande.
le module raw.
creates pour simuler de l’idempotence.Créez un fichier dans /tmp avec touch et l’un des modules précédents.
Relancez la commande. Le retour est toujours changed car ces modules ne sont pas idempotents.
Relancer l’un des modules shell ou command avec touch et l’option creates pour rendre l’opération idempotente. Ansible détecte alors que le fichier témoin existe et n’exécute pas la commande.
ansible adhoc_lab --become -m "command touch /tmp/file" -a "creates=/tmp/file"