
Mit Ansible 2.9 auf RHEL7.6 versuche ich, einzelne Firewall-Zonen zu konfigurieren, was auch die Konfiguration von Rich Rules umfasst. Das funktioniert alles einwandfrei, außer wenn ich versuche, eine Rich Rule als Vorlage hinzuzufügen. Im folgenden Beispiel versuche ich, eine Rich Rule hinzuzufügen, die VRRP-Verkehr zulässt.
Ansible-Aufgabe:
- name: Configure firewalld zones
template:
src: zone_template.xml.j2
dest: /etc/firewalld/zones/{{ item.name }}.xml
with_items: "{{ firewalld_zones }}"
notify: reload firewalld
loop_control:
label: "{{ item.name }}"
Die Variable firewalld_zones
ist in meiner defaults/main.yml wie folgt definiert:
firewalld_zones:
- name: public
short: "Public"
description: "Public Zone"
port:
- { port: 300, protocol: tcp }
- { port: 300, protocol: udp }
rule:
- protocol:
- value: "vrrp"
- action: accept
Ausschnitt meiner Vorlage zone_template.xml.j2
:
<?xml version="1.0" encoding="utf-8"?>
<zone{% if item.target is defined %} target="{{ item.target }}"{% endif %}>
<short>{{ item.short|default(item.name)|upper }}</short>
{% if item.description is defined %}
<description>{{ item.description }}</description>
{% endif %}
{% for tag in item %}
{# Settings which can be used several times #}
{% if tag in ['interface','source','service','port','protocol','icmp-block','forward-port','source-port'] %}
{% for subtag in item[tag] %}
<{{ tag }}{% for name,value in subtag.items() %} {{ name }}="{{ value }}"{% endfor %}/>
{% endfor %}
{# Settings which can be used once #}
{% elif tag in ['icmp-block-inversion','masquerade'] and item[tag] == True %}
<{{ tag }}/>
{% endif %}
{% endfor %}
{% for rule in item.rule|default([]) %}
<rule{% if rule.family is defined %} family="{{ rule.family }}"{% endif %}>
{% for tag in rule %}
{% if tag in ['source','destination','service','port','icmp-block','icmp-type','masquerade','forward-port','protocol'] %}
{% for subtag in rule[tag] %}
{% if subtag in ['action'] %}
<{% for name,value in subtag.items() %}{{ name }}{% endfor %}/>
{% endif %}
<{{ tag }}{% for name,value in subtag.items() %} {{ name }}="{{ value }}"{% endfor %}/>
{% endfor %}
{% endif %}
</rule>
{% endfor %}
{% endfor %}
</zone>
Damit erhalte ich:
<?xml version="1.0" encoding="utf-8"?>
<zone>
<short>PUBLIC</short>
<description>Public Zone</description>
<port protocol="tcp" port="300"/>
<port protocol="udp" port="300"/>
<rule>
<protocol value="vrrp"/>
<protocol action="accept"/>
</rule>
</zone>
Was ich versuche zu erreichen, ist Folgendes:
<?xml version="1.0" encoding="utf-8"?>
<zone>
<short>PUBLIC</short>
<description>Public Zone</description>
<port protocol="tcp" port="300"/>
<port protocol="udp" port="300"/>
<rule>
<protocol value="vrrp"/>
<accept/>
</rule>
</zone>
Was muss ich ändern (Vorlage und/oder Variablen), um dies zu erreichen?
Danke! J
Antwort1
Ändern Sie den Teil der Vorlage
...
{% for subtag in rule[tag] %}
{% for name,value in subtag.items() %}
{% if name in ['action'] %}
<{{ value }}/>
{% else %}
<{{ tag }} {{ name }}="{{ value }}"/>
{% endif %}
{% endfor %}
{% endfor %}
{% endif %}
{% endfor %}
</rule>
{% endfor %}
</zone>