---
# System prepended metadata

title: Labo DevOPs - TP Ansible

---

# Labo DevOPs - TP Ansible 

Thomas Dumont
Antonin Demaneche

# Sommaire 

## I - Manage Node : 

### I.I - Instalation est configuration des VM :
Tout d'abord nous allons crer une première vm, qui nous servira à crer les deux autres.

On installe Python : 

```
rootroot@rootroot-virtual-machine:~$ sudo apt update
[sudo] Mot de passe de rootroot : 
Atteint :1 http://fr.archive.ubuntu.com/ubuntu groovy InRelease
Atteint :2 http://fr.archive.ubuntu.com/ubuntu groovy-updates InRelease
Atteint :3 http://fr.archive.ubuntu.com/ubuntu groovy-backports InRelease
Atteint :4 http://security.ubuntu.com/ubuntu groovy-security InRelease
Lecture des listes de paquets... Fait               
Construction de l'arbre des dépendances       
Lecture des informations d'état... Fait
149 paquets peuvent être mis à jour. Exécutez « apt list --upgradable » pour les voir.
rootroot@rootroot-virtual-machine:~$ sudo apt install python3-pip
Lecture des listes de paquets... Fait
Construction de l'arbre des dépendances       
Lecture des informations d'état... Fait
Les paquets supplémentaires suivants seront installés : 
  binutils binutils-common binutils-x86-64-linux-gnu build-essential dpkg-dev
  fakeroot g++ g++-10 gcc gcc-10 libalgorithm-diff-perl
  libalgorithm-diff-xs-perl libalgorithm-merge-perl libasan6 libatomic1
  libbinutils libc-dev-bin libc6-dev libcrypt-dev libctf-nobfd0 libctf0
  libexpat1-dev libfakeroot libgcc-10-dev libitm1 liblsan0 libnsl-dev
  libpython3-dev libpython3.8-dev libquadmath0 libstdc++-10-dev libtirpc-dev
  libtsan0 libubsan1 linux-libc-dev make manpages-dev python-pip-whl
  python3-dev python3-distutils python3-setuptools python3-wheel
  python3.8-dev rpcsvc-proto zlib1g-dev
Paquets suggérés :
  binutils-doc debian-keyring g++-multilib g++-10-multilib gcc-10-doc
  gcc-multilib autoconf automake libtool flex bison gcc-doc gcc-10-multilib
  gcc-10-locales glibc-doc libstdc++-10-doc make-doc python-setuptools-doc
Les NOUVEAUX paquets suivants seront installés :
  binutils binutils-common binutils-x86-64-linux-gnu build-essential dpkg-dev
  
Paramétrage de build-essential (12.8ubuntu3) ...
Paramétrage de python3-dev (3.8.6-0ubuntu1) ...
Traitement des actions différées (« triggers ») pour man-db (2.9.3-2) ...
Traitement des actions différées (« triggers ») pour libc-bin (2.32-0ubuntu3) .
..
```

Une fois chose faite nous installons openssh :

```
rootroot@rootroot-virtual-machine:~$ sudo apt install openssh-client
Lecture des listes de paquets... Fait
Construction de l'arbre des dépendances       
Lecture des informations d'état... Fait
openssh-client est déjà la version la plus récente (1:8.3p1-1).
0 mis à jour, 0 nouvellement installés, 0 à enlever et 149 non mis à jour.

``` 
Une fois chose faite nous pouvons cloner les machines.

Nous obtenons ainsi trois machine un master et deux worker.

# I.II - Configuration du SSH :

Dans un premier temps, générer une paire de clés ssh sur l'hôte avec `ssh-keygen`.

Une fois créée, nous devons transférer cette paire de clés sur le serveur Ubuntu. Il est possible de le faire avec `ssh-copy-id ansible@10.0.0.2`. Un message nous demande s'il on est sûr de vouloir se connecter, il faut accepter et ensuite entrer le mot de passe du serveur.

Une fois ces étapes passées, il est maintenant possible de se connecter au serveur sans mot de passe.

# II - Arboresence de Fichier : 

```
akhadimer@Machinator3000:~/tp-ansible$ tree
.
├── group_vars
├── inventory.ini
├── main.yml
└── roles
    ├── common
    │   ├── files
    │   │   ├── bar.txt
    │   │   └── foo.sh
    │   ├── playbook-common.yml
    │   ├── tasks
    │   │   └── main.yml
    │   └── vars
    │       └── main.yml
    ├── docker
    │   ├── files
    │   │   ├── bar.txt
    │   │   └── foo.sh
    │   ├── playbook-common.yml
    │   ├── tasks
    │   │   └── main.yml
    │   └── vars
    │       └── main.yml
    ├── kubernetes_master
    │   ├── files
    │   │   ├── bar.txt
    │   │   └── foo.sh
    │   ├── playbook-common.yml
    │   ├── tasks
    │   │   └── main.yml
    │   └── vars
    │       └── main.yml
    └── kubernetes_worker
        ├── files
        │   ├── bar.txt
        │   └── foo.sh
        ├── playbook-common.yml
        ├── tasks
        │   └── main.yml
        └── vars
            └── main.yml

18 directories, 22 files
```

