diff --git a/files/srv.mdx.incubator.geant.org.yaml b/files/srv.mdx.incubator.geant.org.yaml index 4b666fea398358b5308cd4a2a8956bf831ffbb28..574832147397316aa285d9e85548831690f91374 100644 --- a/files/srv.mdx.incubator.geant.org.yaml +++ b/files/srv.mdx.incubator.geant.org.yaml @@ -5,10 +5,11 @@ max_hosts: 1 data: "": "a": + - [ "193.224.22.77" ] - [ "193.224.22.78" ] - - [ "145.100.180.185" ] + - [ "145.100.180.185", 10 ] - [ "62.217.72.109" ] - - [ "145.100.181.134" ] + - [ "145.100.181.134", 20 ] "srv1": "a": - [ "193.224.22.78" ] diff --git a/roles/geodns/files/geoconfig.py b/roles/geodns/files/geoconfig.py new file mode 100755 index 0000000000000000000000000000000000000000..8c4c60001e6cf2e864ae8c9047ffa450fa45c457 --- /dev/null +++ b/roles/geodns/files/geoconfig.py @@ -0,0 +1,37 @@ +#!/usr/bin/env python3 + +import os +import sys +import copy +import yaml +import json + +if len(sys.argv) < 2: + print(f"Usage:\n {os.path.basename(sys.argv[0])} <file>") + sys.exit(1) + + +def is_valid(address): + return not os.system(f"timeout 0.1 nc -z {address} 80") + + +with open(f"{sys.argv[1]}.yaml", "r") as yaml_doc: + config = yaml.load(yaml_doc, Loader=yaml.FullLoader) + + new_config = copy.deepcopy(config) + new_config['data'] = {} + + for host, values in config.get('data', {}).items(): + for record, addresslist in values.items(): + if record != "a": + new_config['data'][host] = {record: addresslist} + else: + for address_config in addresslist: + if is_valid(address_config[0]): + try: + new_config['data'][host][record].append(address_config) + except KeyError: + new_config['data'][host] = {record: [address_config]} + +with open(f"{sys.argv[1]}.json", "w") as geodns_config: + json.dump(new_config, geodns_config, indent=2) diff --git a/roles/geodns/files/srv.mdx.incubator.geant.org.yaml b/roles/geodns/files/srv.mdx.incubator.geant.org.yaml new file mode 100644 index 0000000000000000000000000000000000000000..574832147397316aa285d9e85548831690f91374 --- /dev/null +++ b/roles/geodns/files/srv.mdx.incubator.geant.org.yaml @@ -0,0 +1,78 @@ +--- + +ttl: 60 +max_hosts: 1 +data: + "": + "a": + - [ "193.224.22.77" ] + - [ "193.224.22.78" ] + - [ "145.100.180.185", 10 ] + - [ "62.217.72.109" ] + - [ "145.100.181.134", 20 ] + "srv1": + "a": + - [ "193.224.22.78" ] + "srv1-signer": + "a": + - [ "193.224.22.78" ] + "srv1-proxy": + "a": + - [ "193.224.22.78" ] + "srv2": + "a": + - [ "145.100.180.185" ] + "srv2-signer": + "a": + - [ "145.100.180.185" ] + "srv2-proxy": + "a": + - [ "145.100.180.185" ] + "srv3": + "a": + - [ "62.217.72.109" ] + "srv3-signer": + "a": + - [ "62.217.72.109" ] + "srv3-proxy": + "a": + - [ "62.217.72.109" ] + "srv4": + "a": + - [ "145.100.181.134" ] + "srv4-signer": + "a": + - [ "145.100.181.134" ] + "srv4-proxy": + "a": + - [ "145.100.181.134" ] + "signer": + "a": + - [ "193.224.22.78" ] + - [ "62.217.72.109" ] + "signer.nl": + "a": + - [ "145.100.180.185" ] + "proxy": + "a": + - [ "193.224.22.78" ] + - [ "145.100.180.185" ] + "proxy.nl": + "a": + - [ "62.217.72.109" ] + "proxy-edugain": + "a": + - [ "193.224.22.78" ] + - [ "145.100.180.185" ] + - [ "62.217.72.109" ] + "proxy-test": + "a": + - [ "193.224.22.78" ] + - [ "145.100.180.185" ] + - [ "62.217.72.109" ] + "proxy-edugain.nl": + "a": + - [ "62.217.72.109" ] + "proxy-test.nl": + "a": + - [ "62.217.72.109" ] diff --git a/roles/geodns/handlers/main.yml b/roles/geodns/handlers/main.yml index a5ec62ef854354062ef4bf3776f654061c4b70cd..0b00ab4393438d0b80f1d1a39b6f611e20e8b438 100644 --- a/roles/geodns/handlers/main.yml +++ b/roles/geodns/handlers/main.yml @@ -1,7 +1,11 @@ --- - name: enable geodns job systemd: - name: "geodns.service" + name: "{{ item }}" enabled: true - state: "restarted" + state: "started" daemon_reload: true + with_items: + - geodns.service + - geodns-config.service + - geodns-config.timer diff --git a/roles/geodns/tasks/main.yml b/roles/geodns/tasks/main.yml index 9833c636a0f876387e0cc53c9c4d17c028ad3d2e..ce0ec6e684023a0e1e1938b9b75c5f62e3b593db 100644 --- a/roles/geodns/tasks/main.yml +++ b/roles/geodns/tasks/main.yml @@ -43,12 +43,20 @@ - name: Copy geoDNS config ansible.builtin.copy: - content: "{{ lookup('file', tld + '.yaml') | from_yaml | to_nice_json }}" - dest: "{{ geo_dns_config }}/{{ tld }}.json" + src: "{{ tld }}.yaml" + dest: "{{ geo_dns_config }}/{{ tld }}.yaml" mode: '0644' notify: - "enable geodns job" +- name: Copy geoDNS config parser + ansible.builtin.copy: + src: "geoconfig.py" + dest: "{{ geo_dns_config }}/geoconfig.py" + mode: '0755' + notify: + - "enable geodns job" + - name: Copy GeoLite2DB's ansible.builtin.copy: src: "{{ item }}" @@ -66,9 +74,18 @@ notify: - "enable geodns job" +- name: Run GeoDns config job once + ansible.builtin.command: + cmd: "/opt/geodns/config/geoconfig.py {{ tld }}" + chdir: "{{ geo_dns_config }}" + - name: Copy geoDNS service files ansible.builtin.template: - src: "geodns.service.j2" - dest: "/etc/systemd/system/geodns.service" + src: "{{ item }}.j2" + dest: "/etc/systemd/system/{{ item }}" + with_items: + - geodns.service + - geodns-config.service + - geodns-config.timer notify: - "enable geodns job" diff --git a/roles/geodns/templates/geodns-config.service.j2 b/roles/geodns/templates/geodns-config.service.j2 new file mode 100644 index 0000000000000000000000000000000000000000..dd988705ab9cc313ac93099b4dca7a626a7154b7 --- /dev/null +++ b/roles/geodns/templates/geodns-config.service.j2 @@ -0,0 +1,11 @@ +[Unit] +Description=GeoDNS config + +[Service] +Type=oneshot +WorkingDirectory={{ geo_dns_config }} +ExecStart={{ geo_dns_config }}/geoconfig.py {{ tld }} +ExecStartPost=/bin/systemctl restart geodns + +[Install] +WantedBy=multi-user.target diff --git a/roles/geodns/templates/geodns-config.timer.j2 b/roles/geodns/templates/geodns-config.timer.j2 new file mode 100644 index 0000000000000000000000000000000000000000..9016e1df7ea7ceea498a443747cddc8a7a030395 --- /dev/null +++ b/roles/geodns/templates/geodns-config.timer.j2 @@ -0,0 +1,9 @@ +[Unit] +Description=Run GeoDNS config + +[Timer] +OnCalendar=*-*-* *:0/5:00 +Unit=geodns-config.service + +[Install] +WantedBy=timers.target diff --git a/roles/geodns/templates/geodns.service.j2 b/roles/geodns/templates/geodns.service.j2 index c900f5674b33971f937533413930f6c2bdf22f27..cc608027e2b1fdf3df51f3761ab58e8fe88125e0 100644 --- a/roles/geodns/templates/geodns.service.j2 +++ b/roles/geodns/templates/geodns.service.j2 @@ -5,8 +5,8 @@ After=syslog.target network.target [Service] Type=simple WorkingDirectory={{ geodns_dir }} -ExecStart=/opt/geodns/geodns -config={{ geo_dns_config }} -log -interface {{ ansible_facts.default_ipv4.address }} -port 53 -ExecReload=/bin/kill -HUP $MAINPID +ExecStart={{ geodns_dir }}/geodns -config={{ geo_dns_config }} -log -interface {{ ansible_facts.default_ipv4.address }} -port 53 +# ExecReload=/bin/kill -HUP $MAINPID Restart=on-failure RestartSec=10 SyslogIdentifier=geodns