README.md 8.81 KB
Newer Older
Thierry Fenasse's avatar
Thierry Fenasse committed
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
Découverte de Ansible
=====================

C'est dans le cadre d'une initiation proposée par [Tharyrok](https://github.com/Tharyrok) pour préparer la nouvelle [infrastructure de Neutrinet](https://github.com/Neutrinet/infra).

Quelle claque ! :P

Ordinateur
----------

Pour cette découverte j'ai utilisé un ordinateur équipé de [GNU/Linux Trisquel 7 Belenos](https://trisquel.info/en/trisquel-70-lts-belenos) avec git et phyton.

Dossier de travail
------------------

J'ai créé un dossier Ansible dans ~/Documents pour y mettre mes futurs borls Ansibelèsque.

18
```
19
mkdir -p ~/Documents/Ansible && cd "$_"
20 21
```
> $_ is a special parameter that holds the last argument of the previous command. The quote around $_ make sure it works even if the folder name contains spaces. ([source](https://unix.stackexchange.com/questions/125385/combined-mkdir-and-cd) )
Thierry Fenasse's avatar
Thierry Fenasse committed
22

23
J'y ai cloné le dépot ici présent qui à l'origine était vide mais j'ai suivi ce qui est proposé sur la page d'accueil de tout nouveaux dépot Gitlab ou Github.
Thierry Fenasse's avatar
Thierry Fenasse committed
24 25

```
26
git clone git clone git@gitlab.domainepublic.net:tierce/decouverte-ansible.git
Thierry Fenasse's avatar
Thierry Fenasse committed
27 28
```

29 30
Ensuite je suis rentré dans le dossier de ce projet tout frais, qui pour rappel se trouve dans `~/Documents/Ansible/` sur mon ordinateur, et j'y ai édité le fichier README.md que vous êtes entrain de lire. Si si !

Thierry Fenasse's avatar
Thierry Fenasse committed
31 32 33
Cette édition du README.md peut se faire avec n'importe quel éditeur TEXTE de votre préférence.

```
34 35
cd decouverte-ansible
vi README.md
36 37 38 39 40
```

Et pour renvoyer le travail accomplis vers le dépôt publique, voici les quelques commandes nécessaires.

```
41 42 43
git add README.md
git commit -m "ajout du README"
git push -u origin master
Thierry Fenasse's avatar
Thierry Fenasse committed
44
```
45 46 47 48
> Il faut refaire ce genre d'opération pour « pousser » une nouvelle version du projet vers un dépôt en ligne. Si besoin, il y a quelques infos sur Git [ici](https://gitlab.domainepublic.net/tierce/tutoriel-git#autres-ressources).

Installer Ansible
-----------------
Thierry Fenasse's avatar
Thierry Fenasse committed
49

50 51
Python permet de créer un environnement de travail (un dossier) dans lequel se mettront les librairies requises par Ansible.
Ce dossier pourra être un dossier caché, commençant par un `.` pour ne pas le voir dans le projet.
Thierry Fenasse's avatar
Thierry Fenasse committed
52 53

```
54
virtualenv .env # .env étant le nom du dossier que vous souhaitez créer.
55 56 57 58 59 60
```

Pour ce faire il faut créer un fichier contenant la liste des modules python avec lesquels travailler.
Je me suis basé sur [cette version](https://github.com/Neutrinet/infra/blob/04e41fc50f6c2f3ac57c827e664ba9677a5f28ff/requirements.txt) du fichier `requirements.txt` de Neutrinet.

```
61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80
cat << EOF > requirements.txt
ansible==2.3.0.0
appdirs==1.4.3
asn1crypto==0.22.0
cffi==1.10.0
cryptography==1.8.1
enum34==1.1.6
idna==2.5
ipaddress==1.0.18
Jinja2==2.9.6
MarkupSafe==1.0
packaging==16.8
paramiko==2.1.2
pyasn1==0.2.3
pycparser==2.17
pycrypto==2.6.1
pyparsing==2.2.0
PyYAML==3.12
six==1.10.0
EOF
81 82 83 84
```

Voici une autre méthode pour créér ce fichier `requiements.txt`.

Thierry Fenasse's avatar
Thierry Fenasse committed
85
```
86 87 88 89 90
wget https://raw.githubusercontent.com/Neutrinet/infra/04e41fc50f6c2f3ac57c827e664ba9677a5f28ff/requirements.txt
```

Pour installer ces éléments c'est `pip` qui fera le travail.  Cette étape pourrait générer des erreurs qui demanderont probablement d'installer des paquets supplémentaires dans votre ordinateur.  Il faudra alors les identifier en fonction des erreurs qui `pip` vous donneront et les installer avec votre gestionnaire de paquet favoris.  Par exemple `$ sudo apt install python-dev` ou `sudo apt install libffi-dev`.

91 92 93
```
.env/bin/pip install -r requirements.txt
```
94 95 96 97

À la fin de cette installation Ansible sera disponible et les quelques commandes suivantes devraient sortir quelques chose.

```
98 99
.env/bin/ansible --version
.env/bin/ansible --help
100 101 102 103 104
```

Parmis les binaires ansible disponibles, c'est avec `ansible` et surtout `ansible-playbook` que l'aventure commence!

```
105 106 107 108 109 110
ls -1 .env/bin/ansible*
```

Ajouter un .gitignore
--------------------

111
Pour éviter de pousser des trucs inutiles vers le dépôt en ligne, un fichier `.gitignore` sera nécessaire.  Il est possible d'en créer un avec, par exemple, [Gitignore.io](https://www.gitignore.io/) ou le faire soi-même.
112 113 114 115 116 117 118 119 120 121 122 123

```
echo ".env" > .gitignore
echo ".gitignore" >> .gitignore # notez le >> pour ajouter à la suite
```

Et hop! Ajouter tout ce qui n'est pas dans le `.gitignore`, commiter avec un commentaire et pousser le tout sur le dépôt.

```
git add *
git commit -m "virtualenv, requirements et gitignore"
git push -u origin master
124 125
```

126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214
Un tutoriel en anglais pour Ansible
-----------------------------------

Pour une découverte pas à pas voici [ansible-tuto](https://github.com/leucos/ansible-tuto) qui propose une introduction intéressante à condition de disposer de [virtualbox](https://www.virtualbox.org/) et 3 x 200Mb pour les trois VMs qui seront créées.

Mettre en place un labo
-----------------------

### Physique ###

Souhaitant voir ce que ça donne sur des machines physiques peu performantes, je vais utiliser 3 vieux machin de 2006.

* 1Gb de RAM
* 1 CPU Pentium D avec 2 cœurs
* 1 disque SATA de 80Gb
* 1 carte 100Mb (j'aurais quand même préféré des 1Gb mais bon)

### Virtuel ###

C'est au choix, sur Internet quelque part, sur un PC avec un peu de RAM et VirtualBox ou un autre outil de [virtualisation](https://fr.wikipedia.org/wiki/Virtualisation)

### Physique ou virtule ###

Il faudra y installer une distribution GNU/Linux comme Debian 9 ou autre avec le serveur openssh puisque c'est en utilisant [ssh](https://fr.wikipedia.org/wiki/Secure_Shell) qu'Ansible va se connecter et appliquer nos **recettes**.

Il y aura donc 3 ordinateurs sur lesquels se connecter avec `ssh` sur lesquels;

* se connecter sans mot de passe grâce à l'utilisation d'une paire de clés _(ssh-key-gen, ssh-copy-id)_,
* cette connection se fera avec un utilisateur faisant partie des sudoers _(adduser xxxx sudo)_,
* l'escalade des privilèges se fera sans mot de passe _(sudo su -> visudo -> NOPASSWD(ALL))_,


Inventaire ansible
------------------

Un fichiers devra contenir des informations sur les ordinateurs faisant partie l'**inventaire**.

Par exemple voici le contenu du fichier `hosts`.

```
[premier]
hpc01.home ansible_host=192.168.1.121 ansible_become=yes

[autres]
hpc02.home ansible_host=192.168.1.122 ansible_become=yes
hpc03.home ansible_host=192.168.1.123 ansible_become=yes
```
> ansible_become=yes voulant dire « devient root une fois connecté». Voir [la doc](https://docs.ansible.com/ansible/latest/user_guide/become.html)

Ce fichier `hosts` (qui pourrait s'appeler inventaire.txt ou autre) se trouve à la racine de notre projet.

```
ls -a -1
.
..
.env
.git
.gitignore
hosts
README.md
requirements.txt
```

Aller, faisons un premier test avec Ansible sur notre [premier] hôte.

```
.env/bin/ansible -i hosts -m shell -a 'uname -a' premier
hpc01.home | SUCCESS | rc=0 >>
Linux hpc01 4.9.0-8-amd64 #1 SMP Debian 4.9.110-3+deb9u4 (2018-08-21) x86_64 GNU/Linux
```

Et sur les deux [autres].

```
.env/bin/ansible -i hosts -m shell -a 'uname -a' autres
hpc03.home | SUCCESS | rc=0 >>
Linux hpc03 4.9.0-6-amd64 #1 SMP Debian 4.9.88-1+deb9u1 (2018-05-07) x86_64 GNU/Linux

hpc02.home | SUCCESS | rc=0 >>
Linux hpc02 4.9.0-6-amd64 #1 SMP Debian 4.9.88-1+deb9u1 (2018-05-07) x86_64 GNU/Linux
```

Ajouter un disque dur dans chaque machine
-----------------------------------------

Souhaitant peut-être parvenir à installer [GlusterFS](https://docs.gluster.org/en/latest/Quick-Start-Guide/Quickstart/) sur mon petit labo-pourri j'ai contaté qu'il ma faudrait un deuxième disque dans les machines.

* 1 second disque SATA de 500Gb sur chaque PC.

215

216 217
Utiliser un playbook pour formater et monter ce nouveau disque
--------------------------------------------------------------
218

219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253
Je me suis inspiré de [ansible-disk](https://github.com/AerisCloud/ansible-disk) pour pouvoir formater et monter ce disque comme demandé dans la doc de GlusterFS et réaliser les tâche suivantes, non pas à la main, mais avec Ansible.

```
mkfs.xfs -i size=512 /dev/sdb1
mkdir -p /data/brick1
echo '/dev/sdb1 /data/brick1 xfs defaults 1 2' >> /etc/fstab
mount -a && mount
```

Commencer tout de suite avec un dossier pour contenir les **playbooks**, les **roles** et les **group_vars** c'est pas nécessaire, mais c'est probablement ce vers quoi il faudra aller pour gérer une infrastructure informatique.

```
tree # voici le contenu de notre projet decouverte-ansible
.
├── ansible.cfg
├── group_vars
│   └── all
├── hosts
├── playbooks
│   └── disks.yml
├── README.md
├── requirements.txt
└── roles
    └── disks
        └── tasks
            └── main.yml

5 directories, 7 files
```

Le contenu des fichiers listés ci-dessus devraient fonctionner et c'est ce qu'on verra en exécutant le playbook `disks.yml`.

```
.env/bin/ansible-playbook -i hosts playbooks/disks.yml
```
254

255
Et pour rappel, ma découverte d'Ansible est passée par [ce tutoriel]((https://github.com/leucos/ansible-tuto)).