Les Do-Nothing Scripts : une nouvelle approche pour les procédures manuelles

Je vais vous raconter une histoire...
...une histoire qui remonte à 2019

Gandalf qui fume la pipe
portrait de Maxime

🦩 Maxime Dupont 🦩

OVHcloud, Alternatiba, Shifters

svelte, écologie, plantes

maximedupont.fr - m.dupont103@gmail.com

L'historique

  • 2019 - article de blog
  • 2019 - partage sur Y Combinator News (124 📜)
  • 2021 - partage sur Y Combinator News (230 📜)
  • 2025 - partage sur Y Combinator News (137 📜)

Le problème

Certaines taches demandent beaucoup d'attention, mais très peu de réflexion. Elles exigent toute notre attention, mais notre attention n'est pas récompensée par des problèmes intéressants ou des solutions satisfaisantes.

L'exemple

  1. Créez une paire de clés SSH pour l'utilisateur.
  2. Commiter la clé sur Github et pousser sur le repo distant.
  3. Attendre que le build soit terminé.
  4. Trouver l'adresse électronique de l'utilisateur dans le LDAP.
  5. Envoyez à l'utilisateur sa clé privée via 1Password.
very surprised pikachu

L'exemple

  1. Créez une paire de clés SSH pour l'utilisateur.
  2. Commiter la clé sur Github et pousser sur le repo distant.
  3. Attendre que le build soit terminé.
  4. Trouver l'adresse électronique de l'utilisateur dans le LDAP.
  5. Envoyez à l'utilisateur sa clé privée via 1Password.

La (mauvaise) idée

Automatiser complètement la procédure

Les inconvénients :

  • Long à faire pour le gain de temps
  • Ne supprimerait pas complètement les tâches manuelles

La (bonne) idée

Automatiser la validation des étapes manuelles

Un script « do-nothing » est un script qui encode les instructions d'une procédure, en encapsulant chaque étape dans une fonction.

La (bonne) idée

			# This script is copied from https://blog.danslimmon.com/2019/07/15/do-nothing-scripting-the-key-to-gradual-automation/
# It is not working, missing raw_input implementation

import sys
 
def wait_for_enter():
    raw_input("Press Enter to continue: ")
 
class CreateSSHKeypairStep(object):
    def run(self, context):
        print("Run:")
        print("   ssh-keygen -t rsa -f ~/{0}".format(context["username"]))
        wait_for_enter()
 
class GitCommitStep(object):
    def run(self, context):
        print("Copy ~/new_key.pub into the \`user_keys\` Git repository, then run:")
        print("    git commit {0}".format(context["username"]))
        print("    git push")
        wait_for_enter()
 
class WaitForBuildStep(object):
    build_url = "http://example.com/builds/user_keys"
    def run(self, context):
        print("Wait for the build job at {0} to finish".format(self.build_url))
        wait_for_enter()
 
class RetrieveUserEmailStep(object):
    dir_url = "http://example.com/directory"
    def run(self, context):
        print("Go to {0}".format(self.dir_url))
        print("Find the email address for user \`{0}\`".format(context["username"]))
        context["email"] = raw_input("Paste the email address and press enter: ")
 
class SendPrivateKeyStep(object):
    def run(self, context):
        print("Go to 1Password")
        print("Paste the contents of ~/new_key into a new document")
        print("Share the document with {0}".format(context["email"]))
        wait_for_enter()
 
if __name__ == "__main__":
    context = {"username": sys.argv[1]}
    
    procedure = [
        CreateSSHKeypairStep(),
        GitCommitStep(),
        WaitForBuildStep(),
        RetrieveUserEmailStep(),
        SendPrivateKeyStep(),
    ]

    for step in procedure:
        step.run(context)

    print("Done.")
		

Les avantages

  • Possible automatisation incrémentale
  • Implémentation d'une librairie d'automatisation
  • Réduit l'énergie nécessaire
  • La procédure est plus sûre
  • Validation que les étapes sont simples
  • Facilite la relecture de code

Les inconvénients

  • Gripper un système
  • La procédure ne peut pas être interrompue
  • Pas de vision d'ensemble / pas d'estimation de durée
  • En cas d'automatisation partielle, le script peut "dérailler"
  • Le script n'est plus suivi dès que maîtrisé alors qu'il peut évoluer
  • Les critères de validation d'une étape ne sont pas explicités
  • Le nom "do nothing script" n'est pas très réaliste

Outils

Pour aller plus loin

Implémentation python avec : workflow markdown, log, chargement de wf en cours

Sources

C'est le moment de poser vos questions ;)