Ansible sous macOS: initializeAfterForkError

En exécutant récemment un script ansible, depuis mon ordinateur de travail, un mac (pour disposer simplement d’une base Linux en entreprise), j’ai rencontré l’erreur suivante :

+[__NSPlaceholderDate initialize] may have been in progress in another thread when fork() was called. We cannot safely call it or ignore it in the fork() child process. Crashing instead. Set a breakpoint on objc_initializeAfterForkError to debug.

Après quelques recherches, il suffit d’ajouter la variable d’environnement OBJC_DISABLE_INITIALIZE_FORK_SAFETY à la valeur YES et de relancer le script, pour que celui-ci se termine correctement.

export OBJC_DISABLE_INITIALIZE_FORK_SAFETY=YES

Source : StackOverflow

Restreindre les actions d’une clé ssh

Petite découverte qui mérite d’être notée, il est possible d’appliquer des restrictions à une clé SSH sur la machine cible. Dans le fichier authorized_keys, on pourra en particulier restreindre la clé à une IP source, une plage d’IP, ou encore un domaine avec le paramètre from (Voir la documentation pour la syntaxe). Le paramètre command, permet quant à lui de restreindre les possibilités d’exécution de commande en forçant l’exécution de la commande configurée une fois l’authentification réussie. Le résultat de la commande est renvoyé en retour immédiat de la commande ssh. Il existe également un certain nombre d’autres options, par exemple no-port-forwarding ou no-x11-forwarding comme précisé dans le manuel. Voir aussi « Configuring authorized_keys for OpenSSH ».

from="192.168.10.42",command="/bin/date",no-port-forwarding,no-x11-forwarding,no-agent-forwarding ssh-rsa xxxx exemple@unicoda.com

Onduleur – Surveillance sur le réseau

Dans un article précédent, nous nous étions quitté avec une connexion directe par USB entre l’une des machines connectée à l’onduleur et l’onduleur lui-même. Aujourd’hui, retour sur la configuration du service de surveillance de l’état de l’onduleur, cette fois pour que la machine connectée partage l’information sur le réseau. Le but étant que les autres machines connectées à l’onduleur soit elles aussi capable de connaître son état, de déclencher un arrêt en cas de batterie faible et ainsi, de pouvoir s’éteindre avant de subir une perte de courant totale.

Je repars ici de ma configuration déjà en place. Comme la première fois, plusieurs fichiers sont à modifier, mais en nombre plus réduit. Je commence par éditer le fichier /etc/nut/upsd.users, sur la machine déjà configurée en mode client et connectée à l’onduleur, pour y ajouter un utilisateur « esclave » qui servira à mon autre ordinateur pour l’authentification des demandes d’état.

[slave]
  password = PASSWORD
  upsmon slave

Je modifie ensuite /etc/nut/upsd.conf pour que le serveur nut soit accessible sur le réseau et non plus seulement en localhost; en considérant que l’IP de ma machine est statique.

LISTEN 192.168.24.42 3493

J’enchaîne ensuite avec /etc/nut/nut.conf, où je précise que nut devra désormais fonctionner en mode serveur.

MODE=netserver

Enfin, pour terminer la configuration de la machine principale, je redémarre ups-monitor et nut-server.

Passons maintenant à la machine cliente, où, après avoir installé nut, je définie la manière dont nut va récupérer les informations d’état de l’onduleur, en modifiant /etc/nut/upsmon.conf. J’utilise ici l’utilisateur « slave » configuré précédemment.

MONITOR eaton@192.168.24.42 1 slave PASSWORD slave

Ensuite, édition du fichier /etc/nut/nut.conf afin de préciser le mode de fonctionnement de nut, à savoir ici, client du réseau.

MODE=netclient

Pour finir sur cette machine cliente, redémarrage de ups-monitor et nut-client.

