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.posix, ansible-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 tracking. Un soutien, même symbolique, m'aide à couvrir l'hébergement et à garder ces ressources gratuites. Merci pour votre appui.

Le formulaire ne s'affiche pas ? Ouvrir Ko-fi dans un onglet.

Abonnez-vous et suivez mon actualité DevSecOps sur LinkedIn