diff --git a/etcd-restore.sh b/etcd-restore.sh new file mode 100755 index 0000000..47d0aff --- /dev/null +++ b/etcd-restore.sh @@ -0,0 +1 @@ +ANSIBLE_STDOUT_CALLBACK=debug ANSIBLE_DISPLAY_SKIPPED_HOSTS=false ansible-playbook -i hosts -e target=$1 etcd-restore.yml diff --git a/etcd-restore.yml b/etcd-restore.yml new file mode 100644 index 0000000..df7e208 --- /dev/null +++ b/etcd-restore.yml @@ -0,0 +1,9 @@ +--- +- hosts: all + remote_user: "{{ ansible_user }}" + become: yes + become_user: root + become_method: sudo + vars_files: "{{ 'group_vars/host.yml' if target == 'host' else 'group_vars/member.yml' }}" + roles: + - role: etcd-restore diff --git a/roles/etcd-restore/.travis.yml b/roles/etcd-restore/.travis.yml new file mode 100644 index 0000000..36bbf62 --- /dev/null +++ b/roles/etcd-restore/.travis.yml @@ -0,0 +1,29 @@ +--- +language: python +python: "2.7" + +# Use the new container infrastructure +sudo: false + +# Install ansible +addons: + apt: + packages: + - python-pip + +install: + # Install ansible + - pip install ansible + + # Check ansible version + - ansible --version + + # Create ansible.cfg with correct roles_path + - printf '[defaults]\nroles_path=../' >ansible.cfg + +script: + # Basic role syntax check + - ansible-playbook tests/test.yml -i tests/inventory --syntax-check + +notifications: + webhooks: https://galaxy.ansible.com/api/v1/notifications/ \ No newline at end of file diff --git a/roles/etcd-restore/tasks/main.yml b/roles/etcd-restore/tasks/main.yml new file mode 100644 index 0000000..f9e277f --- /dev/null +++ b/roles/etcd-restore/tasks/main.yml @@ -0,0 +1,2 @@ +--- +- include: redhat/main.yml diff --git a/roles/etcd-restore/tasks/redhat/0-etcdctl-check.yml b/roles/etcd-restore/tasks/redhat/0-etcdctl-check.yml new file mode 100644 index 0000000..66607c8 --- /dev/null +++ b/roles/etcd-restore/tasks/redhat/0-etcdctl-check.yml @@ -0,0 +1,21 @@ +--- +- name: "[{{ target }} / 0-etcdctl-check.yml] etcd check" + shell: which etcdctl + register: etcdctl_check + failed_when: false + changed_when: false + +- name: "[{{ target }} / 0-etcdctl-check.yml] version check" + shell: etcdctl version + register: etcdctl_version + when: etcdctl_check.rc == 0 + +- name: "[{{ target }} / 0-etcdctl-check.yml] etcdctl info" + debug: + msg: | + {% if etcdctl_check.rc == 0 %} + {{ etcdctl_version.stdout_lines[0] }} + {{ etcdctl_version.stdout_lines[1] }} + {% else %} + etcdctl not installed + {% endif %} \ No newline at end of file diff --git a/roles/etcd-restore/tasks/redhat/1-etcd-backup-file-copy.yml b/roles/etcd-restore/tasks/redhat/1-etcd-backup-file-copy.yml new file mode 100644 index 0000000..e08c491 --- /dev/null +++ b/roles/etcd-restore/tasks/redhat/1-etcd-backup-file-copy.yml @@ -0,0 +1,6 @@ +--- +- name: "[{{ target }} / 1-etcd-backup-file-copy.yml] etcd backup file copy" + copy: + src: "{{ backup_dir }}/{{ etcd_filename }}" + dest: /tmp/{{ etcd_filename }} + mode: "0644" \ No newline at end of file diff --git a/roles/etcd-restore/tasks/redhat/2-etcd-restore.yml b/roles/etcd-restore/tasks/redhat/2-etcd-restore.yml new file mode 100644 index 0000000..108886f --- /dev/null +++ b/roles/etcd-restore/tasks/redhat/2-etcd-restore.yml @@ -0,0 +1,52 @@ +--- +- name: set time + set_fact: + time: "{{ lookup('pipe','date +%Y%m%d%H%M') }}" + +- name: "[{{ target }} / 2-etcd-restore.yml] etcd original backup directory create" + file: + path: /tmp/etcd-backup-{{ time }} + state: directory + mode: '0755' + +- name: "[{{ target }} / 2-etcd-restore.yml] etcd original backup" + shell: | + cp -r /var/lib/etcd/* /tmp/etcd-backup-{{ time }} + +- name: "[{{ target }} / 2-etcd-restore.yml] etcd original file delete" + shell: | + rm -rf /var/lib/etcd/* + +- name: "[{{ target }} / 2-etcd-restore.yml] etcd restore directory create" + file: + path: /var/lib/etcd/recover + state: directory + mode: '0755' + +- name: "[{{ target }} / 2-etcd-restore.yml] etcd restore" + shell: | + etcdctl snapshot restore /tmp/{{ etcd_filename }} \ + --name {{ ansible_hostname }} \ + --data-dir /var/lib/etcd/recover \ + --initial-cluster {{ master_host_name }}=https://{{ master_ip }}:2380,{{ master2_hostname }}=https://{{ master2_ip }}:2380,{{ master3_hostname }}=https://{{ master3_ip }}:2380 \ + --initial-advertise-peer-urls https://{{ ansible_host }}:2380 + register: etcdctl_command_result + +- name: "[{{ target }} / 2-etcd-restore.yml] etcd restore result" + debug: + msg: | + {% if etcdctl_command_result.rc == 0 %} + etcd restore success! + {% else %} + etcd restore failed! + {{ etcdctl_command_result.rc }} + {% endif %} + +- name: "[{{ target }} / 2-etcd-restore.yml] delete old etcd member directory" + file: + path: /var/lib/etcd/member + state: absent + +- name: "[{{ target }} / 2-etcd-restore.yml] change name etcd restore directory" + shell: | + mv /var/lib/etcd/recover/member /var/lib/etcd/member \ No newline at end of file diff --git a/roles/etcd-restore/tasks/redhat/main.yml b/roles/etcd-restore/tasks/redhat/main.yml new file mode 100644 index 0000000..15c6e77 --- /dev/null +++ b/roles/etcd-restore/tasks/redhat/main.yml @@ -0,0 +1,25 @@ +--- +- include: "0-etcdctl-check.yml" + when: + - "'host-master' in group_names or 'host-master-cluster' in group_names or 'member-master' in group_names or 'member-master-cluster' in group_names" + - target in ['host','member'] + +- include: "1-etcd-backup-file-copy.yml" + when: + - "'host-master' in group_names or 'host-master-cluster' in group_names" + - target in ['host'] + +- include: "1-etcd-backup-file-copy.yml" + when: + - "'member-master' in group_names or 'member-master-cluster' in group_names" + - target in ['member'] + +- include : "2-etcd-restore.yml" + when: + - "'host-master' in group_names or 'host-master-cluster' in group_names" + - target in ['host'] + +- include : "2-etcd-restore.yml" + when: + - "'member-master' in group_names or 'member-master-cluster' in group_names" + - target in ['member'] \ No newline at end of file diff --git a/roles/etcd-restore/vars/main.yml b/roles/etcd-restore/vars/main.yml new file mode 100644 index 0000000..d92e3b4 --- /dev/null +++ b/roles/etcd-restore/vars/main.yml @@ -0,0 +1,2 @@ +--- +# vars file for etcd-restore