Dernier point de configuration important, mais non lié à nut, au démarrage, j’ai constaté que nut n’était pas capable d’écouter sur l’IP définie dans la configuration, cela étant due, au fait que la récupération de l’IP était encore en cours d’acquisition (statique côté DHCP), au moment du démarrage de nut. Pour palier au problème, j’ai configuré mon RPI pour attendre la connexion au réseau avant de continuer plus avant dans la procédure de boot. Sur un RPI, la configuration s’effectue comme suit :

  • sudo raspi-config
  • 3 Boot Options
  • B2 Wait for Network at Boot
  • « Yes ».
  • Sauvegarder et quitter.

Une fois ces configurations réalisées sur mes deux machines, je suis en mesure de consulter l’état de l’onduleur sur chacune des machines. Un test d’arrêt forcé, m’a permis de vérifier que l’extinction de la machine cliente a bien lieu avant l’extinction de la machine ayant le rôle de serveur, et de m’assurer que l’ensemble redémarre sans assistance au retour du courant.

Récupération de variables système sur Windows

Aujourd’hui j’ai installé Python et Django sur mon système Windows pour essayer de faire un petit site web rapidement, disons avant la fin de la journée.

Je commence donc ma configuration sur mon système Windows et en parallèle je fais la même chose en SSH sur une console MSYS2,une VM en mode console d’un système linux pour faire simple.

Sur windows je teste alors que sur la console MYSYS je suis connecté à mon serveur dédié de l’autre côté de la France mon serveur de production en quelque sorte.

Arrivé à l’étape d’installation de Django sur mon Windows, j’ai un message qui attire mon attention. Il semblerait qu’il manque un chemin dans PATH.

Pas de soucis. Touche Windows, j’écris « path » et j’appuie sur entrée. Je me retrouve sur les propriétés système.

Un clic de plus sur « Variables d’environnement… » et je me retrouve devant deux choix.

  • Variables utilisateur pour MonOrdinateur
  • Variables système

Dans les deux cas j’ai accès à une variable PATH que je peux modifier. Je ne me pose pas plus de questions et je modifie la variable Path dans variables système et y ajoute mon chemin.

Je valide tout, je suis content, tout va marcher et la commande

django-admin --version

devrait enfin m’afficher quelque chose à l’écran. Mais ce n’est pas le cas…

Je retourne dans les propriétés système et je commence vraiment à avoir peur. Plus aucuns chemins n’est accessible dans la liste PATH des variables système. Je pose la question à mon moteur de recherche qui m’indique qu’une restauration est le seul moyen de retrouver mes données perdues. Mais pour cela, il faut un point de restauration.

Je n’ai pas de point de restauration actif, la protection du système semble désactivée.

Je continue les recherches avec de moins en moins d’espoir de pouvoir redémarrer mon système dans de bonne condition. Pour ce qui ne le savent pas, les variables système dans PATH conditionnent beaucoup de chemins vers des exécutables utiles au bon fonctionnement de votre ordinateur.

Plus d’une heure passe, en désespoir de cause je récupère quelques PATH sur un autre ordinateur et un ami m’envoie les siens, mais je vois bien qu’il n’y a pas tous les chemins que j’avais avant de tout casser.

Quand mes recherches prennent un tournant inattendu. Je trouve enfin quelque chose d’intéressant. On peut exécuter la commande set pour lister et modifier les variables d’environnement et système propre à l’exécution d’un interpréteur de commande (CMD). D’ailleurs si on modifie des chemins dans l’interpréteur et qu’on le quitte, les chemins ajoutés ne sont pas sauvegardés. De la même manière si j’ai modifié les variables PATH par l’interface graphique sans relancer l’interpréteur celui-ci connait encore les anciennes valeurs de PATH.

J’ai un sursaut d’excitation. Est-ce que j’ai encore une CMD ouverte ?

Malheureursment non. Je n’ai plus aucune CMD ouvertes dans la barre des tâches. Par contre il y a toujours MYSYS ouvert avec une connexion SSH en cours vers mon serveur.

