ntp issue fix. 39/1639/1
authorBaha Mesleh <baha.mesleh@nokia.com>
Mon, 23 Sep 2019 14:26:32 +0000 (17:26 +0300)
committerBaha Mesleh <baha.mesleh@nokia.com>
Mon, 23 Sep 2019 14:26:32 +0000 (17:26 +0300)
Added a playbook to make sure that time gets configured properly in all nodes.

Signed-off-by: Baha Mesleh <baha.mesleh@nokia.com>
Change-Id: I525c686553b2e4a103f4cc69f1b98a0778d9c5ed

infra-ansible.spec
playbooks/ntp-check.yml [new file with mode: 0644]
roles/ntp-utils/library/change_master_servers.py [new file with mode: 0644]
roles/ntp-utils/library/tune_master_server_params.py [new file with mode: 0644]
roles/ntp-utils/tasks/main.yml [new file with mode: 0644]

index 144eb76..8cedac6 100644 (file)
@@ -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 (file)
index 0000000..9eba32f
--- /dev/null
@@ -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 (file)
index 0000000..7b694e6
--- /dev/null
@@ -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 (file)
index 0000000..ca65bce
--- /dev/null
@@ -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 (file)
index 0000000..a971b5b
--- /dev/null
@@ -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
+