
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:.
Ce que vous allez apprendre
Section intitulée « Ce que vous allez apprendre »- Pourquoi
permanent: trueETimmediate: truedoivent être combinés. - Distinguer
service:(nom prédéfini) deport:(port custom). - Segmenter les règles par zone (
public,internal,dmz). - Retirer une règle avec
state: disabled(pasabsent). - Sécuriser un port avec
source:pour limiter l’IP autorisée.
Prérequis
Section intitulée « Prérequis »- Avoir
ansible.posixinstallé :ansible-galaxy collection install ansible.posix. - firewalld doit être démarré sur le managed node :
systemd_service: name=firewalld state=started enabled=true.
Le piège permanent vs immediate
Section intitulée « Le piège permanent vs immediate »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: trueRègle absolue : toujours permanent: true + immediate: true. Sans les deux, vous tombez dans un des deux pièges classiques.
Service prédéfini (préféré)
Section intitulée « Service prédéfini (préféré) »- 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).
Port custom
Section intitulée « Port custom »- name: Ouvrir le port 8080/tcp pour app dev ansible.posix.firewalld: port: 8080/tcp state: enabled permanent: true immediate: trueFormat : <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.).
Zones firewalld
Section intitulée « Zones firewalld »- 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: trueZones 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: trueLimiter par IP source
Section intitulée « Limiter par IP source »- 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: truerich_rule: permet des règles avancées : limit-rate, log, masquerade, restrictions IP source/destination. Plus puissant que service: simple mais plus verbeux.
Suppression
Section intitulée « Suppression »- name: Retirer le port 8080 ansible.posix.firewalld: port: 8080/tcp state: disabled permanent: true immediate: truePas de state: absent pour firewalld — c’est state: disabled. La règle est retirée des fichiers permanents et des règles runtime.
Pattern complet : web stack
Section intitulée « Pattern complet : web stack »- 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.
Pièges courants
Section intitulée « Pièges courants »| Symptôme | Cause | Fix |
|---|---|---|
| Port marche maintenant, perd au reboot | permanent: false (défaut) | Ajouter permanent: true |
permanent: true mais port non actif | immediate: false (défaut) | Ajouter immediate: true |
Module firewalld is not running | firewalld pas démarré | systemd_service: firewalld started avant |
| Règle de zone inattendue | Zone par défaut diffère du déploiement | Spécifier zone: explicitement |
state: absent ne fonctionne pas | Mauvais nom — c’est disabled | Utiliser state: disabled |
À retenir
Section intitulée « À retenir »- 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: disabledpour retirer (pasabsent).- firewalld doit tourner avant le module.
Pratiquer dans le lab
Section intitulée « Pratiquer dans le lab »Cette page a un lab d’accompagnement : labs/modules-rhel/firewalld/ dans stephrobert/ansible-training.
Challenge — sur web1.lab :
- Installer + démarrer firewalld.
- Autoriser
http,https(services prédéfinis). - Ouvrir
8080/tcpet8443/tcp(ports custom). - Tous avec
permanent: true+immediate: true.
Validation pytest+testinfra :
ansible-playbook solution.ymlpytest -v labs/modules-rhel/firewalld/challenge/tests/9 tests vérifient firewalld actif, services + ports en runtime ET permanent.