mirror of
				https://gitea.0xace.cc/ansible-galaxy/bird.git
				synced 2025-11-03 15:07:25 +00:00 
			
		
		
		
	
			
				
					
						
					
					8edb0c93cef854e41c3fd0cd07bde0cf6f98ad11
				
			
			
		
	Idempotent ansible role for Bird
Tips: Use with network role for loopback/dummy interface configuraton
Supported OS
- AlmaLinux 8/9
 - Rocky Linux 8/9
 - CentOS 7
 - Debian 11/12
 - Ubuntu 20.04/22.04/24.04
 
Bird config examples
Using template config
# Set routing interface
bird_interface: "eth1"
bird:
  bgp:
    common:
      storage04.s3.msk2.example.com:
        routerid: 10.101.42.14
      storage05.s3.msk2.example.com:
        routerid: 10.101.42.15
      storage06.s3.msk2.example.com:
        routerid: 10.101.42.16
      storage07.s3.msk2.example.com:
        routerid: 10.101.42.17
    static:
      - name: STATIC1
        networks:
          storage04.s3.msk2.example.com:
            - ip: "10.110.42.1/32"
              bgp_local_pref: "100"
              interface: "{{ bird_interface }}"
            - ip: "10.110.42.21/32"
              bgp_local_pref: "100"
              interface: "{{ bird_interface }}"
          storage05.s3.msk2.example.com:
            - ip: "10.110.42.1/32"
              bgp_local_pref: "100"
              interface: "{{ bird_interface }}"
            - ip: "10.110.42.21/32"
              bgp_local_pref: "100"
              interface: "{{ bird_interface }}"
          storage06.s3.msk2.example.com:
            - ip: "10.110.42.1/32"
              bgp_local_pref: "100"
              interface: "{{ bird_interface }}"
            - ip: "10.110.42.21/32"
              bgp_local_pref: "100"
              interface: "{{ bird_interface }}"
          storage07.s3.msk2.example.com:
            - ip: "10.110.42.1/32"
              bgp_local_pref: "100"
              interface: "{{ bird_interface }}"
            - ip: "10.110.42.21/32"
              bgp_local_pref: "100"
              interface: "{{ bird_interface }}"
    bgp:
      - name: SW06
        remote_asnum: 4200200000
        local_asnum: 4200200000
        confederation: 209684
        remote_addr: "10.127.2.6"
        export:
          - STATIC1
      - name: SW10
        remote_asnum: 4200200000
        local_asnum: 4200200000
        confederation: 209684
        remote_addr: "10.127.2.10"
        export:
          - STATIC1
Complete config override
bird:
  bgp_asnum: 4200200000
  bgp_mesh:
    controller1.example.com:
      routerid: "10.180.0.101"
      bgp:
        - "10.180.0.101"
        - "192.168.255.101"
    controller2.example.com:
      routerid: "10.180.0.102"
      bgp:
        - "10.180.0.102"
        - "192.168.255.102"
    controller3.example.com:
      routerid: "10.180.0.103"
      bgp:
        - "10.180.0.103"
        - "192.168.255.103"
    compute1.example.com:
      routerid: "10.180.0.104"
      bgp:
        - "10.180.0.104"
        - "192.168.255.104"
    compute2.example.com:
      routerid: "10.180.0.105"
      bgp:
        - "10.180.0.105"
        - "192.168.255.105"
bird_config_override: |
  log syslog all;
  router id {{ bird.bgp_mesh[inventory_hostname].bgp[0] }};
  filter bgp_mesh_export {
      if net ~ [192.168.0.101/32] then accept;
      if net ~ [192.168.0.102/32] then accept;
      if net ~ [192.168.0.103/32] then accept;
      if net ~ [192.168.0.104/32] then accept;
      if net ~ [192.168.0.105/32] then accept;
      reject;
  }
  filter bgp_mesh_import {
      if net ~ [192.168.0.101/32] then accept;
      if net ~ [192.168.0.102/32] then accept;
      if net ~ [192.168.0.103/32] then accept;
      if net ~ [192.168.0.104/32] then accept;
      if net ~ [192.168.0.105/32] then accept;
      reject;
  }
  protocol device {
  }
  protocol direct {
    ipv4;
    ipv6;
  }
  protocol kernel KERNEL4 {
    merge paths yes;
    learn;
    ipv4 {
      export all;
    };
  }
  protocol kernel KERNEL6 {
    ipv6 {
      export all;
    };
  }
  {% for host in bird.bgp_mesh %}
  {% for protocol_bgp in bird.bgp_mesh[host].bgp %}
  {% if inventory_hostname not in host %}
  protocol bgp {{ host.split(".")[0] }}_{{ loop.index * 100 }} {
    password "3472e7d08e4aca276d72b5165adfc189";
    source address {{ bird.bgp_mesh[inventory_hostname].bgp[loop.index0] }};
    local as {{ bird.bgp_asnum }};
    neighbor {{ protocol_bgp }} as {{ bird.bgp_asnum }};
    hold time 10;
    ipv4 {
      import filter bgp_mesh_import;
      export filter bgp_mesh_export;
    };
    default bgp_local_pref {{ 300 - (loop.index * 100) }};
  }
  {% endif %}
  {% endfor %}
  {% endfor %}
Description
				
					Languages
				
				
								
								
									Jinja
								
								100%