# add new-etcd node, one at a time - hosts: "{{ NODE_TO_ADD }}" tasks: # step1: find a healthy member in the etcd cluster - block: - name: set NODE_IPS of the etcd cluster set_fact: NODE_IPS="{% for host in groups['etcd'] %}{{ host }} {% endfor %}" - name: get etcd cluster status shell: 'for ip in {{ NODE_IPS }};do \ ETCDCTL_API=3 {{ base_dir }}/bin/etcdctl \ --endpoints=https://"$ip":2379 \ --cacert={{ cluster_dir }}/ssl/ca.pem \ --cert={{ cluster_dir }}/ssl/etcd.pem \ --key={{ cluster_dir }}/ssl/etcd-key.pem \ endpoint health; \ done' register: ETCD_CLUSTER_STATUS - debug: var="ETCD_CLUSTER_STATUS" - name: get a running ectd node shell: 'echo -e "{{ ETCD_CLUSTER_STATUS.stdout }}" \ "{{ ETCD_CLUSTER_STATUS.stderr }}" \ |grep "is healthy"|sed -n "1p"|cut -d: -f2|cut -d/ -f3' register: RUNNING_NODE - debug: var="RUNNING_NODE.stdout" connection: local # step2: add a new member in the etcd cluster - name: add a new etcd member shell: "ETCDCTL_API=3 {{ bin_dir }}/etcdctl member add etcd-{{ NODE_TO_ADD }} \ --peer-urls=https://{{ NODE_TO_ADD }}:2380" delegate_to: "{{ RUNNING_NODE.stdout }}" # step3: start the new-etcd node - hosts: "{{ NODE_TO_ADD }}" vars: CLUSTER_STATE: existing roles: - { role: chrony, when: "groups['chrony']|length > 0" } - prepare - etcd