123 lines
4.0 KiB
YAML
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]
|