Publicité
Publicité

Contenu connexe

Publicité

Plus de Publicis Sapient Engineering(20)

Publicité

Les développeurs aussi maitrisent le systèmD - Devoxx 2015

  1. @Jean_Eudes#DevoxxSystemD Les développeurs aussi maîtrisent le systemd
  2. @Jean_Eudes#DevoxxSystemD Les développeurs aussi maîtrisent le systemd @Jean_Eudes Xebia Developer Devops fan
  3. Objectifs
  4. @Jean_Eudes#DevoxxSystemD Calendrier • Système d'init ? • SystemD : Une solution à quelles problématiques ? • Décortiquons un peu systemD • Les « scripts » SystemD
  5. @YourTwitterHandle@YourTwitterHandle @Jean_eudes#DevoxxSystemD L'ère pré SystemD
  6. @Jean_Eudes#DevoxxSystemD Démarrage d'un linux
  7. @Jean_Eudes#DevoxxSystemD Responsabilité de l'init • Initialisation des processus • Gestion du cycle de vie des processus • Resté en vie
  8. @Jean_Eudes#DevoxxSystemD System V • Lecture du fichier inittab • Chargement des différents niveaux
  9. @Jean_Eudes#DevoxxSystemD System V . /lib/lsb/init-functions NAME=cocktail EXEC=$CATALINA_HOME/bin/startup.sh PIDFILE=$CATALINA_BASE/logs/cocktail.pid export CATALINA_PID=$PIDFILE do_start() { start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $EXEC -c tomcat } do_stop() { start-stop-daemon --stop --quiet --retry=TERM/30/KILL/5 --pidfile $PIDFILE rm -f $PIDFILE } do_status() { status_of_proc -p $PIDFILE $EXEC $NAME && exit 0 || exit $? }
  10. @Jean_Eudes#DevoxxSystemD System V • Comment démarrer un processus /etc/init.d/service start
  11. @Jean_Eudes#DevoxxSystemD System V • Comment arrêter un processus /etc/init.d/service stop
  12. @Jean_Eudes#DevoxxSystemD System V • Comment arrêter un processus kill $PID
  13. @Jean_Eudes#DevoxxSystemD System V ● Connaître le status d'un processus ps aux | grep service
  14. @Jean_Eudes#DevoxxSystemD System V ● Connaître le status d'un processus /etc/init.d/service status
  15. @Jean_Eudes#DevoxxSystemD Les problématiques avec SystemV • Les dépendances entre services • Gestion des daemons • Gestion des processus zombie • Duplication du code
  16. @Jean_Eudes#DevoxxSystemD Les alternatives à SystemV • Upstart • OpenRC
  17. @YourTwitterHandle@YourTwitterHandle @Jean_eudes#DevoxxSystemD La philosophie SystemD
  18. @Jean_Eudes#DevoxxSystemD Fiche signalétique • Projet commence en 2010 • Écrit en C • maintenu par Lennart Poettering
  19. @Jean_Eudes#DevoxxSystemD Adoption • Fedora / Red Hat / Centos • Archlinux • Debian / Ubuntu (en cours)
  20. @Jean_Eudes#DevoxxSystemD Démarrage
  21. @Jean_Eudes#DevoxxSystemD Améliorer la vitesse de démarrage • Paralléliser le démarrage des services • Démarrer moins de services
  22. @Jean_Eudes#DevoxxSystemD Gérer les dépendances entre services
  23. @Jean_Eudes#DevoxxSystemD Est ce vraiment la bonne solution ?
  24. @Jean_Eudes#DevoxxSystemD Est ce vraiment la bonne solution ?
  25. @Jean_Eudes#DevoxxSystemD Une autre alternative • Supprimer la dépendance au service • Dépendre uniquement de la socket
  26. @Jean_Eudes#DevoxxSystemD Comment suivre les processus : cgroup • Regrouper des processus • Contrôler l'usage des ressources matériels • Comptabiliser les ressources utilisées
  27. @Jean_Eudes#DevoxxSystemD Gestion des logs • Un nouvel outil : journald • Récupérer facilement les logs des services • Requêter plus facilement les logs • zip, rotation, ...
  28. @Jean_Eudes#DevoxxSystemD All is Unit • Un service : unit • Monter un système de fichier : unit • Créer une socket : unit • Créer un cron : unit • ...
  29. @YourTwitterHandle@YourTwitterHandle @Jean_eudes#DevoxxSystemD La boîte à outil systemD
  30. @Jean_Eudes#DevoxxSystemD Gérer les services $ systemctl
  31. @Jean_Eudes#DevoxxSystemD Connaître la liste des services actifs $ systemctl list-units -t service
  32. @Jean_Eudes#DevoxxSystemD Connaître la liste de tous les services $ systemctl list-units -t service --all
  33. @Jean_Eudes#DevoxxSystemD Gestion des unités $ systemctl start <unit> $ systemctl stop <unit> $ systemctl restart <unit> $ systemctl reload <unit>
  34. @Jean_Eudes#DevoxxSystemD activer une unité au démarrage $ systemctl enable <unit> $ systemctl disable <unit>
  35. @Jean_Eudes#DevoxxSystemD Mask une unité $ systemctl mask <unit> $ systemctl unmask <unit>
  36. @Jean_Eudes#DevoxxSystemD Lire les logs $ journalctl
  37. @Jean_Eudes#DevoxxSystemD Lire les logs pour un service donné $ journalctl -u sshd
  38. @Jean_Eudes#DevoxxSystemD Lire les logs pour un pid donné $ journalctl _PID=1
  39. @Jean_Eudes#DevoxxSystemD Lire les logs de la dernière heure $ journalctl --since="2015-04-10 13:30:00"
  40. @Jean_Eudes#DevoxxSystemD Lire les logs de l'avant dernière heure journalctl --since="2015-04-10 12:30:00" -until="2015-04-10 13:30:00"
  41. @Jean_Eudes#DevoxxSystemD De très nombreux critères de recherches • service • date • utilisateur, groupe • ...
  42. @Jean_Eudes#DevoxxSystemD Des formats d'export • texte • json
  43. @YourTwitterHandle@YourTwitterHandle @Jean_eudes#DevoxxSystemD Les scripts systemD
  44. @Jean_Eudes#DevoxxSystemD Version SystemV . /lib/lsb/init-functions NAME=cocktail EXEC=$CATALINA_HOME/bin/startup.sh PIDFILE=$CATALINA_BASE/logs/cocktail.pid export CATALINA_PID=$PIDFILE do_start() { start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $EXEC -c tomcat } do_stop() { start-stop-daemon --stop --quiet --retry=TERM/30/KILL/5 --pidfile $PIDFILE rm -f $PIDFILE } do_status() { status_of_proc -p $PIDFILE $EXEC $NAME && exit 0 || exit $? }
  45. @Jean_Eudes#DevoxxSystemD Un exemple Simple [Unit] Description=Ma super application en node [Service] ExecStart=/opt/nodejs/bin/node /var/www/myApp/main.js $ systemctl start monAppli.service
  46. @Jean_Eudes#DevoxxSystemD Activation en service [Unit] Description=Ma super application en node [Service] ExecStart=/opt/nodejs/bin/node /var/www/myApp/main.js [Install] WantedBy=multi-user.target $ systemctl enable monAppli
  47. @Jean_Eudes#DevoxxSystemD Redémarrage automatique [Unit] Description=Ma super application en node [Service] ExecStart=/opt/nodejs/bin/node /var/www/myApp/main.js Restart=Always [Install] WantedBy=multi-user.target
  48. @Jean_Eudes#DevoxxSystemD Redémarrage automatique • Les autres options : • no (par défaut) • always • on-success • on-abort • on-abnormal
  49. @Jean_Eudes#DevoxxSystemD Redémarrage automatique • Définir un laps de temps : RestartSec • 100 ms par défaut
  50. @Jean_Eudes#DevoxxSystemD Passons en mode production [Unit] Description=Ma super application en node [Service] ExecStart=/opt/nodejs/bin/node /var/www/myApp/main.js Restart=Always Environnement=NODE_ENV=production [Install] WantedBy=multi-user.target
  51. @Jean_Eudes#DevoxxSystemD Les variables d'environnement • Utiliser un fichier : EnvironmentFile
  52. @Jean_Eudes#DevoxxSystemD Récupérons les logs [Unit] Description=Ma super application en node [Service] ExecStart=/opt/nodejs/bin/node /var/www/myApp/main.js Restart=Always StandardOutput=journal Environnement=NODE_ENV=production [Install] WantedBy=multi-user.target
  53. @Jean_Eudes#DevoxxSystemD Récupérons les logs • Les autres options : • null • tty • journal • Syslog • journal+console, syslog+console • inherit
  54. @Jean_Eudes#DevoxxSystemD Récupérons les logs • On a la même option pour la sortie d'erreur : StandardError
  55. @Jean_Eudes#DevoxxSystemD Utilisation d'un user non root [Unit] Description=Ma super application en node [Service] ExecStart=/opt/nodejs/bin/node /var/www/myApp/main.js Restart=Always StandardOutput=journal User=nobody Group=nobody Environnement=NODE_ENV=production [Install] WantedBy=multi-user.target
  56. @Jean_Eudes#DevoxxSystemD Utilisons chroot [Unit] Description=Ma super application en node [Service] ExecStart=/nodejs/bin/node /www/myApp/main.js Restart=Always StandardOutput=journal User=nobody Group=nobody RootDirectory=/opt/myApp/ Environnement=NODE_ENV=production [Install] WantedBy=multi-user.target
  57. @Jean_Eudes#DevoxxSystemD Comment arrêter mon service $ systemctl stop monAppli
  58. @Jean_Eudes#DevoxxSystemD Comment arrêter mon service • Définir une commande ExecStop • Sinon kill par défaut • Tue l'ensemble des processus généré par le processus parent
  59. @Jean_Eudes#DevoxxSystemD Essayons avec un tomcat [Unit] Description=Ma super application en Java [Service] Type=forking PIDFile=/var/run/tomcat.pid Environnement=CATALINA_PID=/var/run/tomcat.pid ExecStart=/usr/bin/tomcat start [Install] WantedBy=multi-user.target
  60. @Jean_Eudes#DevoxxSystemD Les autres valeurs de Type • simple (valeur par défaut) • forking • oneshot • dbus, notify, idle
  61. @Jean_Eudes#DevoxxSystemD Essayons avec un docker [Unit] Description=Ma super application sous docker [Service] ExecStart=/usr/bin/docker run --name busybox1 busybox /bin/sh -c "while true; do echo Hello World; sleep 1; done" [Install] WantedBy=multi-user.target
  62. @Jean_Eudes#DevoxxSystemD Essayons avec un docker [Unit] Description=Ma super application sous docker After=docker.socket Requires=docker.socket [Service] ExecStart=/usr/bin/docker run --name busybox1 busybox /bin/sh -c "while true; do echo Hello World; sleep 1; done" [Install] WantedBy=multi-user.target Dépendance vers docker
  63. @Jean_Eudes#DevoxxSystemD Gestion des dépendances • Requires,Wants • Before, After $ systemctl list-dependencies busybox1
  64. @Jean_Eudes#DevoxxSystemD Des listeners ? [Unit] Description=Ma super application sous docker After=docker.service Requires=docker.service [Service] ExecStartPre=/usr/bin/docker kill busybox1 ExecStartPre=/usr/bin/docker rm busybox1 ExecStartPre=/usr/bin/docker pull busybox ExecStart=/usr/bin/docker run --name busybox1 busybox /bin/sh -c "while true; do echo Hello World; sleep 1; done" [Install] WantedBy=multi-user.target
  65. @Jean_Eudes#DevoxxSystemD Des listeners ? • ExecStartPre • ExecStartPost • ExecStopPost
  66. @Jean_Eudes#DevoxxSystemD Mais encore, • Démarrer une socket (System.inheritedChannel()) • Monter un système de fichier • Démarrer des cron • Lancer des containers (machinectl)
  67. @Jean_Eudes#DevoxxSystemD Pour aller plus loin • man • http://0pointer.de/blog/projects/systemd.html (lennart) • http://www.freedesktop.org/wiki/Software/systemd/
  68. @Jean_Eudes#DevoxxSystemD Summary
  69. @Jean_Eudes#DevoxxSystemD Q & A
Publicité