Aller au contenu
Infrastructure as Code medium

Module firewalld Ansible : ouvrir des ports sur RHEL/AlmaLinux

9 min de lecture

Logo Ansible

ansible.posix.firewalld: gère firewalld, le pare-feu par défaut sur RHEL 7+, AlmaLinux, RockyLinux. C’est le module n°1 RHCE 2026 pour ouvrir/fermer des ports, autoriser des services prédéfinis (http, https, ssh), et gérer les zones.

Module de la collection ansible.posixansible-galaxy collection install ansible.posix requis.

Options critiques : service: (nom prédéfini) ou port: (8080/tcp), state: (enabled / disabled), permanent: true + immediate: true (la règle d’or), zone:.

  • Pourquoi permanent: true ET immediate: true doivent être combinés.
  • Distinguer service: (nom prédéfini) de port: (port custom).
  • Segmenter les règles par zone (public, internal, dmz).
  • Retirer une règle avec state: disabled (pas absent).
  • Sécuriser un port avec source: pour limiter l’IP autorisée.
  • Avoir ansible.posix installé : ansible-galaxy collection install ansible.posix.
  • firewalld doit être démarré sur le managed node : systemd_service: name=firewalld state=started enabled=true.

firewalld distingue deux états :

  • runtime : règles actives maintenant (perdues au reboot).
  • permanent : règles persistées dans /etc/firewalld/, chargées au reboot.
# ❌ Piege : ouvre maintenant, perd au reboot
- ansible.posix.firewalld:
service: http
state: enabled
# ❌ Piege : persiste mais pas applique maintenant
- ansible.posix.firewalld:
service: http
state: enabled
permanent: true
# ✅ Bon : applique maintenant ET persiste
- ansible.posix.firewalld:
service: http
state: enabled
permanent: true
immediate: true

Règle absolue : toujours permanent: true + immediate: true. Sans les deux, vous tombez dans un des deux pièges classiques.

- name: Autoriser HTTP et HTTPS
ansible.posix.firewalld:
service: "{{ item }}"
state: enabled
permanent: true
immediate: true
loop: [http, https]

firewall-cmd --get-services liste plus de 100 services prédéfinis : http, https, ssh, dns, dhcp, samba, ftp, smtp, etc. Préférer un service à un port quand possible — l’intent est plus clair (http plutôt que 80/tcp).

- name: Ouvrir le port 8080/tcp pour app dev
ansible.posix.firewalld:
port: 8080/tcp
state: enabled
permanent: true
immediate: true

Format : <port>/<protocol>tcp, udp. Plages : 8000-8100/tcp.

Quand utiliser port: plutôt que service: : app custom sans service prédéfini, port non standard, stack interne (Prometheus 9090, Grafana 3000, etc.).

- name: SSH dans la zone internal uniquement
ansible.posix.firewalld:
service: ssh
zone: internal
state: enabled
permanent: true
immediate: true
- name: Bloquer SSH dans la zone public
ansible.posix.firewalld:
service: ssh
zone: public
state: disabled
permanent: true
immediate: true

Zones par défaut RHEL : public (la plupart du trafic), internal, trusted, dmz, block, drop. Cas d’usage : un serveur multi-interfaces (eth0 public, eth1 internal) avec règles différentes par zone.

firewall-cmd --get-default-zone donne la zone par défaut. À changer avec :

- ansible.builtin.command: firewall-cmd --set-default-zone=internal
changed_when: true
- name: SSH uniquement depuis le LAN management
ansible.posix.firewalld:
rich_rule: 'rule family="ipv4" source address="10.10.20.0/24" service name="ssh" accept'
state: enabled
permanent: true
immediate: true

rich_rule: permet des règles avancées : limit-rate, log, masquerade, restrictions IP source/destination. Plus puissant que service: simple mais plus verbeux.

- name: Retirer le port 8080
ansible.posix.firewalld:
port: 8080/tcp
state: disabled
permanent: true
immediate: true

Pas de state: absent pour firewalld — c’est state: disabled. La règle est retirée des fichiers permanents et des règles runtime.

- name: Stack web complete
hosts: web1.lab
become: true
tasks:
- name: Installer httpd
ansible.builtin.dnf:
name: httpd
state: present
- name: Demarrer httpd
ansible.builtin.systemd_service:
name: httpd
state: started
enabled: true
- name: Demarrer firewalld
ansible.builtin.systemd_service:
name: firewalld
state: started
enabled: true
- name: Ouvrir HTTP et HTTPS
ansible.posix.firewalld:
service: "{{ item }}"
state: enabled
permanent: true
immediate: true
loop: [http, https]

Ordre : installer → démarrer service applicatif → démarrer firewalld → ouvrir le pare-feu. Le pare-feu en dernier garantit qu’il n’autorise pas du trafic vers un service pas encore prêt.

SymptômeCauseFix
Port marche maintenant, perd au rebootpermanent: false (défaut)Ajouter permanent: true
permanent: true mais port non actifimmediate: false (défaut)Ajouter immediate: true
Module firewalld is not runningfirewalld pas démarrésystemd_service: firewalld started avant
Règle de zone inattendueZone par défaut diffère du déploiementSpécifier zone: explicitement
state: absent ne fonctionne pasMauvais nom — c’est disabledUtiliser state: disabled
  • Module ansible.posix.firewalld: (collection requise).
  • permanent: true + immediate: true = règle d’or, toujours les deux.
  • service: > port: quand un service prédéfini existe (lisibilité).
  • zone: pour segmenter les règles par interface.
  • state: disabled pour retirer (pas absent).
  • firewalld doit tourner avant le module.

Cette page a un lab d’accompagnement : labs/modules-rhel/firewalld/ dans stephrobert/ansible-training.

Challenge — sur web1.lab :

  1. Installer + démarrer firewalld.
  2. Autoriser http, https (services prédéfinis).
  3. Ouvrir 8080/tcp et 8443/tcp (ports custom).
  4. Tous avec permanent: true + immediate: true.

Validation pytest+testinfra :

Fenêtre de terminal
ansible-playbook solution.yml
pytest -v labs/modules-rhel/firewalld/challenge/tests/

9 tests vérifient firewalld actif, services + ports en runtime ET permanent.

Ce site vous est utile ?

Sachez que moins de 1% des lecteurs soutiennent ce site.

Je maintiens +700 guides gratuits, sans pub ni tracing. Aujourd'hui, ce site ne couvre même pas mes frais d'hébergement, d'électricité, de matériel, de logiciels, mais surtout de cafés.

Un soutien régulier, même symbolique, m'aide à garder ces ressources gratuites et à continuer de produire des guides de qualité. Merci pour votre appui.

Abonnez-vous et suivez mon actualité DevSecOps sur LinkedIn