{{ ansible_managed | comment }} {% macro import_export(obj, ipv4) %} {{ obj.import | default([]) | bird_import(ipv4) }} {% if obj.limits.import is defined %} import limit {{ obj.limits.import }}; {% endif %} {{ obj.export | default([]) | bird_export(ipv4) }} {% if obj.limits.export is defined %} export limit {{ obj.limits.export }}; {% endif %} {% endmacro %} log syslog all; router id {{ bird__router_id }}; {% for table in bird__tables %} {% for version in ["ipv4", "ipv6"] %} {{ version }} table {{ table | bird_name(version == "ipv4") }}; {% endfor %} {% endfor %} protocol device { scan time 10; } {% for name, kernel in bird__kernel.items() %} {% for version in ["ipv4", "ipv6"] %} {% set ipv4 = version == "ipv4" %} protocol kernel {{ name | bird_name(ipv4) }} { {% if kernel.kernel is defined %} kernel table {{ kernel.kernel }}; {% endif %} {% if kernel.learn | default(False) %} learn; {% endif %} {% if kernel.persist | default(False) %} persist; {% endif %} {{ version }} { {% if kernel.table is defined %} table {{ kernel.table | bird_name(ipv4) }}; {% endif %} {{ import_export(kernel, ipv4) | indent(8) }} }; } {% endfor %} {% endfor %} {% for name, pipe in bird__pipes.items() %} {% for version in ["ipv4", "ipv6"] %} {% set ipv4 = version == "ipv4" %} protocol pipe {{ name | bird_name(ipv4) }} { table {{ pipe.table | bird_name(ipv4) }}; peer table {{ pipe.peer_table | default("master") | bird_name(ipv4) }}; {{ import_export(kernel, ipv4) | indent(4) }} } {% endfor %} {% endfor %} {% if bird__ospf is defined %} {% for version in ["ipv4", "ipv6"] %} {% set ipv4 = version == "ipv4" %} {% set ospf_version = "v2" if ipv4 else "v3" %} protocol ospf {{ ospf_version }} {{ "ospf" | bird_name(ipv4) }} { {{ version }} { {% if bird__ospf.table is defined %} table {{ bird__ospf.table | bird_name(ipv4) }}; {% endif %} {{ import_export(bird__ospf, ipv4) | indent(8) }} }; {% for id, area in bird__ospf.areas.items() %} area {{ id }} { {% for iface in area.broadcast | default([]) %} interface {{ iface | enquote }} { type broadcast; hello 2; retransmit 5; wait 10; dead 20; }; {% endfor %} {% for iface in area.stub | default([]) %} interface {{ iface | enquote }} { stub; }; {% endfor %} }; {% endfor %} } {% endfor %} {% endif %} {% for name, bgp in bird__bgp.items() %} {% for version in ["ipv4", "ipv6"] %} {% set ipv4 = version == "ipv4" %} protocol bgp {{ name | bird_name(ipv4) }} { local {{ bgp.local.address | ansible.utils.ipaddr(version) | first }} as {{ bgp.local.as }}; neighbor {{ bgp.neighbor.address | ansible.utils.ipaddr(version) | first }} as {{ bgp.neighbor.as }}; {% if bgp.rr_cluster_client is defined %} rr client; rr cluster id {{ bgp.rr_cluster_client }}; {% endif %} {{ version }} { {% if bgp.table is defined %} table {{ bgp.table | bird_name(ipv4) }}; {% endif %} {% if bgp.next_hop_self is defined %} next hop self; {% endif %} {{ import_export(bgp, ipv4) | indent(8) }} }; } {% endfor %} {% endfor %} {% if bird__radv is defined %} protocol radv { {% set interfaces = bird__radv.interfaces | default({}) %} {% for iface, radv in interfaces.items() %} interface {{ iface | enquote }} { max ra interval {{ radv.max_interval | default(bird__radv_max_interval) }}; {% for prefix in radv.prefixes | default([]) %} prefix {{ prefix }}; {% endfor %} {% for domain in radv.domain_search | default([]) %} dnssl {{ domain | enquote }}; {% endfor %} }; {% endfor %} {% for addr in bird__radv.rdnss | default([]) %} rdnss {{ addr }}; {% endfor %} } {% endif %} {# {% if bird__static_unreachable | ansible.utils.ipv4 %} protocol static unreachable4 { ipv4 { import all; }; {% for route in bird__static_unreachable | ansible.utils.ipv4 %} route {{ route }} unreachable; {% endfor %} } {% endif %} {% if bird__static_unreachable | ansible.utils.ipv6 %} protocol static unreachable6 { ipv6 { import all; }; {% for route in bird__static_unreachable | ansible.utils.ipv6 %} route {{ route }} unreachable; {% endfor %} } {% endif %} #}