Aller au contenu

Ansible

Prérequis:

Sur le poste admin:

  • ansible
  • ssh (échange avec une paire de clés)
  • python

Sur les serveurs et postes à administrer:

  • ssh (échange avec une paire de clés)
  • python

Fichier hosts.ini

Sur le poste admin, afin de ne pas utiliser l'utilisateur root, on va créer un fichier hosts.ini, par exemple: Le fichier doit être complété comme ci-dessous:

[groupe]
srv1 ansible_host=192.168.1... ansible_port=22 ansible_user=root
srv2 ansible_host=192.168.1... ansible_port=22 ansible_user=root

Fichier ansible.cfg

On peut préciser dans le fichier /etc/ansible/ansible.cfg quelques paramètres bien pratiques

inventory      = /home/jo/Seafile/ansible/playbooks-srv/hosts.ini
interpreter_python = /usr/bin/python3
  • inventory: permettra d'indiquer ou se trouve le fichier hosts.ini
  • interpreter_python: permettra de préciser notre version de python.

Ansible commande ad-hoc

On peut lancer une commande à un groupe ou tous les hôtes via ansible avec la commande:

 ansible groupe -a "command"

ex:

ansible web-srv -a "uptime"

Il y a possibilité d'aller bien plus loin en lançant, par exemple, les commandes petit à petit sur les hôtes du groupe, etc...

Voir le lien de la doc officiel: https://docs.ansible.com/ansible/latest/user_guide/intro_adhoc.html

Playbooks.yml

Le playbook est un fichier en yaml, ou yml. Ce fichier est une sorte de recette qu'ansible devra lire et exécuter ligne par ligne.

Les fichiers yml ont une syntaxe particulière qu'il faudra respecter. L'indentation est aussi importante !

Il y a différent module qu'ansible peut utiliser, dont apt, shell, mysql...

Un exemple de playbook:

---
 - hosts: ct

   tasks:
   - ping: ~

   - name: apt update    
     apt:
       update_cache: yes
   - name: apt upgrade
     apt:
       upgrade: dist
   - name: apt autoclean 
     apt: 
      autoclean: yes
   - name: apt autoremove 
     apt: 
      autoremove: yes
   - name: Redémarrage des services automatiquement (needrestart)
     shell: needrestart -ra -l

 - hosts: dl-ct
   tasks:
   - name: Mise à jour de youtube-dl (pip install)
     shell: pip install --upgrade youtube_dl

 - hosts: pi-hole-ct
   tasks:
   - name: Mise à jour pihole
     shell: pihole -up

 - hosts: web-ct
   tasks:
   - name: Lancement script db-tar-gz.sh
     shell: sh /home/jo/db-tar-gz.sh

Le site officiel pour les modules ansible: https://docs.ansible.com/ansible/latest/modules/modules_by_category.html

Ansible-playbooks

Afin de lancer un playbook en utilisant un fichier hosts.ini en particulier; on utilisera la commande ansible-playbook:

ansible-playbook -i hosts.ini srv-playbook.yml
  • -i hosts.ini facultatif si précisé dans /etc/ansible/ansible.cfg

Pour en savoir plus, voici le site officiel de la doc ansible: https://docs.ansible.com/ansible/latest/index.html

Module apt

Ce module var permettre d'utiliser les commandes apt d'un système basé sur Debian.

apt:
 update_cache: yes

apt:
  upgrade: dist

apt: 
  autoclean: yes

apt: 
  autoremove: yes

Dans l'ordre, ansible exécutera un apt update && apt upgrade && apt autoclean && apt autoremove

Pour installer des paquets avec apt sous ansible, on utilisera:

apt:
 name: ['htop', 'nmon', 'curl', 'wget', 'apt-transport-https', 'tmux', 'lnav', 'gpg', 'bash-completion']
 state: present
Pour désinstaller des paquets avec apt sous ansible, on utilisera:
apt:
 name: ['htop', 'nmon', 'curl', 'wget', 'apt-transport-https', 'tmux', 'lnav', 'gpg', 'bash-completion']
 state: absent

Module apt_repository

- name: Ajout dépôt dans sources.list.d/
    apt_repository: 
     repo: deb http://http.debian.net/debian unstable main
     state: present

Module file (créer des fichiers ou des dossiers)

Pour créer un fichier:

- name: Change file ownership, group and permissions
  file:
    path: /etc/foo.conf
    owner: root
    group: root
    mode: 0644
    state: touch
Pour créer un dossier avec les droits récursifs:

- name: Recursively change ownership of a directory
  file:
    path: /etc/foo
    state: directory
    recurse: yes
    owner: foo
    group: foo
Pour créer un lien symbolique

- name: Créer un lien symbolique
  file:
    src: /file/to/link/to
    dest: /path/to/symlink
    state: link

Module service

Pour la gestion des services système, ça se passe comme ça:

- name: Restart service apache2, in all cases
  service:
    name: apache2
    state: restarted
l'option state peut avoir ces options:

stopped
started
reloaded
restarted

Module blockinfile (remplir fichier)

- name: Insérer du texte à l'intérieur d'un fichier
  blockinfile:
    path: /etc/config-jo
    block: |
       Le contenu de mon fichier
       sur plusieurs lignes
       dernière ligne

Module copy

- name: Copy file with owner and permissions
  copy:
    src: /srv/myfiles/foo.conf
    dest: /etc/foo.conf
    owner: foo
    group: foo
    mode: 0644
La copie peut être lente, pour les dossiers on peut utiliser le module synchronize

Module synchronize

- name: Synchronisation de la source vers la destination
  synchronize:
    src: some/relative/path
    dest: /some/absolute/path

Module flatpak

- name: Installation des paquets flatpak
  flatpak:
    name: org.libreoffice.LibreOffice 
           tv.kodi.Kodi
    state: present

Module unarchive (Désarchivage, dezippage)

- name: Dezippage de foo.tgz dans /var/lib/foo
  unarchive:
    src: foo.tgz
    dest: /var/lib/foo
Pour télécharger et dézipper une archive, il faudra utiliser l'option src
- name: Dézipper une archive en la téléchargeant d'abord (ajouté dans la version 2.0 de ansible)
  unarchive:
    src: https://example.com/example.zip
    dest: /usr/local/bin
    remote_src: yes

Module get_url (Téléchargement d'un fichier distant)

- name: Téléchargement d'un fichier distant
  get_url:
    url: http://example.com/path/file.conf
    dest: /etc/file.conf
    mode: '0440'