# III - Inventori : 
Pour l'inventori nous avons commencé par essayer de le faire en .ini : 

```
# inventory.ini

admin.ansible 

[master]
10.0.0.2 master.ansible

[worker]
10.0.0.3 worker1.ansible
10.0.0.4 worker2.ansible
```

Suite à cela une erreur nous est remonté une erreur : 

```
akhadimer@Machinator3000:/etc/ansible$ ansible all -m ping
[WARNING]:  * Failed to parse /etc/ansible/hosts with yaml plugin: YAML inventory has invalid
structure, it should be a dictionary, got: <class 'ansible.parsing.yaml.objects.AnsibleUnicode'>
[WARNING]:  * Failed to parse /etc/ansible/hosts with ini plugin: /etc/ansible/hosts:5: Expected
key=value host variable assignment, got: master.ansible
[WARNING]: Unable to parse /etc/ansible/hosts as an inventory source
[WARNING]: No inventory was parsed, only implicit localhost is available
admin.ansible | UNREACHABLE! => {
    "changed": false,
    "msg": "Failed to connect to the host via ssh: ssh: Could not resolve hostname admin.ansible: Name or service not known",
    "unreachable": true
}
```
L'erreur venait du fait que notre Inventory était en Ini nous l'avons donc convertie en YAML.

Une fois convertie en YAML nous obtenions ce-ci : 
```
# inventory.yaml
---
all:
  hosts:
  master:
    node.master: 10.0.0.2
  worker:
    node.worker1: 10.0.0.3
    node.worker2: 10.0.0.4
```
Et nous avons eu une erreur de la sorte : 

```
akhadimer@Machinator3000:/etc/ansible$ ansible all -m ping
[WARNING]:  * Failed to parse /etc/ansible/hosts with yaml plugin: YAML inventory has invalid
structure, it should be a dictionary, got: <class 'ansible.parsing.yaml.objects.AnsibleUnicode'>
[WARNING]:  * Failed to parse /etc/ansible/hosts with ini plugin: /etc/ansible/hosts:1: Expected
key=value host variable assignment, got: 10.0.0.2
[WARNING]: Unable to parse /etc/ansible/hosts as an inventory source
[WARNING]: No inventory was parsed, only implicit localhost is available
[WARNING]: provided hosts list is empty, only localhost is available. Note that the implicit
localhost does not match 'all'
akhadimer@Machinator3000:/etc/ansible$ ansible all -m ping
[WARNING]:  * Failed to parse /etc/ansible/hosts with yaml plugin: YAML inventory has invalid
structure, it should be a dictionary, got: <class 'ansible.parsing.yaml.objects.AnsibleUnicode'>
[WARNING]:  * Failed to parse /etc/ansible/hosts with ini plugin: /etc/ansible/hosts:1: Expected
key=value host variable assignment, got: 10.0.0.2
[WARNING]: Unable to parse /etc/ansible/hosts as an inventory source
[WARNING]: No inventory was parsed, only implicit localhost is available
[WARNING]: provided hosts list is empty, only localhost is available. Note that the implicit
localhost does not match 'all'
```

Nous avons alors essayé de crer une version de notre Inventory mais sans les noms des nodes, nous avons eu l'erreur suivante
```
akhadimer@Machinator3000:/etc/ansible$ ansible all -m ping
10.0.0.4 | UNREACHABLE! => {
    "changed": false,
    "msg": "Failed to connect to the host via ssh: akhadimer@10.0.0.4: Permission denied (publickey,password).",
    "unreachable": true
}
10.0.0.2 | UNREACHABLE! => {
    "changed": false,
    "msg": "Failed to connect to the host via ssh: akhadimer@10.0.0.2: Permission denied (publickey,password).",
    "unreachable": true
}
10.0.0.3 | UNREACHABLE! => {
    "changed": false,
    "msg": "Failed to connect to the host via ssh: akhadimer@10.0.0.3: Permission denied (publickey,password).",
    "unreachable": true
}

```
Là nous avons compris que ansible pingé bien, mais essayer de se connecter via l'utilisateur par defaut du node master.