Se pourrait-il que j’avais la solution pour récupérer mes variables système PATH sous les yeux depuis le début ?

Après avoir mis fin à la connexion ssh avec le serveur. Le verdict. Je tape au hasard la commande Windows « SET » dans l’interpréteur MYSYS Linux. Un résultat ! Peut être que j’ai de la chance après tout ? Je fracasse la molette pour remonter rapidement tout en haut de la sortie affichée, quand enfin j’ai ce que je cherchais !

Toutes mes variables PATH gardées en mémoire par MSYS2. Avec pour seul inconvénient un typage Unix et non Windows. Dix minutes plus tard j’ai mes variables système PATH d’origine. Et en bonus, j’ai même compris mon erreur. J’aurais du mettre mon chemin dans les variables utilisateur et vérifier qu’il était bien écrit. En plus j’aurais pu tester que tout fonctionne en le faisant avec la commande set en console avant de faire la modification réel.

Conclusion

Si vous perdez toutes vos variables système ou variables utilisateur sur Windows vous pouvez les récupérer en dernier recours si il vous reste une console ouverte avant la réalisation des modifications qui ont détruits vos chemins. Pour les trouver il suffit de taper la commande « set » ou « path » dans cette console et de récupérer et mettre en forme les chemins, puis de les réinsérer par l’interface graphique dans PATH en vérifiant si ce sont des variables utilisateur ou système.

Pour la petite astuce, ne faites pas comme moi et pensez à faire des points de restauration système réguliers.

Onduleur – Nut en client direct

Il y a de cela quelques semaines, j’ai fait l’acquisition d’une pièce manquante de mon réseau interne, à savoir: un onduleur. Je n’avais pas, jusqu’à présent, considéré cet élément comme indispensable, mais la perspective d’un déplacement professionnel de plus d’une dizaine de jours m’a poussé à l’achat. J’espère ainsi protéger mes services auto-hébergés d’une éventuelle coupure de courant.

Une coupure de courant reste un événement relativement exceptionnel, du moins dans mon environnement géographique, puisqu’après plusieurs années d’auto-hébergement, je n’ai jamais eu d’arrêt de service provoqué par un défaut d’alimentation. Après avoir considéré ces facteurs, un onduleur a donc trouvé sa place dans mon logement, à proximité du routeur, du switch, etc… N’ayant pas noté d’interruption de service durant mon déplacement, je peux en déduire que l’onduleur a rempli son rôle…, ou que le réseau électrique est resté stable, comme à son habitude.

Bref, après m’être contenté du raccordement électrique des périphériques à l’onduleur, je me suis intéressé à la configuration d’un service de surveillance de l’état de l’onduleur. Le but étant de détecter un état de batterie faible subséquent à une coupure de courant, et d’être ainsi en mesure de procéder proprement et automatiquement à l’extinction des composants critiques du réseau, serveurs et routeur en particulier.

Voici donc, à la suite, la configuration déployée sur la machine chargée de la surveillance de l’onduleur. Les deux éléments sont connectés via le cable USB fournit avec l’onduleur. Une dernière chose, mon onduleur est de marque Eaton. Entrons maintenant dans le vif du sujet.

Après avoir connecté l’onduleur, un petit tour du côté du contenu de dmesg, me permet de vérifier que celui-ci est détecté. Je procède également à l’installation de nut via aptitude install nut.

[238029.826593] hid-generic 0003:0463:FFFF.0001: hiddev96,hidraw0: USB HID v1.10 Device [EATON Ellipse PRO] on usb-3f980000.usb-1.5/input0

