Files
hcornet 538390bf6a
Ansible - controle du code / controle (push) Successful in 57s
Ansible - controle du code / promouvoir (push) Successful in 4s
site.yml
2026-09-20 20:35:26 +02:00

123 lines
4.0 KiB
YAML

---
# Point d'entrée : configure et durcit l'ensemble des serveurs Linux.
#
# ansible-playbook site.yml # tout
# ansible-playbook site.yml --tags ssh # un seul rôle
# ansible-playbook site.yml --check --diff # simulation
#
# Ordre volontaire : le proxy et le DNS d'abord (sinon aucun paquet ne peut
# être téléchargé), le SSH avant le pare-feu (la règle SSH doit exister
# avant que la politique par défaut passe à « drop »).
- name: Configuration et durcissement des serveurs Linux
hosts: all
become: true
# Faits collectés dans pre_tasks, une fois le port SSH joignable déterminé.
gather_facts: false
pre_tasks:
# Un seul sondage sert deux buts : choisir le port de connexion (une VM neuve
# répond sur 22, une machine déjà traitée sur ssh_port) et repérer les machines
# éteintes, écartées proprement au lieu de faire échouer le passage.
# Un ansible_port fixé dans l'inventaire fige le port : seul celui-là est testé.
- name: Sonder les ports SSH possibles
ansible.builtin.wait_for:
host: "{{ ansible_host | default(inventory_hostname) }}"
port: "{{ item }}"
search_regex: "^SSH-"
timeout: "{{ ssh_probe_timeout }}"
delegate_to: localhost
become: false
check_mode: false
loop: "{{ ssh_probe_ports }}"
register: ssh_probe
failed_when: false
tags: [always]
- name: Retenir les ports qui répondent
ansible.builtin.set_fact:
ssh_probe_reachable: "{{ ssh_probe.results | selectattr('state', 'defined') | map(attribute='port') | list }}"
tags: [always]
- name: Se connecter sur le port qui répond
ansible.builtin.set_fact:
ansible_port: "{{ ssh_probe_reachable | first }}"
when:
- ansible_port is not defined
- ssh_probe_reachable | length > 0
tags: [always]
- name: Signaler une machine injoignable
ansible.builtin.debug:
msg: >-
Aucun service SSH sur {{ ansible_host | default(inventory_hostname) }}
(ports testés : {{ ssh_probe_ports | join(', ') }}) — machine éteinte ou filtrée.
{{ 'Hôte écarté de ce passage.' if skip_unreachable_hosts | bool else 'Le passage va échouer sur cet hôte.' }}
when: ssh_probe_reachable | length == 0
tags: [always]
- name: Écarter la machine injoignable du passage
ansible.builtin.meta: end_host
when:
- ssh_probe_reachable | length == 0
- skip_unreachable_hosts | bool
tags: [always]
- name: Collecter les faits
ansible.builtin.setup:
tags: [always]
roles:
- role: common
tags: [common, always]
- role: proxy
when: enable_proxy | bool
tags: [proxy]
- role: dns
when: enable_dns | bool
tags: [dns]
- role: updates
when: enable_updates | bool
tags: [updates]
- role: ssh
when: enable_ssh | bool
tags: [ssh]
- role: firewall
when: enable_firewall | bool
tags: [firewall]
- role: fail2ban
when: enable_fail2ban | bool
tags: [fail2ban]
- role: os_hardening
when: enable_os_hardening | bool
tags: [os_hardening, hardening]
- role: snmp
when: enable_snmp | bool
tags: [snmp, supervision]
- role: nrpe
when: enable_nrpe | bool
tags: [nrpe, supervision]
- role: glpi_agent
when: enable_glpi_agent | bool
tags: [glpi, glpi_agent]
post_tasks:
- name: Résumé de fin de passage
ansible.builtin.debug:
msg:
- "Hôte : {{ inventory_hostname }} ({{ ansible_facts['distribution'] }} {{ ansible_facts['distribution_version'] }})"
- "SSH : port(s) {{ ssh_ports_effective | default([ssh_port]) | join(', ') }}, root={{ ssh_permit_root_login }}"
- "Session : port {{ ansible_port | default(22) }}"
- "Pare-feu : {{ firewall_backend_effective | default('non géré') }}"
- "Redémarrage : {{ 'REQUIS' if (updates_reboot_required | default(false)) else 'non requis' }}"
tags: [always]