# Partie 1 : Virtualbox
## Question 1

### Installation de la VM ubuntu
J’ouvre VirtualBox et j’ajoute la nouvelle VM : Ubuntu22

J'installe Ubuntu en version classique.
Avec `ifconfig` (`sudo apt install net-tools`) je récupère l'IP privée de la VM : `10.0.2.15`

## Question 2

Le ping depuis WSL sur le PC hote n'aboutit pas : `ping 10.0.2.15`

## Question 3

Nous utilisons conjointement deux types d'adapters :
- un **Host-only Adapter**
- un **NAT Adapter**
:::info
Installation du Host-only adapter


Mettre l'addresse IPv4 192.168.56.1


:::

**Host-only Adapter**

**NAT Adapter**


L'IP privée de la VM a changé : `ifconfig`

Le ping depuis WSL sur la machine hôte est maintenant fonctionnel (c'est l'IP privée de l'adaptateur précédement configuré):`ping 192.168.56.101`

> Le **Host-only** permet la communication entre la machine hote et les VM sans besoin de port forwarding. En revanche il ne permet pas aux VMs d'acceder à Internet.
> Le **NAT adapter** permet à la VM d'acceder à internet
## Question 4
> Le serveur ssh (service sshd) n'est parfois pas installé sur une installation toute nouvelle d'un OS Debian.
> On peut tester son status par la commande :
>
> `sudo systemctl status sshd`
>
>
> Si le service n'est pas présent; il est possible de l'installer via la commande suivante (à jouer 2 fois parfois) :
>
> `sudo apt install openssh-server `

[Doc GitLab](https://docs.gitlab.com/ee/user/ssh.html)
Nous utilisons la commande dans WSL :
```BASH
ssh-keygen -t ed25519 -C "<comment>"
```
- `-t` type de la clé (`ed25519`, `rsa`, ...)
- `-C` commentaire ajouté dans le fichier `.pub` (adresse email généralement)
## Question 5
## Copie de la clé publique dans ``authorized_keys`` sur la VM

Nous créons le repertoire ssh dans le répertoire courant (~): ``mkdir .ssh``

Nous créons le fichier `~/.ssh/authorized_keys`, et nous y plaçons la clé publique du couple généré précédement (contenu de la clef publique sur WSL) : ``vim ~/.ssh/authorized_keys``


La connection en ssh par le couple de clés générées est desormais fonctionnelle (l'authentification se fait sans saisir le mot de passe de l'utilisateur `arnaud`) :

### Autoriser le SSH en tant que root
> Après une installation d'un nouveau système, le mot de passe de ``root`` n'est parfois pas défini/inconnu. Pour le définir, il suffit de lancer la commande :
>
> `sudo passwd root`
Actuellement, la connexion ssh en tant que ``root`` n'est pas possible : ``sudo ssh root@192.168.56.101``

Nous éditions alors le fichier `/etc/ssh/sshd_config` : ``sudo vim /etc/ssh/sshd_config``

Nous y decommentons la ligne du parametre ``PermitRootLogin`` et passons sa valeur à ``yes`` :

> Valeurs possibles du parametre:
>
> - `PermitRootLogin yes #enabled`
> - `PermitRootLogin no #disabled`
> - `PermitRootLogin prohibit-password #password authentification for root disabled`
Enfin, nous redemarons le serveur ssh (service ``sshd``) sur la VM : `sudo systemctl restart sshd` (puis nous vérifions l'état avec ``sudo systemctl status sshd``)

La connexion en tant que ``root`` par mot de passe est maintenant possible :

### Désactiver la connection par mot de passe

Nous décommentons la ligne `#PasswordAuthentification yes` dans le fichier et nous passons l'option à `no`(sur WSL : ``sudo vim /etc/ssh/sshd_config``) :

Enfin, nous redemarons le serveur ssh (service ``sshd``) sur la VM :

La connexion avec un mot de passe en tant que ``root`` n'est desormais plus possible :

La connexion ssh en tant que l'utilisateur `arnaud` reste cependant elle possible, car elle se fait via le couple de clés ssh généré plus tôt :

# Partie 2 : Ansible
## Question 1
### Installation d'Ansible

Sous WSL, on execute la suite de commande suivante :
```BASH
$ sudo apt update
$ sudo apt install software-properties-common
$ sudo add-apt-repository --yes --update ppa:ansible/ansible
$ sudo apt install ansible
```
[Installing Ansible on Ubuntu](https://docs.ansible.com/ansible/latest/installation_guide/installation_distros.html#installing-ansible-on-ubuntu)
On vérifie la version d'Ansible :
``ansible --version``

### Création d'un ``Inventory``

Creation d'un dossier dédié :
```BASH
mkdir TP1_Ansible && cd TP1_Ansible
```
Création du fichier d'inventory
```BASH
touch inventory.ini
```
Edition du fichier inventory.ini avec l'IP de la VM :
(donc sur WSL faire ``vim inventory.ini``)

```INI
[myhosts]
192.168.56.101
```
On place l'hôte (la VM) dans un groupe d'hôtes nommé `myhosts`
Verification du fichier :
```BASH
ansible-inventory -i inventory.ini --list
```

On obtient les informations de tous les hôtes définis dans le script ``inventory.ini``
## Question 2

[Why use ad hoc commands?](https://docs.ansible.com/ansible/latest/command_guide/intro_adhoc.html#why-use-ad-hoc-commands)
On tente ensuite de *pinger* les hôtes du groupe ``myhosts`` du script ``inventory.ini`` grâce à la commande ad hoc ``ping`` :
```BASH
ansible myhosts -m ping -i inventory.ini -u arnaud
```

L'option `-u` permet de specifier le nom d'utilisateur sur la machine hôte (ici la VM).
## Question 3

[Creating a playbook](https://docs.ansible.com/ansible/latest/getting_started/get_started_playbook.html)
### Création d'un playbook
Nous créons un fichier `playbook.yaml` dans le dossier de travail ``TP1_Ansible`` :
```BASH
$ touch playbook.yaml
```
```YAML
- name: My first playbook
hosts: myhosts
tasks:
- name: Creating a /var/tmp/ansible_test file
ansible.builtin.file:
path: /var/tmp/ansible_test
state: touch
mode: u=rw,g=r,o=r # equivalent to 644
- name: ls /var/tmp/
ansible.builtin.command: ls /var/tmp/
```
Liste des modules de ``ansible.builtin`` (``ansible-core``) : [Lien](https://docs.ansible.com/ansible/latest/collections/ansible/builtin/index.html)
On peut ensuite lancer notre playbook :
```BASH
$ ansible-playbook -i inventory.ini playbook.yaml -u arnaud
```
(l'option -u permet de spécifier le nom d'hôte de la VM ici)

## Question 4

On ajoute la tache suivante à notre ``playbook.yaml`` :
```YAML
- name: Install apache2
become: true
ansible.builtin.apt:
name: apache2
state: present
```
Le terme `become` demande une élévation de privilèges vers l'utilisateur `root` pour la tâche.
:::info
Utilisation par defaut : `become_user: <username>`
Valeur par defaut : `become: true` (i.e. `become_user: root`)
:::
Le playbook est à lancer avec la commande :
```BASH
ansible-playbook -i inventory.ini playbook.yaml --ask-become-pass -u arnaud
```
L'option `--ask-become-pass` permet de specifier un mot de passe pour l'élévation des privilèges spécifiée par `become_user` (ici l'utilisateur `root`)
L'option `-u` permet de specifier le nom d'utilisateur sur la machine hôte (ici la VM).
> Issu de la Doc :
> [](https://docs.ansible.com/ansible/latest/playbook_guide/playbooks_privilege_escalation.html)
**Résultats**

Le serveur apache2 a bien été installé et lancé :
```BASH
sudo systemctl status apache2
```

https://docs.ansible.com/ansible/latest/collections/ansible/builtin/uri_module.html
## Q5/ Ajoutez une tâche pour copier un fichier index.html créé sur votre poste vers le dossier d’apache2 devant accueillir vos pages HTML. Vérifiez que la page est accessible depuis votre poste principal.
Pour commencer on créé un fichier index.html dans le dossier TP1_Ansible.
On le rempli avec du code HTML pour faire une page.
On ajoute la tache suivante à notre ``playbook.yaml`` :
```YAML
- name: Copy file with owner and permissions
ansible.builtin.copy:
src: ~/TP1_Ansible/index.html
dest: /var/www/html/index.html
owner: arnaud
group: arnaud
mode: '0644'
```
Le playbook est à lancer avec la commande :
```BASH
ansible-playbook -i inventory.ini playbook.yaml --ask-become-pass -u root
```
## Q6/ Modifiez votre playbook pour redémarrer le service apache2 à chaque modification de fichier du site lors de l’upload de ceux-ci. Quel type de tâche configurez vous ?
On ajoute la tache suivante à notre ``playbook.yaml`` :
```YAML
handlers:
- name : restart apache2 in some cases
ansible.builtin.service:
name: apache2
state: restarted
```
Il s'agit d'un handler permettant de redémarrer le service dans certains cas uniquement quand on le souhaite.
On peut notifier le redémarrage à chaque upload de fichier en ajoutant 'notify', par exemple :
```YAML
- name: Copy file with owner and permissions
ansible.builtin.copy:
src: ~/TP1_Ansible/index.html
dest: /var/www/html/index.html
owner: arnaud
group: arnaud
mode: '0644'
notify: restart apache2 in some cases
```
Le playbook peut être lancé avec la commande :
```BASH
ansible-playbook -i inventory.ini playbook.yaml --ask-become-pass -u root
```
## Q7/ Ajoutez une tâche faisant un curl sur localhost, et qui enregistre le résultat de cette tâche dans une variable.
On ajoute la tache suivante à notre ``playbook.yaml`` :
```YAML
- name: Curl on localhost
ansible.builtin.uri:
url: http://localhost
return_content: yes
status_code: [200, 404, -1]
register: result
```
On enregistre le résultat de la commande dans la variable 'result'.
Le playbook peut être lancé avec la commande :
```BASH
ansible-playbook -i inventory.ini playbook.yaml --ask-become-pass -u root
```
## Q8/ Utilisez la variable précédemment créée pour vérifier que votre site est fonctionnel, ou afficher un message d’erreur si ce n’est pas le cas.
On ajoute la tache suivante à notre ``playbook.yaml`` :
```YAML
- name: Display the result
ansible.builtin.debug:
var: result
```
Le playbook peut être lancé avec la commande :
```BASH
ansible-playbook -i inventory.ini playbook.yaml --ask-become-pass -u root
```
Voici une capture de ce que l'on peut observer une lorsque le résultat est correct (donc l'URL spécifiée est la bonne) :

Si maintenant nous changeons l'URL pour en mettre une incorrecte, changeons notre ``playbook.yaml`` :
```YAML
- name: Curl on localhost
ansible.builtin.uri:
url: badURL/test
return_content: yes
status_code: [200, 404, -1]
register: result
```
Voici le résultat obtenu :

# Sources
- [Getting started with Ansible](https://docs.ansible.com/ansible/latest/getting_started/index.html)
- [Building an inventory](https://docs.ansible.com/ansible/latest/getting_started/get_started_inventory.html#building-an-inventory)
- [Understanding privilege escalation: become](https://docs.ansible.com/ansible/latest/playbook_guide/playbooks_privilege_escalation.html)
- [How to fix permission denied error when trying to install packages using Ansible?](https://stackoverflow.com/a/46669505)
Dans le playbook.yaml final :
```
- name: My first playbook
hosts: myhosts
tasks:
- name: Creating a /var/tmp/ansible_test file
ansible.builtin.file:
path: /var/tmp/ansible_test
state: touch
mode: u=rw,g=r,o=r # equivalent to 644
- name: ls /var/tmp/ansible_test
ansible.builtin.command: ls /var/tmp/ansible_test
- name: Install apache2
become: true
ansible.builtin.apt:
name: apache2
state: present
- name: Copy file with owner and permissions
ansible.builtin.copy:
src: ~/TP1_Ansible/index.html
dest: /var/www/html/index2.html
owner: lolo
group: lolo
mode: '0644'
notify: restart apache2 in some cases
- name: Curl on localhost
ansible.builtin.uri:
url: http://localhost
return_content: yes
status_code: [200, 404, -1]
register: result
- name: Display the result
ansible.builtin.debug:
var: result
handlers:
- name : restart apache2 in some cases
ansible.builtin.service:
name: apache2
state: restarted
```