--- # Node Ready: type = ready, status = True # Node NotReady: type = ready, status = Unknown - name: See if node is in ready state shell: >- {{ bin_dir }}/kubectl get node {{ inventory_hostname }} -o jsonpath='{ range .status.conditions[?(@.type == "Ready")].status }{ @ }{ end }' register: kubectl_node_ready delegate_to: "{{ groups['kube-master'][0] }}" failed_when: false changed_when: false # SchedulingDisabled: unschedulable = true # else unschedulable key doesn't exist - name: See if node is schedulable shell: >- {{ bin_dir }}/kubectl get node {{ inventory_hostname }} -o jsonpath='{ .spec.unschedulable }' register: kubectl_node_schedulable delegate_to: "{{ groups['kube-master'][0] }}" failed_when: false changed_when: false - name: Set if node needs cordoning set_fact: needs_cordoning: >- {% if kubectl_node_ready.stdout == "True" and not kubectl_node_schedulable.stdout -%} true {%- else -%} false {%- endif %} - name: Cordon node command: "{{ bin_dir }}/kubectl cordon {{ inventory_hostname }}" delegate_to: "{{ groups['kube-master'][0] }}" when: needs_cordoning - name: Check kubectl version command: "{{ bin_dir }}/kubectl version --client --short" register: kubectl_version delegate_to: "{{ groups['kube-master'][0] }}" run_once: yes changed_when: false when: - drain_nodes - needs_cordoning - drain_pod_selector - name: Ensure minimum version for drain label selector if necessary assert: that: "kubectl_version.stdout.split(' ')[-1] is version('v1.10.0', '>=')" when: - drain_nodes - needs_cordoning - drain_pod_selector - name: Drain node command: >- {{ bin_dir }}/kubectl drain --force --ignore-daemonsets --grace-period {{ drain_grace_period }} --timeout {{ drain_timeout }} --delete-local-data {{ inventory_hostname }} {% if drain_pod_selector %}--pod-selector '{{ drain_pod_selector }}'{% endif %} delegate_to: "{{ groups['kube-master'][0] }}" when: - drain_nodes - needs_cordoning