Le blog tech de Nicolas Steinmetz (Time Series, IoT, Web, Ops, Data)
mysql_secure_installation
, voici enfin la réponse. Sur les nouvelles installations, l’accès au compte root de mariadb est protégé. Il faut passer par sudo mysql -u root -p ...
par ex pour pouvoir se connecter en root.TLS-SNI
. Avec le partage d’une même IP, il serait possible pour une personne malveillante de récupérer un certificat pour votre domaine à votre insu. Let’s Encrypt a finalement décidé de désactiver complètement les méthodes TLS-SNI-001
et TLS-SNI-002
et de travailler sur une nouvelle méthode TLS-SNI-003
qui corrigerait ce problème. En attendant, il faut utiliser les méthodes HTTP-01
ou DNS-01
.La commande docker history
(ou docker image history
) permet de voir le nombre de layers d’une image, la taille de ces layers et leur âge. Exemple avec l’image nginx:stable
:
docker image history nginx:stable
IMAGE CREATED CREATED BY SIZE COMMENT
dfe062ee1dc8 6 weeks ago /bin/sh -c #(nop) CMD ["nginx" "-g" "daemon… 0B
<missing> 6 weeks ago /bin/sh -c #(nop) STOPSIGNAL [SIGTERM] 0B
<missing> 6 weeks ago /bin/sh -c #(nop) EXPOSE 80/tcp 0B
<missing> 6 weeks ago /bin/sh -c ln -sf /dev/stdout /var/log/nginx… 22B
<missing> 6 weeks ago /bin/sh -c set -x && apt-get update && apt… 53.1MB
<missing> 6 weeks ago /bin/sh -c #(nop) ENV NJS_VERSION=1.12.2.0.… 0B
<missing> 6 weeks ago /bin/sh -c #(nop) ENV NGINX_VERSION=1.12.2-… 0B
<missing> 6 weeks ago /bin/sh -c #(nop) LABEL maintainer=NGINX Do… 0B
<missing> 6 weeks ago /bin/sh -c #(nop) CMD ["bash"] 0B
<missing> 6 weeks ago /bin/sh -c #(nop) ADD file:f30a8b5b7cdc9ba33… 55.3MB
Pour avoir l’intégralité du contenu de la ligne “CREATED BY”, il suffit de rajouter un --no-trunc
.
Source : Docker - history
C’est assez pratique lorsque l’on cherche notamment à comprendre et optimiser la taille de ses images Docker.
Il fut un temps où pour programmer le lancement des actions, notre meilleur ami était “cron” et la “crontab”. Outre la syntaxe et l’organisation de la crontab peu mémorisable, les tâches cron restaient complexes à déployer et à monitorer dans leur exécution. Si le fait d’avoir des répertoires plus génériques comme /etc/cron.{d,hourly,daily,weekly,monthly}
ont un peu amélioré la partie exploitabilité/déployabilité, ils offraient assez peu de souplesses pour une plannification fine des tâches. De nombreux serveurs ont donc eu un mix de crontab classique et de ce format pendant des années.
Debian 9.0 (mais d’autres aussi comme Archlinux par ex) a fait le choix dans le cadre de son adoption de systemd de ne plus proposer un logiciel de type cron mais de s’appuyer sur l’implémentation interne à systemd, à savoir les “timers”. C’est une unité (unit) spéciale de systemd qui est controllée et supervisée par systemd et qui s’exécute selon une configuration temporelle donnée.
Voyons comment passer de cette crontab :
0 4 * * * /path/to/scripts/backup.sh >> /var/log/backup.log 2>&1
… ou de /etc/cron.daily/mybackup.sh
appelant le même script à son équivalent sous un timer systemd.
Si vous gérez déjà vos services via systemd, vous avez déjà utilisé des “unit” systemd de type “service”. Ces “unit” permettent de définir un process et son mode d’éxécution.
Pour implémenter un “timer” sous systemd, il va nous falloir un fichier “service”.
Pour notre tâche à planifier, nous allons avoir au final 3 fichiers :
/path/to/scripts/backup.sh
; il est inchangé par rapport à précédemment.A noter que par convention, les fichiers service et timer doivent avoir le même nom (foo.service
, foo.timer
).
Pour le fichier service, une base simple est la suivante :
/etc/systemd/system/mybackup.service
:
[Unit]
Description=My Daily Backup
[Service]
Type=simple
ExecStart=/path/to/scripts/backup.sh
StandardError=journal
Je fournis une description à mon service, indique que c’est un process de type simple, le chemin vers mon script et je rajoute que le flux d’erreur est envoyé dans le journal. Pour plus d’information, se reporter à la doc des services et des exécutions.
Attention néanmoins, il ne faut pas de section [Install]
car le script va être piloté par le fichier timer.
Ensuite, il nous faut un fichier “timer” :
/etc/systemd/system/mybackup.timer
:
[Unit]
Description=My Daily Backup
[Timer]
# Define a calendar event (see `man systemd.time`)
OnCalendar=daily
Persistent=true
[Install]
WantedBy=timers.target
Au-delà de la description, les lignes importantes sont la section [Timer]
et [Install]
:
OnCalendar
permet d’indiquer l’occurrence et la fréquence d’exécution du script. Il y a les abréviations classiques (daily, weekly, etc) mais vous pouvez avoir des choses plus complexes comme "Mon,Tue *-*-01..04 12:00:00"
- voir systemd.timePersistent
va forcer l’exécution du script si la dernière exécution a été manquée suite à un reboot de serveur ou autre événement.Il ne reste plus qu’à activer le timer et le démarrer :
systemctl enable mybackup.timer
systemctl start mybackup.timer
Pour voir la liste des “timers” actifs sur votre serveur, la date de leur dernière et prochaine exécution :
systemctl list-timers
NEXT LEFT LAST PASSED UNIT ACTIVATES
Mon 2018-01-29 17:25:59 CET 2h 27min left Sun 2018-01-28 22:20:35 CET 16h ago apt-daily.timer apt-daily.service
Tue 2018-01-30 06:36:33 CET 15h left Mon 2018-01-29 06:37:35 CET 8h ago apt-daily-upgrade.timer apt-daily-upgrade.service
Tue 2018-01-30 09:25:48 CET 18h left Mon 2018-01-29 09:25:48 CET 5h 33min ago systemd-tmpfiles-clean.timer systemd-tmpfiles-clean.service
et accéder aux logs de vos “timers” :
journalctl -f -u apt-daily
-- Logs begin at Tue 2018-01-23 13:50:12 CET. --
Jan 28 22:20:35 codb2d9 systemd[1]: Starting Daily apt download activities...
Jan 28 22:20:35 codb2d9 systemd[1]: Started Daily apt download activities.
En cas de modification du .timer
ou du .service
, ne pas oublier de faire un system daemon-reload
pour que la version actualisée de vos fichiers soit prise en compte par systemd.
Passé la petite prise en main de ce nouveau cadre d’exécution, elle me semble plus simple et surtout plus facile à intégrer dans des chaines de déploiements pilotées par Ansible ou autre.
Rien de tel que la finalisation du bilan de cette première année d’activité pour faire un petit bilan sur l’année écoulée et les perspectives pour 2018.
Il est positif, tant d’un point de vue comptable que d’activité.
D’un point de vue comptable, cela donne :
C’est clairement un succès. En reprenant mes prévisions et hypothèses d’activité de début d’année dernière, je suis dans la fourchette haute.
D’un point de vue activité, c’est plus contrasté :
Un autre objectif que je m’étais donné en démarrant cette aventure était de contribuer en retour aux communautés Open Source. Profitant de l’écosystème open source, il est de notre devoir d’entreprise de contribuer à cet écosystème. Ce fut chose faite avec le sponsoring (modeste) des Rencontres Django à Toulon et ma partipation à l’édition 2017 de Codeurs En Seine où j’ai pu parler de la plateforme TICK et de Grafana.
Au final, une année riche en enseignements à de multiples niveaux (personnel, professionel, gestion d’une entreprise, etc)
2018 commence bien avec une première mission intéressante et des sujets en cours de réflexion. Voici quelques objectifs que je me suis fixé :
Pour atteindre ces objectifs, il y a quelques pistes :
Si certains sujets vous interpellent ou si vous avez des contacts à me suggérer, n’hésitez pas à me contacter.
Comme il est encore temps, j’en profite pour vous souhaiter à tou(te)s une bonne année 2018 et au plaisir de vous rencontrer, voire de collaborer ensemble.
Il ne me reste plus qu’à vous souhaiter de bonnes fêtes de fin d’année et à vous retrouver l’année prochaine pour de nouvelles aventures.
EXPLAIN
& SHOW CARDINALITY
), le support des endpoints prometheus en lecture/ecriture, des améliorations sur la compaction ainsi que le serveur http et le client (gestion des connexions). D’autres fonctionnalités plus expérimentales sont aussi disponibles.select(db:"foo")
.where(exp:{"_measurement"=="cpu" AND
"_field"=="usage_system" AND
"service"=="app-server"})
.range(start:-12h)
.window(every:10m)
.max()