Configuration et déploiement avec Ansible

Rédigé par uTux - - 5 commentaires

Ansible est un logiciel d'automatisation et de déploiement, il permet de créer des listes de tâches qui peuvent ensuite être jouées sur un ou plusieurs serveurs.

Attention cet article n'est pas un tutoriel (pour cela je vous renvoie vers la documentation officielle), mon but est de faire un petit retour d'expérience et montrer un exemple de projet Ansible.

Pourquoi Ansible ?

Il existe de nombreuses solutions de ce type mais il y a selon moi deux points qui distinguent Ansible : il est simple à prendre en main (excellente documentation et syntaxe yaml humainement lisible) et il ne nécessite pas d'agent pour fonctionner. En effet sur vos cibles, vous avez uniquement besoin de Python et SSH, présents en standard sur quasiment toutes les distributions Linux. Ansible marche aussi avec Windows et FreeBSD.

Pourquoi pas un script Bash / Perl / Python ?

Ben oui, il y a beaucoup de gens qui se sont fait leur propre script afin de configurer rapidement leur serveur. Mais en vrai les scripts c'est pas idéal :

  • C'est long à développer et ce n'est pas forcément votre métier.
  • Plus le script est complexe moins il sera lisible.
  • Le script doit être copié et exécuté à la main sur chaque serveur.
  • Il se contente d'exécuter une série de commandes sans se soucier du résultat.
  • Bon courage pour gérer un inventaire centralisé et des variables dynamiques.
  • Même en documentant votre script, vous serez le seul à comprendre réellement comment il marche.
  • Qui n'a jamais eu à déboguer un script obscur vieux de 10 ans ?

