Le deploiement de Chezlepro depuis son propre runner a franchi le socle et le
durcissement sur les quinze machines, et s est arrete sur une seule :
infra-pki-01 : Echec temporaire dans la resolution du nom
url: https://packages.smallstep.com/keys/apt/repo-signing-key.gpg
UN TENANT N A PAS DE DNS SORTANT, ET C EST VOULU. Il resout chez lui, sa requete ne
traverse jamais la frontiere. apt s en sort par le mandataire du cache, qui resout a
sa place ; get_url n a pas de mandataire. Mesure sur la machine : DNS bloque, 443
sortant OK par adresse, apt via le cache OK.
Les cinq reprises du role ne pouvaient rien : elles etaient ecrites pour un serveur
INTERMITTENT (2026-08-23), pas pour une resolution fermee. Une reprise ne repare que
ce qui est passager.
UNE DETTE NOMMEE, APPELEE. client_artefacts le disait : les depots tiers en HTTPS
vont en direct, la seconde voie est propre et RESTE A FAIRE. Elle a ete appelee le
jour ou un ecosysteme s est reconstruit derriere une frontiere qui fait son travail.
La cle est versionnee, avec son empreinte et sa procedure de rafraichissement. Meme
idiome que les collections et les roues : le depot porte, la cible n ouvre rien.
C est ce qui rend une lignee reproductible SANS INTERNET.
Cout ecrit : une rotation amont n est plus recuperee toute seule, mais elle ne passe
pas inapercue — apt refuse alors le depot, bruyamment.
TROUVE EN LA RECUPERANT : l URL publique REDIRIGE vers pkgs.infra.smallstep.com.
Sans suivre les redirections on obtient un fichier VIDE, et curl -f sans -L sort en
succes. La procedure le dit, parce que ce piege ne se voit qu au deploiement suivant.
Le correctif du pare-feu a tenu : plus une seule suspension, quinze machines a
ok=66 et 0 unreachable.
make verifier : vert. make prouver : CONFORME, 55 OK, 0 echec, 0 saute.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019f91zs9SDdwSzL2CVei6on
140 lines
5.2 KiB
YAML
140 lines
5.2 KiB
YAML
---
|
|
- name: Exiger les secrets de l'AC (Vault)
|
|
ansible.builtin.assert:
|
|
that:
|
|
- serveur_step_ca_password | length > 0
|
|
- serveur_step_ca_provisioner_password | length > 0
|
|
fail_msg: >-
|
|
serveur_step_ca_password et serveur_step_ca_provisioner_password
|
|
sont requis (a fournir via Ansible Vault).
|
|
|
|
- name: Assurer le repertoire des trousseaux apt
|
|
ansible.builtin.file:
|
|
path: /etc/apt/keyrings
|
|
state: directory
|
|
owner: root
|
|
group: root
|
|
mode: "0755"
|
|
|
|
# LA GARDE « RECUPEREE UNE FOIS » A DISPARU AVEC CE QU'ELLE GARDAIT (2026-08-30).
|
|
#
|
|
# Elle evitait de recontacter le fournisseur a chaque passage — soixante-dix allers-retours
|
|
# externes pour des cles deja installees (arbitrage du 2026-08-09). La cle etant desormais
|
|
# VERSIONNEE, il n'y a plus d'aller-retour a eviter : `copy` ne sort pas, et son
|
|
# idempotence vient de la comparaison d'empreintes, pas d'un `stat` qu'on ecrit soi-meme.
|
|
#
|
|
# Le meme arbitrage est donc honore plus completement : la plateforme ne depend plus du
|
|
# tout de serveurs etrangers pour redeployer ce qu'elle possede deja.
|
|
|
|
# LA CLE DE SIGNATURE EST VERSIONNEE, PLUS TELECHARGEE (2026-08-30).
|
|
#
|
|
# Elle etait tiree de `packages.smallstep.com` par son NOM. Un tenant n'a pas de DNS
|
|
# sortant — il resout chez lui, sa requete ne traverse jamais la frontiere — et
|
|
# `get_url` n'a pas de mandataire, la ou `apt` s'en sort par le cache qui resout a sa
|
|
# place. Mesure sur `infra-pki-01`, premiere machine a porter l'autorite de Chezlepro :
|
|
#
|
|
# Request failed: <urlopen error [Errno -3] Echec temporaire dans la resolution du nom>
|
|
#
|
|
# Les cinq reprises de l'ancienne version ne pouvaient rien : elles etaient ecrites pour
|
|
# un serveur INTERMITTENT (mesure du 2026-08-23), pas pour une resolution fermee. Une
|
|
# reprise ne repare que ce qui est passager.
|
|
#
|
|
# MEME IDIOME QUE LES COLLECTIONS ET LES ROUES : le depot porte, la cible n'ouvre rien.
|
|
# C'est ce qui rend une lignee reproductible sans Internet. Empreinte, raison et
|
|
# procedure de mise a jour dans `files/README-cle-smallstep.md`.
|
|
#
|
|
# `serveur_step_ca_depot_cle_url` reste declaree : elle documente la provenance et sert
|
|
# a rafraichir le fichier depuis un poste qui a le DNS. Elle n'est plus lue au deploiement.
|
|
- name: Poser la cle de signature Smallstep (versionnee, aucun appel sortant)
|
|
ansible.builtin.copy:
|
|
src: smallstep-repo-signing-key.asc
|
|
dest: "{{ serveur_step_ca_depot_cle_fichier }}"
|
|
owner: root
|
|
group: root
|
|
mode: "0644"
|
|
|
|
- name: Ajouter le depot apt Smallstep
|
|
ansible.builtin.template:
|
|
src: smallstep.sources.j2
|
|
dest: /etc/apt/sources.list.d/smallstep.sources
|
|
owner: root
|
|
group: root
|
|
mode: "0644"
|
|
|
|
- name: Installer step-ca et step-cli
|
|
when: not ansible_check_mode # dry-run : le depot Smallstep n'est pas reellement ajoute
|
|
ansible.builtin.apt:
|
|
name: "{{ serveur_step_ca_paquets }}"
|
|
state: present
|
|
update_cache: true
|
|
|
|
- name: Creer l'utilisateur systeme step
|
|
ansible.builtin.user:
|
|
name: "{{ serveur_step_ca_utilisateur }}"
|
|
system: true
|
|
home: "{{ serveur_step_ca_steppath }}"
|
|
create_home: false
|
|
shell: /usr/sbin/nologin
|
|
|
|
- name: Creer le repertoire STEPPATH
|
|
ansible.builtin.file:
|
|
path: "{{ serveur_step_ca_steppath }}"
|
|
state: directory
|
|
owner: "{{ serveur_step_ca_utilisateur }}"
|
|
group: "{{ serveur_step_ca_utilisateur }}"
|
|
mode: "0700"
|
|
|
|
- name: Deployer le mot de passe de l'AC
|
|
ansible.builtin.copy:
|
|
content: "{{ serveur_step_ca_password }}"
|
|
dest: "{{ serveur_step_ca_steppath }}/password.txt"
|
|
owner: "{{ serveur_step_ca_utilisateur }}"
|
|
group: "{{ serveur_step_ca_utilisateur }}"
|
|
mode: "0600"
|
|
no_log: true
|
|
notify: Redemarrer step-ca
|
|
|
|
- name: Deployer le mot de passe du provisioner
|
|
ansible.builtin.copy:
|
|
content: "{{ serveur_step_ca_provisioner_password }}"
|
|
dest: "{{ serveur_step_ca_steppath }}/provisioner_password.txt"
|
|
owner: "{{ serveur_step_ca_utilisateur }}"
|
|
group: "{{ serveur_step_ca_utilisateur }}"
|
|
mode: "0600"
|
|
no_log: true
|
|
|
|
- name: Initialiser l'autorite de certification (une seule fois)
|
|
when: not ansible_check_mode # dry-run : le binaire step n'est pas encore installe
|
|
ansible.builtin.command:
|
|
cmd: >-
|
|
step ca init
|
|
--deployment-type standalone
|
|
--name "{{ serveur_step_ca_nom }}"
|
|
--dns "{{ serveur_step_ca_dns }}"
|
|
--address "{{ serveur_step_ca_adresse }}"
|
|
--provisioner "{{ serveur_step_ca_provisioner }}"
|
|
--password-file {{ serveur_step_ca_steppath }}/password.txt
|
|
--provisioner-password-file {{ serveur_step_ca_steppath }}/provisioner_password.txt
|
|
{{ '--acme' if serveur_step_ca_acme | bool else '' }}
|
|
creates: "{{ serveur_step_ca_steppath }}/config/ca.json"
|
|
become: true
|
|
become_user: "{{ serveur_step_ca_utilisateur }}"
|
|
environment:
|
|
STEPPATH: "{{ serveur_step_ca_steppath }}"
|
|
|
|
- name: Deployer l'unite systemd step-ca
|
|
ansible.builtin.template:
|
|
src: step-ca.service.j2
|
|
dest: /etc/systemd/system/step-ca.service
|
|
owner: root
|
|
group: root
|
|
mode: "0644"
|
|
notify: Redemarrer step-ca
|
|
|
|
- name: Activer et demarrer step-ca
|
|
when: not ansible_check_mode
|
|
ansible.builtin.systemd:
|
|
name: "{{ serveur_step_ca_service }}"
|
|
enabled: true
|
|
state: started
|
|
daemon_reload: true
|