Initiation Ansible - Exercice 1 === # Description de la plateforme Pour les besoins du TP, chaque utilisateur dispose d'un numéro: 01 à 10 lui permettant d'identifier ces ressources: - un compte utilisateur: `formation-xx` - 2 serveurs linux (nommés`managed node` dans le TP): - web-xx.univ-rouen.fr - db-xx.univ-rouen.fr Le compte utilisateur permet de se connecter aux serveurs depuis une passerelle linux ansible-workstation.univ-rouen.fr (nommée `control node` dans le TP) sur laquelle Ansible est déjà installé. ``` $ ssh formation-xx@ansible-workstation.univ-rouen.fr //password: formation2020 ``` ## Gestion des machines virtuelles En cas de soucis avec vos machines virtuelles `web-XX` et `db-XX`, vous aurez la possibilité de restaurer les VMs à partir d'un snapshot. - Accès à la plateforme de virtualisation: https://vcenter-rech.univ-rouen.fr/ui - login: ansible@vsphere-rech.local - pass: formation2020 # Objectifs exercice 1 1. créer un fichier d'inventaire 2. valider le fonctionnement en mode Ad-Hoc 3. récuperer une variable avec les `facts` 4. créer votre premier playbook # Création de l'inventaire - dans votre `homedir`, créer un répertoire `ansible` - passer dans le repertoire `ansible` - copier le fichier de configuration `/etc/ansible/ansible.cfg` dans le répertoire de travail (`~/ansible/`) - modifier la ligne `#inventory = /etc/ansible/hosts` en `inventory = hosts` du fichier `~/ansible/ansible.cfg` :::info Cette opération nous évite de spécifier le path (avec l'option `-i /path/to/inventory`) du fichier d'inventaire pour les commandes `ansible` et `ansible-playbook` ::: - créer un fichier `hosts` (vim, nano) au format `INI`, avec les sections (désigne un groupe de machines) `webservers`et `dbservers`: ```toml [webservers] web-XX [dbservers] db-XX ``` - pour plus d'information sur la structure du fichier d'inventaire: [https://docs.ansible.com/ansible/latest/user_guide/intro_inventory.html](https://docs.ansible.com/ansible/latest/user_guide/intro_inventory.html) # Utiliser les commandes Ad-Hoc - introduction au commande Ad-Hoc: [https://docs.ansible.com/ansible/latest/user_guide/intro_adhoc.html](https://docs.ansible.com/ansible/latest/user_guide/intro_adhoc.html) - Structure d'une commande Ad-Hoc: `$ ansible [pattern] -m [module] -a [arguments]` :::info `pattern`: peut être une machine, un groupe, ou `all` pour désigner l'ensemble des machines ::: ## tester votre infra avec le module `ping` [https://docs.ansible.com/ansible/latest/modules/ping_module.html](https://docs.ansible.com/ansible/latest/modules/ping_module.html) ```json $ ansible all -m ping db-01 | SUCCESS => { "changed": false, "ping": "pong" } web-01 | SUCCESS => { "changed": false, "ping": "pong" } ``` ## Afficher le contenu du fichier `/etc/issue` sur les `managed nodes` avec le module `shell` :::info Vous pouvez utiliser la commande `ansible-doc` pour obtenir des infos sur un module: `$ ansible-doc shell` ::: Pour cette commande, nous allons spécifier une exécution uniquement sur les machines du groupe `webservers` ```bash $ ansible webservers -m shell -a 'cat /etc/issue' web-01 | CHANGED | rc=0 >> Debian GNU/Linux 10 \n \l ``` ## Récupérer une variable `facts` avec le module `setup` :::info Ansible utilise les "Facts" pour collecter des informations sur les managed nodes. Ce mecanisme permet de peupler des variables (ex: hostname, @IP, OS Version..) `ansible_xx` utilisables dans les playbooks et des templates JinJa2 ::: ```bash $ ansible dbservers -m setup $ ansible dbservers -m setup -a "filter=ansible_distribution*" db-01 | SUCCESS => { "ansible_facts": { "ansible_distribution": "Debian", "ansible_distribution_file_parsed": true, "ansible_distribution_file_path": "/etc/os-release", "ansible_distribution_file_variety": "Debian", "ansible_distribution_major_version": "10", "ansible_distribution_release": "buster", "ansible_distribution_version": "10.3" }, "changed": false } ``` ## Installer le paquet `htop` sur les `managed nodes` ``` $ ansible all -m package -a 'name=htop state=latest' -b pour tester: $ ssh web-XX $ htop $ exit ``` Dans cette exemple, le module `package` appelle la commande `apt install` qui nécéssite une élévation de privilèges obtenue avec l'option `-b` ou `--become` : [https://docs.ansible.com/ansible/latest/user_guide/become.html](https://docs.ansible.com/ansible/latest/user_guide/become.html) # Utiliser un playbook Dans l'exercice précédent, nous avons utilisé le module `package` avec 2 arguments: `name=htop` et `state=latest`. Nous pouvons facilement transformer cette commande Ad-Hoc en playbook ecrit en YAML. [https://docs.ansible.com/ansible/latest/reference_appendices/YAMLSyntax.html](https://docs.ansible.com/ansible/latest/reference_appendices/YAMLSyntax.html) [https://docs.ansible.com/ansible/latest/user_guide/playbooks_intro.html](https://docs.ansible.com/ansible/latest/user_guide/playbooks_intro.html) `$ vim install_net-tools.yml` ```yaml --- - hosts: webservers become: yes tasks: - name: install package net-tools package: name: net-tools state: present ``` En version Ad-Hoc: `$ ansible webservers -m package -a 'name=net-tools state=present' -b` Ce playbook contient un seul `play` (ensemble de tâches ayant une même cible d'hôtes) constitué d'une `tasks` qui appelle un `module` (package) avec 2 arguments. On teste la syntaxe YAML du playbook ```bash ansible-playbook --syntax-check install_net-tools.yml ``` Si aucun message d'erreur ne s'affiche, la syntaxe est correcte. Vous pouvez également simuler (aucun changement ne sera apporté) le lancement du playbook: ```bash ansible-playbook --check install_net-tools.yml ``` Et enfin pour exécuter le playbook: ```toml $ ansible-playbook install_net-tools.yml PLAY [webservers] ****************************************************** ****************************************************** TASK [Gathering Facts] ****************************************************** ****************************************************** ok: [web-01] TASK [install package net-tools] ****************************************************** ****************************************************** ok: [web-01] PLAY RECAP ****************************************************** ****************************************************** web-01 : ok=2 changed=0 unreachable=0 failed=0 ```