From: Baha Mesleh Date: Mon, 23 Sep 2019 14:26:32 +0000 (+0300) Subject: ntp issue fix. X-Git-Url: https://gerrit.akraino.org/r/gitweb?p=ta%2Finfra-ansible.git;a=commitdiff_plain;h=a555e0e1024de52b97bbbc6c9f43e377315cda37 ntp issue fix. Added a playbook to make sure that time gets configured properly in all nodes. Signed-off-by: Baha Mesleh Change-Id: I525c686553b2e4a103f4cc69f1b98a0778d9c5ed --- diff --git a/infra-ansible.spec b/infra-ansible.spec index 144eb76..8cedac6 100644 --- a/infra-ansible.spec +++ b/infra-ansible.spec @@ -76,6 +76,7 @@ ln -sf %{_playbooks_path}/rpm-database.yml %{buildroot}/%{_pro ln -sf %{_playbooks_path}/single_node_storage.yml %{buildroot}/%{_provisioning_path} ln -sf %{_playbooks_path}/ceph-deploy.yml %{buildroot}/%{_provisioning_path} ln -sf %{_playbooks_path}/baremetal-interface-config.yml %{buildroot}/%{_provisioning_path} +ln -sf %{_playbooks_path}/ntp-check.yml %{buildroot}/%{_provisioning_path} # Create links for the postconfig phase mkdir -p %{buildroot}/%{_postconfig_path} diff --git a/playbooks/ntp-check.yml b/playbooks/ntp-check.yml new file mode 100644 index 0000000..9eba32f --- /dev/null +++ b/playbooks/ntp-check.yml @@ -0,0 +1,16 @@ +# cmframework.requires: baremetal-interface-config.yml,ntp-config.yml +--- +- name: Check ntpd on management nodes + hosts: management + vars: + external_ntp_server: '{{ time.ntp_servers[0] }}' + roles: + - ntp-utils + +- name: Check ntpd on other nodes + hosts: base:!management + vars: + external_ntp_server: '{{hostvars[installation_controller]["networking"]["infra_internal"]["ip"]}}' + modified_ntp_servers_list: '[{% for node in groups["management"] %}"{{hostvars[node]["networking"]["infra_internal"]["ip"]}}"{% if not loop.last %},{% endif %}{% endfor %}]' + roles: + - ntp-utils diff --git a/roles/ntp-utils/library/change_master_servers.py b/roles/ntp-utils/library/change_master_servers.py new file mode 100644 index 0000000..7b694e6 --- /dev/null +++ b/roles/ntp-utils/library/change_master_servers.py @@ -0,0 +1,48 @@ +#!/bin/env python +# pylint: skip-file +from ansible.module_utils.basic import * +import os, json +import re, sys +import syslog +import re + +if __name__ == '__main__': + fields = { + "new_ntp_servers": {"required":True, "type": list}, + } + + module = AnsibleModule(argument_spec=fields) + + new_ntp_servers = module.params['new_ntp_servers'] + + ntp_file = "/etc/ntp.conf" + tmp_file = "/etc/ntp.conf.mod" + + try: + filter = re.compile('^server.*') + lines = [] + with open(ntp_file, 'r') as f: + lines = f.readlines() + + updated = [] + if lines: + for line in lines: + if filter.match(line): + continue + else: + updated.append(line) + + with open(tmp_file, 'w') as f: + for line in updated: + f.write(line) + + #append the new server configuration + for server in new_ntp_servers: + f.write("server " + server + "\n"); + + os.rename(tmp_file, ntp_file) + + module.exit_json(changed=True) + + except Exception as exp: + module.fail_json(msg=str(ex)) diff --git a/roles/ntp-utils/library/tune_master_server_params.py b/roles/ntp-utils/library/tune_master_server_params.py new file mode 100644 index 0000000..ca65bce --- /dev/null +++ b/roles/ntp-utils/library/tune_master_server_params.py @@ -0,0 +1,46 @@ +#!/bin/env python +# pylint: skip-file +from ansible.module_utils.basic import * +import os, json +import re, sys +import syslog +import re + +if __name__ == '__main__': + fields = { + "server_extra_params": {"required":True, "type": str}, + } + + module = AnsibleModule(argument_spec=fields) + + server_extra_params = module.params['server_extra_params'] + + ntp_file = "/etc/ntp.conf" + tmp_file = "/etc/ntp.conf.mod" + + try: + filter = re.compile('^server.*') + lines = [] + with open(ntp_file, 'r') as f: + lines = f.readlines() + + updated = [] + if lines: + for line in lines: + if filter.match(line) and line.find(server_extra_params) == -1: + tmp = line.split('\n')[0] + tmp = tmp + " " + server_extra_params + '\n' + updated.append(tmp) + else: + updated.append(line) + + with open(tmp_file, 'w') as f: + for line in updated: + f.write(line) + + os.rename(tmp_file, ntp_file) + + module.exit_json(changed=True) + + except Exception as exp: + module.fail_json(msg=str(ex)) diff --git a/roles/ntp-utils/tasks/main.yml b/roles/ntp-utils/tasks/main.yml new file mode 100644 index 0000000..a971b5b --- /dev/null +++ b/roles/ntp-utils/tasks/main.yml @@ -0,0 +1,37 @@ +- name: Make sure ntpdate is enabled + systemd: + enabled: yes + name: ntpdate + +- name: Stop ntpd + systemd: + state: stopped + name: ntpd + +- name: Synchronize time with external ntp server + shell: | + /usr/bin/logger "ntp-check: Synchronizing time with external server" + for ((i=0; i<120; i++)); do + /usr/sbin/ntpdate {{ external_ntp_server }} + if [ $? -eq 0 ]; then + /usr/bin/logger "ntp-check: Succeeded after $i iterations" + exit 0 + fi + /usr/bin/logger "Failed, iteration $i" + /usr/bin/sleep 2 + done + +- name: Adjust the master ntpd server settings + change_master_servers: + new_ntp_servers: "{{modified_ntp_servers_list}}" + when: modified_ntp_servers_list is defined + +- name: Tune ntpd parameters + tune_master_server_params: + server_extra_params: "iburst minpoll 3" + +- name: Start ntpd + systemd: + state: started + name: ntpd +