Avant d’aller plus loin et pour pouvoir commencer à configurer nut, il est nécessaire de déterminer le driver à utiliser pour l’onduleur. Pour trouver cette information, il est conseillé de s’aider de la page « Hardware compatibility list« . Pour ma part, je n’ai pas trouvé mon modèle dans la liste (Eaton Ellipse Pro), mais les modèles présents les plus récents et les plus proches de la gamme « Ellipse Pro », indiquent de choisir usbhid-ups.

Munis de cette information, je peux donc passer à l’édition du fichier /etc/nut/ups.conf, afin de déclarer l’onduleur dans nut.

[nom_onduleur]
        driver = usbhid-ups
        port = auto
        desc = "EATON UPS"

A ce stade, il est déjà possible d’effectuer un premier test de fonctionnement.

$ sudo upsdrvctl start
Network UPS Tools - UPS driver controller 2.7.4
Network UPS Tools - Generic HID driver 0.41 (2.7.4)
USB communication driver 0.33
Using subdriver: MGE HID 1.39

Après avoir vérifié avec la commande ci-dessus que notre déclaration de l’onduleur est correct, c’est-à-dire, que nut communique bien avec l’onduleur, je passe à l’édition du fichier /etc/nut/upsd.conf, afin de n’autoriser que les connexions provenant de la machine locale.

LISTEN 127.0.0.1

Il convient ensuite de définir un utilisateur qui sera ensuite autorisé à accéder à l’état de l’onduleur. Cette fois, les modifications sont apportées au fichier /etc/nut/upsd.users.

[nom_utilisateur]
     password = PASSWORD_HERE
     upsmon master

Pour la suite, je modifie /etc/nut/upsmon.conf, pour configurer la surveillance de l’onduleur. A noter qu’il est possible de configurer la commande d’extinction, en modifiant la propriété SHUTDOWNCMD. J’ai de mon côté configuré la propriété NOTIFYCMD, en précisant le chemin vers un script relativement simple ayant pour rôle de m’envoyer un mail pour les événements ONLINE, ONBATT et LOWBATT, comme l’indique la présence de l’instruction EXEC pour chacune des trois lignes NOTIFYFLAG.

MONITOR nom_onduleur@localhost 1 nom_utilisateur PASSWORD_HERE master

NOTIFYCMD /path/to/script/notif-ups.sh
NOTIFYFLAG ONLINE       EXEC+SYSLOG+WALL
NOTIFYFLAG ONBATT       EXEC+SYSLOG+WALL
NOTIFYFLAG LOWBATT      EXEC+SYSLOG+WALL

Enfin, le dernier fichier à modifier est /etc/nut/nut.conf, pour déterminer le mode de fonctionnement de nut. L’utilisation se limitant à une seule machine pour le moment, j’utilise donc le mode client seul.

MODE=standalone

Maintenant que l’ensemble est configuré, il est possible de récupérer les informations de l’onduleur par appel à la commande upsc nom_onduleur@localhost. Ayant réussi à obtenir les informations d’état de l’onduleur, il reste à effectuer un dernier test, en simulant une situation nécessitant l’arrêt de la machine connectée à l’onduleur.

sudo upsmon -c fsd

La demande d’exécution de l’arrêt forcé est particulièrement intéressante, puisqu’elle m’a permit de vérifier la bonne extinction de la machine surveillant l’onduleur. J’ai été un peu surpris, car l’onduleur, simule également une coupure complète et un retour du courant sur toutes les prises. Quelques appareils ont donc subi un arrêt un peu rude, mais cela m’a permis de vérifier que tout le système est capable de revenir à un fonctionnement normal automatiquement.

Il faudra néanmoins que je prévois un test de coupure complète en débranchant l’onduleur, afin de tester le comportement de l’ensemble dans cette situation. Par ailleurs, il me reste à modifier cette configuration de surveillance de l’onduleur, afin de passer à un modèle client-serveur et d’être en mesure de partager les informations d’état avec les autres composants branchés à l’onduleur et que ces derniers soient en mesure de déclencher leur arrêt avant une coupure totale du courant.

Source :