#jinja2: comment_start_string:'{=#', comment_end_string:'#=}' #!/bin/bash # (Le gabarit redefinit le delimiteur de commentaire Jinja : `${#tableau[@]}` contient # la sequence `{#`, que Jinja lirait comme un debut de commentaire. Le shell en a # besoin ; c'est donc a Jinja de s'ecarter.) # GENERE par Set-OPS (role serveur_ops). Ne pas editer a la main. # # SONDE « runner » — depots propres sur leur branche, et Ansible repond # # Contrat : docs/supervision-conception.md (API des greffons Nagios) — une ligne, 0/1/2. # Mise en defaut PAR PARAMETRE : `serveur_ops_sonde_venv` (chemin inexistant). set -uo pipefail VENV={{ serveur_ops_sonde_venv }} BRANCHE={{ serveur_ops_sonde_branche }} # La branche ATTENDUE de chaque depot, telle que le plan la declare. Un depot absent de # cette table retombe sur `BRANCHE` — c'est le cas de ceux qui ne declarent rien. declare -A BRANCHES=( {% for _d, _b in (serveur_ops_sonde_branches | default({})).items() %} ["{{ _d }}"]="{{ _b }}" {% endfor %} ) RACINE={{ serveur_ops_sonde_racine }} # `safe.directory` : les depots appartiennent au compte d'exploitation, la sonde tourne en # root. Sans cela git refuse — « proprietaire douteux » — et la sonde rendrait un echec # qui parle de git au lieu de parler du depot. git_() { git -c safe.directory='*' -C "$1" "${@:2}" 2>/dev/null; } ennuis=(); n=0 for d in "${RACINE}"/*/; do [[ -d "${d}.git" ]] || continue n=$((n+1)); nom=$(basename "${d}") b=$(git_ "${d}" rev-parse --abbrev-ref HEAD) attendue="${BRANCHES[${nom}]:-${BRANCHE}}" [[ "${b}" == "${attendue}" ]] || ennuis+=("${nom} sur « ${b:-?} » au lieu de « ${attendue} »") # UN DEPOT SALE SUR LE RUNNER EST UNE DIVERGENCE SILENCIEUSE : ce qui s'applique a la # flotte n'est plus ce que le depot contient, et personne ne le sait. [[ -z "$(git_ "${d}" status --porcelain)" ]] || ennuis+=("${nom} MODIFIE localement") done (( n > 0 )) || { echo "Aucun depot sous ${RACINE} — le runner n'a rien a appliquer."; exit 2; } v=$("${VENV}/bin/ansible" --version 2>/dev/null | head -1) [[ -n "${v}" ]] || { echo "Ansible ne repond pas dans ${VENV} — le runner ne peut rien appliquer."; exit 2; } if (( ${#ennuis[@]} > 0 )); then echo "Runner : ${ennuis[*]} — ce qui s'applique diverge du depot.|depots=${n}" exit 2 fi echo "Runner : ${n} depot(s) propres sur leur branche declaree, ${v}.|depots=${n}"