# TP Ansible
## Les commandes ad-hoc
Exécuter rapidement des commandes simples.
## Execution de commandes à l'aide de modules
`$ ansible -m [-a ]`
* `-m` nom du module
* `-a ` paramètres du module (optionnel)
* Exécuter sur toutes les machines la commande `uname -a` via le module `command`.
```none
$ ansible all -i inventories/formation/hosts -m command -a "uname -a"
ansible-3 | SUCCESS | rc=0 >>
Linux ansible-3 4.9.0-8-amd64 #1 SMP Debian
4.9.110-3+deb9u4 (2018-08-21) x86_64 GNU/Linux
ansible-2 | SUCCESS | rc=0 >>
Linux ansible-2 3.10.0-862.11.6.el7.x86_64 #1
SMP Tue Aug 14 21:49:04 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux
ansible-1 | SUCCESS | rc=0 >>
Linux ansible-1 3.10.0-862.11.6.el7.x86_64 #1
SMP Tue Aug 14 21:49:04 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux
```
* Copier le fichier `/etc/passwd` de la machine maître à l'emplacement `~/passwd` sur les machines `centos` en utilisant le module `copy`.
* Vérifier la présence du fichier à l'aide du module `command`.
* Copie du fichier :
```none
$ ansible centos -i inventories/formation/hosts -m copy \
-a "src=/etc/passwd dest=~/passwd"
ansible-2 | SUCCESS => {
"changed": true,
"checksum": "1e9317514c0769f49ec9439f9811675ac19d89ee",
"dest": "/home/ansible/passwd",
"gid": 1001,
"group": "ansible",
"md5sum": "b8bbe17a63c7bb500c89dc5e29351fc5",
"mode": "0664",
"owner": "ansible",
"size": 1574,
"src": "/home/ansible/.ansible/tmp/ansible-tmp-1537539186.68-18012403191...",
"state": "file",
"uid": 1001
}
ansible-1 | SUCCESS => {
"changed": true,
"checksum": "1e9317514c0769f49ec9439f9811675ac19d89ee",
"dest": "/home/ansible/passwd",
"gid": 1001,
"group": "ansible",
"md5sum": "b8bbe17a63c7bb500c89dc5e29351fc5",
"mode": "0664",
"owner": "ansible",
"size": 1574,
"src": "/home/ansible/.ansible/tmp/ansible-tmp-1537539186.66-20188089735...",
"state": "file",
"uid": 1001
}
```
* Vérification à l'aide du module `command` :
```none
$ ansible centos7 -i inventories/formation/hosts -m command \
-a "ls -l ~"
ansible-2 | SUCCESS | rc=0 >>
total 4
-rw-rw-r-- 1 ansible ansible 1574 21 sept. 16:13 passwd
ansible-1 | SUCCESS | rc=0 >>
total 4
-rw-rw-r-- 1 ansible ansible 1574 21 sept. 16:13 passwd
```
## Variables dans l'inventaire
`inventories/formation/hosts`
```ini
$ cat inventories/formation/hosts
ansible-1 ansible_host=192.168.56.102
ansible-2 ansible_host=192.168.56.103
ansible-3 ansible_host=192.168.56.104 tata=tutu # variable
# de machine
[centos7]
ansible-1
ansible-2
[debian9]
ansible-3
[centos7:vars] # variable
titi=toto # de groupe
[all:vars]
ansible_become=yes
ansible_become_pass=ansible
```
```yaml
$ ansible-inventory -i inventories/formation/hosts --list --yaml
all:
children:
centos7:
hosts:
ansible-1:
ansible_become: 'yes'
ansible_become_pass: ansible
ansible_host: 192.168.56.102
titi: toto
ansible-2:
ansible_become: 'yes'
ansible_become_pass: ansible
ansible_host: 192.168.56.103
titi: toto
debian9:
hosts:
ansible-3:
ansible_become: 'yes'
ansible_become_pass: ansible
ansible_host: 192.168.56.104
tata: tutu
ungrouped: {}
```
## Obtenir les droits root
* Essayer de créer sur chaque machine un fichier dans le homedir de l'utilisateur `root`.
```none
$ ansible all -i inventories/formation/hosts -m command -a "touch /root/pas-le-droit"
ansible-3 | FAILED | rc=1 >>
touch: impossible de faire un touch '/root/pas-le-droit':
Permission non accordéenon-zero return code
ansible-2 | FAILED | rc=1 >>
touch: impossible de faire un touch « /root/pas-le-droit »:
Permission non accordéenon-zero return code
ansible-1 | FAILED | rc=1 >>
touch: impossible de faire un touch « /root/pas-le-droit »:
Permission non accordéenon-zero return code
```
* Ajouter des variables `ansible_become` dans l'inventaire pour permettre l'exécution via `sudo` ou `su`.
```none
...
# Par défaut sudo est utilisé, il faut donc que
# l'utilisateur soit déclaré dans les sudoers
[all:vars]
ansible_become=yes
ansible_become_pass=ansible
```
* Essayer de nouveau de créer sur chaque machine un fichier dans le homedir de l'utilisateur `root`.
* Vérifier la bonne création du fichier à l'aide de la commande `ls`.
```none
$ ansible all -i inventories/formation/hosts -m command -a "touch /root/fichier"
ansible-3 | SUCCESS | rc=0 >>
ansible-2 | SUCCESS | rc=0 >>
ansible-1 | SUCCESS | rc=0 >>
```
```none
$ ansible all -i inventories/formation/hosts -m command -a "ls -l /root/fichier"
ansible-3 | SUCCESS | rc=0 >>
-rw-r--r-- 1 root root 0 sept. 20 16:20 /root/fichier
ansible-2 | SUCCESS | rc=0 >>
-rw-r--r-- 1 root root 0 20 sept. 16:20 /root/fichier
ansible-1 | SUCCESS | rc=0 >>
-rw-r--r-- 1 root root 0 20 sept. 16:20 /root/fichier
```
## Récupérer des informations sur les machines
* Utiliser le module `setup` pour lister les "facts" de chaque machine.
```none
$ ansible all -i inventories/formation/hosts -m setup
ansible-3 | SUCCESS => {
"ansible_facts": {
"ansible_all_ipv4_addresses": [
"10.0.2.15",
"192.168.56.5"
],
"ansible_all_ipv6_addresses": [
"fe80::a00:27ff:fe51:f40c",
"fe80::a00:27ff:fe38:cf21"
],
"ansible_apparmor": {
"status": "disabled"
},
"ansible_architecture": "x86_64",
"ansible_bios_date": "12/01/2006",
"ansible_bios_version": "VirtualBox",
"ansible_cmdline": {
"BOOT_IMAGE": "/boot/vmlinuz-4.9.0-8-amd64",
```
* Appliquer un filtre pour n'afficher que
les adresses IP v4 de chaque machine
en ajoutant l'option `-a 'filter='`.
```none
$ ansible all -i inventories/formation/hosts -m setup \
-a 'filter=ansible_all_ipv4_addresses' --one-line
ansible-3 | SUCCESS => {"ansible_facts": {"ansible_all_ipv4_addresses":
["10.0.2.15", "192.168.56.104"]}, "changed": false}
ansible-2 | SUCCESS => {"ansible_facts": {"ansible_all_ipv4_addresses":
["192.168.56.103", "10.0.2.15"]}, "changed": false}
ansible-1 | SUCCESS => {"ansible_facts": {"ansible_all_ipv4_addresses":
["192.168.56.102", "10.0.2.15"]}, "changed": false}
```
* Appliquer un filtre pour n'afficher que la famille d'OS.
```none
$ ansible all -i inventories/formation/hosts -m setup \
-a 'filter=ansible_os_family' --one-line
ansible-3 | SUCCESS => {"ansible_facts": {"ansible_os_family":
"Debian"}, "changed": false}
ansible-1 | SUCCESS => {"ansible_facts": {"ansible_os_family":
"RedHat"}, "changed": false}
ansible-2 | SUCCESS => {"ansible_facts": {"ansible_os_family":
"RedHat"}, "changed": false}
```