From 22e4dd99a8b7595e3ea1022a112d47c88ab8b2fd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=B3=80=EC=A0=95=ED=9B=88?= Date: Mon, 7 Jul 2025 14:50:06 +0900 Subject: [PATCH] =?UTF-8?q?=EC=B5=9C=EC=B4=88=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- etcd-restore.sh | 1 + etcd-restore.yml | 9 ++++ roles/etcd-restore/.travis.yml | 29 +++++++++++ roles/etcd-restore/tasks/main.yml | 2 + .../tasks/redhat/0-etcdctl-check.yml | 21 ++++++++ .../tasks/redhat/1-etcd-backup-file-copy.yml | 6 +++ .../tasks/redhat/2-etcd-restore.yml | 52 +++++++++++++++++++ roles/etcd-restore/tasks/redhat/main.yml | 25 +++++++++ roles/etcd-restore/vars/main.yml | 2 + 9 files changed, 147 insertions(+) create mode 100755 etcd-restore.sh create mode 100644 etcd-restore.yml create mode 100644 roles/etcd-restore/.travis.yml create mode 100644 roles/etcd-restore/tasks/main.yml create mode 100644 roles/etcd-restore/tasks/redhat/0-etcdctl-check.yml create mode 100644 roles/etcd-restore/tasks/redhat/1-etcd-backup-file-copy.yml create mode 100644 roles/etcd-restore/tasks/redhat/2-etcd-restore.yml create mode 100644 roles/etcd-restore/tasks/redhat/main.yml create mode 100644 roles/etcd-restore/vars/main.yml 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