Ansible est beaucoup plus propre car depuis une unique machine vous gérez votre inventaire de serveurs et vos playbooks dans un même projet. Vous ne vous souciez que du résultat, vous ne demandez pas à ansible de faire un apt-get install curl, vous lui dites juste que le paquet curl doit être présent, à lui de faire en sorte de l'installer si besoin .Et c'est important non seulement car Ansible sait ce qu'il fait, mais il sait aussi le faire plusieurs fois, c'est ce qu'on appelle l'idempotence (sous réserve de ne pas faire n'importe quoi avec les playbooks, bien entendu). Enfin, il y a une énorme communauté d'utilisateurs et beaucoup de modules tiers, on trouve donc toujours des solutions aux problèmes

Exemple d'utilisation

Avertissement : Il y a plusieurs moyens de structurer un projet Ansible, consultez la page Best Practises. L'organisation que j'ai choisi n'engage que moi, vous êtes libre de faire autrement si ça colle mieux à vos besoins !

Voici un exemple de projet Ansible qui utilise un inventaire, des playbooks et des roles. Il sera utilisé pour configurer les nouveaux serveurs fraîchement installés. Objectifs :

  • Installer une liste de paquets de base
  • Configurer le /etc/hostname avec le nom du serveur
  • Configurer la locale fr_FR.UTF-8.
  • Configurer la timezone Europe/Paris.
  • Installer Nginx et Php-fpm sur les serveurs web
  • Tout en étant compatible Debian 8 & Ubuntu 16.04 (les paquets php n'ont pas le même nom !)

Arborescence du projet :

├── deploy-newserver.yml
├── group_vars
│   └── all
├── host_vars
│   ├── server01.example.org
│   └── web01.example.org
├── production.ini
└── roles
    ├── configure-newserver
    │   └── tasks
    │       └── main.yml
    │   └── templates
    │       └── hostname.j2
    ├── install-nginx
    |   └── tasks
    |       └── main.yml
    └── install-php-fpm
        └── tasks
            └── main.yml

Détail des fichiers :

---
# deploy-newserver.yml

- hosts: all
  roles:
    - configure-newserver

- hosts: webservers
  roles:
    - install-nginx
    - install-php-fpm
---
# group_vars/all
ansible_user: root
---
# host_vars/server01.example.org

ansible_host: 172.16.42.190
---
# host_vars/web01.example.org

ansible_host: 172.16.42.180
# production.ini
server01.example.org

[webservers]
web01.example.org
---
# roles/configure-newserver/tasks/main.yml

  - name: set hostname (volatile)
    hostname:
      name: '{{ inventory_hostname }}'

  - name: set hostname (permanent)
    template:
      src: hostname.j2
      dest: /etc/hostname
      force: yes

  - name: generate locales
    locale_gen:
      name: '{{ locale }}'
      state: present
    with_items:
      - en_EN.UTF-8
      - fr_FR.UTF-8

  - name: set default locale
    lineinfile:
      dest: /etc/default/locale
      regexp: '^LANG=.*$'
      line: 'LANG=fr_FR.UTF-8'
      create: yes
      state: present

  - name: set timezone
    file:
      src: /usr/share/zoneinfo/Europe/Paris
      dest: /etc/localtime
      force: yes
      state: link

  - name: common packages
    apt:
      name: "{{ item }}"
      state: present
    with_items:
      - apt-transport-https
      - bsd-mailx
      - ca-certificates
      - htop
      - manpages
      - net-tools
      - openssl
      - pciutils
      - postfix
      - ntp
      - ntpdate
      - rsync
      - tree
      - tzdata
      - ufw
      - unzip
      - vim
# roles/configure-newserver/templates/hostname.j2
{{ inventory_hostname }}
---
# roles/install-nginx/tasks/main.yml

  - name: install
    apt:
      name: nginx
      state: present
---
# roles/install-php-fpm/tasks/main.yml

  - name: php5-fpm if Debian <= 8
    apt:
      name: '{{ item }}'
      state: present
    with_items:
      - php5-fpm
      - php5-gd
    when:
      - ansible_distribution == "Debian" and ansible_distribution_major_version <= '8'

  - name: php7.0-fpm if Ubuntu => 16
    apt:
      name: '{{ item }}'
      state: present
    with_items:
      - php7.0-fpm
      - php7.0-xml
      - php7.0-gd
    when:
      - ansible_distribution == "Ubuntu" and ansible_distribution_major_version >= '16'

Lancer en dry-run (ne modifie rien) :

$ ansible-playbook -i production.ini deploy-newserver.yml --check

Lancer le déploiement :

$ ansible-playbook -i production.ini deploy-newserver.yml

Lancer le déploiement sur web01.example.org uniquement :

$ ansible-playbook -i production.ini deploy-newserver.yml --limit web01.example.org

Et voilà.

Exécution du playbook.

Ansible et moi

J'utilise régulièrement Ansible et maintient des playbooks pour des projets persos et pro, et j'en suis très satisfait. La documentation m'a permis d'être autonome et à l'aise assez vite et m'a même poussé à automatiser plus de choses que nécessaire, comme le déploiement de sites web alors que je pensais me limiter à la stack nginx / php-fpm / letsencrypt.

Même si je suis pleinement convaincu et satisfait par Ansible, je rencontre quand même certaines limitations. Par exemple l'inventaire n'est pas idéal quand on a beaucoup de serveurs et de groupes, ça peut rapidement devenir illisible. Il y a aussi certains modules tels que authorized_key pour lesquels j'aimerai plus de fonctionnalités, en l’occurrence pouvoir utiliser le paramètre 'exclusive' avec plusieurs clés.

Petits conseils en vrac

  • Ansible évolue vite, utilisez une version récente, disponible dans les backports debian ou via pip.
  • Le state: present est souvent implicite, vous n'avez donc pas besoin de le mettre, cependant c'est mieux de le faire, pour rendre le playbook plus évident à comprendre.
  • Pensez à utiliser les variables, pour les URLs ou les numéros de version.
  • Ne mettez pas de mot de passe ou de credential dans les playbooks, utilisez des variables passées au moment de l'exécution, ou dans un fichier que vous prendrez soin d'exclure si vous utilisez un repo public.
  • Faites un dry-run pour tester vos playbooks, on ne sait jamais.
  • Attention au module file et plus particulièrement aux permissions, surtout quand vous travaillez sur des fichiers existants (tels que le resolv.conf).
  • La commande ansible hostname -m setup vous permet de récupérer tous les 'facts' (OS, version, ip...) d'une cible, ils peuvent être utilisés dans les playbooks.
  • Testez vos playbooks jusqu'au bout : redémarrez le serveur pour vérifier que les modifications ne sont pas volatiles.
  • Faites des choses propres et simples. Si vos besoins sont trop variés ou spécifiques, n'utilisez pas Ansible, ou limitez vous au minimum.
  • La machine sur laquelle vous exécutez Ansible est critique, car en général vous aurez l'accès root without-password à tous vos serveurs, c'est donc un point d'entrée que vous devez sécuriser au maximum.

Conclusion

Si vous souhaitez unifier, accélérer et automatiser vos déploiements ou tout simplement vous initier au devops, Ansible est un outil que je recommande fortement, l'essayer c'est l'adopter.

Mieux que Windows Update : WSUS Offline Update

Rédigé par uTux - - 2 commentaires

Windows Update a toujours été d'une lenteur extrême, à se demander s'il ne recompile pas l'intégralité de l'OS à chaque fois, mais il a toujours plus ou moins bien fonctionné. Ce n'est plus vrai depuis l'arrivée de Windows 10 sur le marché et on observe de plus en plus de dysfonctionnements pour Windows 7 : j'en parle dans mon article Complot : Microsoft a-t-il saboté Windows Update sur Windows 7 ?.

Bonne nouvelle, il existe une solution alternative : WSUS Offline Update. Ce logiciel va vérifier, télécharger et installer les mises à jour. L'outil est très léger, ne nécessite pas d'installation, et fonctionne très bien.

Page de téléchargement de WSUS Offline.

Etape 1 : Téléchargement des KB

Commencez par exécuter UpdateGenerator.exe puis sélectionnez la ou les versions de Windows concernées (Windows 7, 8.1 ou 10) :

Sélection des systèmes cible et des options.

Cliquez ensuite sur Start :

Téléchargement des KB en cours.

Etape 2 : Installation des KB

Le support d'installation des KB est maintenant créé. Dans votre dossier wsusoffline/client, exécutez UpdateInstaller.exe :

L'installeur.

Cliquez ensuite sur Start :

Installation des KB en cours.

A la fin de l'installation, prenez le temps de lire les messages, il est parfois demandé de redémarrer l'ordinateur pour ensuite relancer l'installation de la suite des KB.

VirtualBox : une case magique à cocher

Rédigé par uTux - - 8 commentaires

Ouvrez les paramètres de votre machine virtuelle, rendez-vous dans "Stockage, et cochez la case "Utiliser le cache E/S de l'hôte". Validez, et profitez de performances largement supérieures, proches du natif. La différence sera d'autant plus flagrante si vous utilisez un disque dur et non un SSD pour le stockage.

La case magique à cocher !

Pourquoi cette option n'est-elle pas activée par défaut ? Simplement parce que l'utilisation d'un cache ne permet plus d'assurer la fiabilité d'écriture des données. En effet, si votre PC s'éteint brutalement (coupure de courant), toutes les données en cache qui n'ont pas encore été écrites sur le disque seront perdues. C'est d'ailleurs pour cela qu'on trouve des batteries sur certains contrôleurs matériel RAID des serveurs.

A titre personnel, je recommande de l'utiliser car le risque est plus théorique que pratique, de plus NTFS est très bon pour s'auto réparer en cas de coupure brutale. Et puis le gain de performances est tellement énorme qu'il est difficile de s'en passer après avoir essayé.

Pense-bête : ubuntu-mate 16.10 + firefox + start page

Rédigé par uTux - - Aucun commentaire

On ne peut pas changer de page de démarrage sur Firefox depuis Ubuntu-Mate 16.10, c'est con, et il y a un rapport de bug ouvert qui n'a pas l'air d'intéresser grand monde :/

Voici ma solution custom :

$ sudo rm -r /usr/lib/firefox/defaults

C'est un peu sale mais ça ne pète ni Firefox ni votre profil. Mais en cas de mise à jour du paquet ubuntu-mate-default-settings il risque de revenir. Espérons que ce bug sera corrigé en amont.

EDIT : Autre solution, qui a l'air un peu plus propre, source :

$ sudo echo "" > /usr/lib/firefox/ubuntumate.cfg

La vente liée et l'emmerdeur

Rédigé par uTux - - 6 commentaires

J'ai commencé à rédiger cet article il y a presque un mois, mais par manque de temps et d'inspiration il est resté à l'état de brouillon. Je le publie aujourd'hui car même si l'événement n'est plus d'actualité, les réactions de certaines personnes m'ont vraiment indigné et donné l'envie d'écrire.

Vous connaissez l'histoire, en 2008 un utilisateur, Vincent Deroo-Blanquart, achète un ordinateur SONY et porte plainte parce que l'ordinateur est fourni avec Windows et tout un tas de logiciels dont le prix n'est pas clairement indiqué et surtout il n'y a pas de moyen de les refuser sans renoncer à l'achat. Il est finalement débouté et la vente liée que l'on a toujours cru illégale est même déclarée explicitement comme acceptable par la justice européenne : résumé (NextINpact). Ce jugement est potentiellement lourd de conséquences puisqu'il pourrait inciter les constructeurs qui pratiquent aujourd'hui des remboursements du système d'exploitation à cesser cette pratique.

La vente liée est le ciment du monopole de Microsoft, l'écrasement absolu de toute concurrence puisque quoi qu'il arrive chaque ordinateur vendu dans le monde = 1 licence Windows. Et elle n'est pas gratuite, elle représente une partie du prix du PC. C'est un fait dénoncé entre autres par les utilisateurs de Linux depuis des années mais qui touche en réalité bien plus de gens, par exemple ceux qui veulent installer leur propre copie de Windows 7 ou encore les professionnels qui ont des licences en volume et qui se retrouvent à payer en double pour rien lors des achats de matériel.

Cyrille donne un avis tranché et considère le plaignant comme un emmerdeur puisque de toutes manières il existe des ordinateurs sans OS tels que ceux proposés chez LDLC. Si sa démarche était réellement d'emmerder le monde alors je tiens à le féliciter, s'attaquer seul aux poids lourds que sont SONY et Microsoft , faire remonter l'affaire jusqu'à la justice européenne avec ses propres deniers tout ça pour en arriver à une conclusion qui constitue un retour en arrière pour les droits des consommateurs, c'est le troll du siècle. Sauf que la plainte date de 2008, époque à laquelle il était encore plus difficile qu'aujourd'hui de trouver des ordinateurs sans OS, et qu'en plus on a pas forcément envie d'acheter la marque LDLC. Et enfin les vraies questions de la vente liée sont, une fois de plus, évitées.

L'approche de ce jugement est purement pragmatique : les gens veulent un OS sur leur ordinateur, et même si le prix était clairement indiqué, même si on pouvait refuser, ça n'influencerait pas la décision d'achat, donc il est inutile de détailler le prix des logiciels ou donner la possibilité de refuser. Admettons, mais dans ce cas pourquoi Microsoft ? Pourquoi ne pas permettre à d'autres éditeurs de préinstaller leurs OS ? Même sans évoquer Linux, la question de l'illégitimité du monopole de Microsoft n'est jamais soulevée. Et puis si on va au bout du raisonnement, pourquoi continuer à indiquer les ingrédients et compositions sur les produits que l'on achète au supermarché, puisque ça n'influencerait pas les achats des consommateurs ? Ou dans l'autre sens : s'il n'y a pas d'influence négative sur le marché, pourquoi ne pas afficher les prix ? De plus on ne demande pas le retrait de Windows sur chaque machine, on demande l'affichage du prix réel des logiciels ainsi que la possibilité de les refuser sans devoir renoncer à l'achat.

Morgan Spurlock, protagoniste et réalisateur du film Supersize Me aurait pu être lui aussi être qualifié d'emmerdeur, mais aujourd'hui tout le monde considère qu'il a raison et que derrière l'économie, les emplois et le succès des fastfood, il y a la malbouffe, les maladies, l'endoctrinement des enfants, la désinformation des adultes. De là à transposer cette situation à l'informatique et à dire que dans quelques gouvernements années on réalisera que donner les clés de notre industrie / éducation / défense à Microsoft n'est pas une bonne idée et qu'on indiquera au moins le prix des logiciels sur les ordinateurs en grande surface, il n'y a qu'un pas utopiste que je franchis.

En conclusion, non, notre plaignant, Vincent Deroo-Blanquart n'est pas un emmerdeur, ou alors si mais dans le bon sens, et en tant que geeks nous devrions le remercier d'être allé aussi loin alors que tout le monde se contente de râler ou fermer les yeux, parce qu'au final ce n'est pas le desktop linux qui importe, c'est que le PC reste une plateforme ouverte avec du choix sur laquelle nous pouvons bidouiller.

Fil RSS des articles de cette catégorie