From d56283bad79c88f67d1d74b0b0cdba37dd1757ce Mon Sep 17 00:00:00 2001 From: Lubos Kosco Date: Fri, 3 Mar 2023 11:07:04 +0100 Subject: [PATCH] scylla role: support for 2022.2 (5.0) --- ansible-scylla-node/meta/main.yml | 5 +- ansible-scylla-node/tasks/Debian_install.yml | 74 +++++++++++++------- ansible-scylla-node/tasks/RedHat.yml | 28 ++++---- ansible-scylla-node/tasks/common.yml | 45 ++++++++++-- ansible-scylla-node/tasks/main.yml | 10 +++ 5 files changed, 113 insertions(+), 49 deletions(-) diff --git a/ansible-scylla-node/meta/main.yml b/ansible-scylla-node/meta/main.yml index 32dd6874..7ce8aab3 100644 --- a/ansible-scylla-node/meta/main.yml +++ b/ansible-scylla-node/meta/main.yml @@ -9,20 +9,17 @@ galaxy_info: description: Scylla node role company: "ScyllaDB.com" license: "license (Apache)" - min_ansible_version: 2.8.0 + min_ansible_version: 6.7.0 platforms: - name: EL versions: - 7 - name: Debian versions: - - 8 - 9 - name: Ubuntu versions: - 20.04 - - 16.04 - - 18.04 - galaxy_tags: - scylla - scylladb diff --git a/ansible-scylla-node/tasks/Debian_install.yml b/ansible-scylla-node/tasks/Debian_install.yml index b3da4dd9..656ee336 100644 --- a/ansible-scylla-node/tasks/Debian_install.yml +++ b/ansible-scylla-node/tasks/Debian_install.yml @@ -2,45 +2,30 @@ # Requires a 'scylla_version_to_install' fact to be set to a version string we want to install - name: Install Scylla block: - - name: Install 'latest' Scylla + + - name: Install 'latest' {{ scylla_edition }} Scylla block: - block: - - name: Nuke an OSS pin file if exists + - name: Nuke an {{ scylla_edition }} pin file if exists file: state: absent - path: /etc/apt/preferences.d/99-scylla + path: "/etc/apt/preferences.d/99-{{ scylla_package_prefix }}" - - name: Install latest OSS Scylla + - name: Install latest {{ scylla_edition }} Scylla apt: - name: scylla + name: "{{ scylla_package_prefix }}" state: latest - when: scylla_edition == 'oss' - - - block: - - name: Nuke an Enterprise pin file if exists - file: - state: absent - path: /etc/apt/preferences.d/99-scylla-enterprise - - name: Install latest Enterprise Scylla + - name: Install latest {{ scylla_edition }} Scylla machine image apt: - name: scylla-enterprise + name: "{{ scylla_package_prefix }}-machine-image" state: latest - when: scylla_edition == 'enterprise' + when: scylla_version_to_install == 'latest' ### Handle non-latest version installation - name: Install explicitly specified Scylla version block: - - name: Set Scylla package prefix as OSS - set_fact: - scylla_package_prefix: "scylla" - when: scylla_edition == 'oss' - - - name: Set Scylla package prefix as Enterprise - set_fact: - scylla_package_prefix: "scylla-enterprise" - when: scylla_edition == 'enterprise' - name: Get versions of {{ scylla_edition }} package # 'apt list -a' output has a package version as a second column and an arch as a third one. @@ -57,7 +42,7 @@ - name: "Validate scylla version correctness" ansible.builtin.fail: - msg: "Too many/few choices for a requested version '{{ scylla_version_to_install }}': {{ aptversions.stdout_lines }}. Bailing out!" + msg: "Too many/few choices for a requested version '{{ scylla_version_to_install }}': {{ aptversions.stdout_lines }}. Fix your Scylla scylla_version or scylla_deb_repos/scylla_repo_keys!" when: aptversions.stdout_lines | length != 1 - name: Fetch version parts of Scylla package @@ -75,10 +60,47 @@ group: root mode: '0644' - - name: "Install {{ aptversions.stdout }}" + - name: "Install {{ aptversions.stdout }} {{ scylla_edition }}" apt: name: "{{ scylla_package_prefix }}={{ aptversions.stdout }}" state: present allow_downgrade: yes + + +# strip scylla_version_to_install off the last .XXX only to format 2022.2.0-20230112 + +# scylla: +# 2022.2.0-0.20230112.4f0f82ff2e1d-1 +# scylla machine image: +# 2022.2.0-20230112.1239c34-1 + + - name: Get versions of {{ scylla_edition }} machine image package + # 'apt list -a' output has a package version as a second column and an arch as a third one. + # Let's filter by the arch first and then cut the version column. + # Then we will filter out all rows that start with a requested version string followed by a digit to filter out version like 2021.1.11 when 2021.1.1 was requested. + # And finally, we are going to get rid of duplications. + shell: apt list -a {{ scylla_package_prefix }}-machine-image 2>/dev/null | awk '{split($0,a," "); print a[2]}' | egrep "^{{ stripped_scylla_machine_image_version_escaped }}" | sort | uniq + register: aptversions_machine_image + vars: + stripped_scylla_machine_image_version_escaped: "{{ scylla_version_split[0][0] | regex_escape }}\\-" + + - name: "Validate scylla version correctness" + ansible.builtin.fail: + msg: "Too many/few choices for a requested version '{{ stripped_scylla_machine_image_version_escaped }}': {{ aptversions_machine_image.stdout_lines }}. Fix your Scylla scylla_version or scylla_deb_repos/scylla_repo_keys!" + when: aptversions_machine_image.stdout_lines | length != 1 + + - name: Fetch version parts of Scylla package + set_fact: + scylla_machine_image_version_split: "{{ aptversions_machine_image.stdout | regex_findall(regexp, ignorecase=True) }}" + vars: + # All we know that the version is a string comprised of 3 parts separated by '-' + regexp: '^([^\-]+)-([^\-]+)-([^\-]+)$' + + - name: "Install {{ aptversions_machine_image.stdout }} {{ scylla_edition }} machine image" + apt: + name: "{{ scylla_package_prefix }}-machine-image={{ aptversions_machine_image.stdout }}*" + state: latest + allow_downgrade: yes + when: scylla_version_to_install != 'latest' become: true \ No newline at end of file diff --git a/ansible-scylla-node/tasks/RedHat.yml b/ansible-scylla-node/tasks/RedHat.yml index 9137360c..d728a0eb 100644 --- a/ansible-scylla-node/tasks/RedHat.yml +++ b/ansible-scylla-node/tasks/RedHat.yml @@ -82,34 +82,36 @@ when: item.split(".")[-1] == "repo" become: true -- name: Install Scylla +- name: Install {{ scylla_edition }} block: - - name: Install latest OSS Scylla + - name: Install latest {{ scylla_edition }} Scylla yum: - name: scylla + name: "{{ scylla_package_prefix }}" state: latest lock_timeout: 60 - when: scylla_version == 'latest' and scylla_edition == 'oss' + when: scylla_version == 'latest' - - name: Install latest Enterprise Scylla + - name: Install latest {{ scylla_edition }} Scylla machine image yum: - name: scylla-enterprise + name: "{{ scylla_package_prefix }}-machine-image" state: latest - when: scylla_version == 'latest' and scylla_edition == 'enterprise' + lock_timeout: 60 + when: scylla_version == 'latest' - - name: Install specified OSS Scylla + - name: Install specified {{ scylla_edition }} Scylla yum: - name: "scylla-{{ scylla_version }}" + name: "{{ scylla_package_prefix }}-{{ scylla_version }}" state: present lock_timeout: 60 - when: scylla_version != 'latest' and scylla_edition == 'oss' + when: scylla_version != 'latest' - - name: Install specified Enterprise Scylla + - name: Install specified {{ scylla_edition }} Scylla machine image yum: - name: "scylla-enterprise-{{ scylla_version }}" + name: "{{ scylla_package_prefix }}-machine-image-{{ scylla_version }}" state: present lock_timeout: 60 - when: scylla_version != 'latest' and scylla_edition == 'enterprise' + when: scylla_version != 'latest' + become: true - name: Configure SELinux diff --git a/ansible-scylla-node/tasks/common.yml b/ansible-scylla-node/tasks/common.yml index 40cabb77..1872c359 100644 --- a/ansible-scylla-node/tasks/common.yml +++ b/ansible-scylla-node/tasks/common.yml @@ -42,6 +42,25 @@ - name: Collect IO settings for the first node of every DC block: + - name: check for existing io_properties for cloud run + stat: + path: /etc/scylla.d/io_properties.yaml + register: io_prop_cloud_stat + + - name: check for scylla_cloud_io_setup + stat: + path: /opt/scylladb/scylla-machine-image/scylla_cloud_io_setup + register: io_cloud_setup + + - name: Run cloud IO setup + shell: | + /opt/scylladb/scylla-machine-image/scylla_cloud_io_setup + become: true +# if above is not found leverage /opt/scylladb/python3/bin/python3 /opt/scylladb/scylla-machine-image/lib/scylla_cloud_io_setup.py ? +# or provide our own role runner for pre 2022.2.1 ? + when: (scylla_raid_setup is defined) and (scylla_raid_setup|length > 0) and (io_cloud_setup.stat.exists) and (io_prop_cloud_stat.stat.exists|bool == False) +# we should maybe add a better way how to detect if this is cloud and run it, otherwise fallback to below (though above should fall back to it too, but it was broken in early 2022.1 and 2022.2.0) + - name: check for existing io_properties stat: path: /etc/scylla.d/io_properties.yaml @@ -95,23 +114,37 @@ become: true when: skip_ntp is defined and skip_ntp|bool == false +- name: check for node_exporter_install + stat: + path: /usr/sbin/node_exporter_install + register: node_exporter_install + - name: node exporter setup shell: | node_exporter_install --force - when: install_type == 'online' + when: (install_type == 'online') and (node_exporter_install.stat.exists) become: true notify: - node_exporter start - ignore_errors: true - #TODO: stop ignoring errors when the node_exporter_install script fix is available in all actual versions, resp. use only for < 5.0 / 2022 + +- name: check for node_exporter + stat: + path: /opt/scylladb/node_exporter/node_exporter + register: node_exporter - name: node exporter setup from 5.0/2022 - service: + block: + - name: Enforce disabling of old node exporter + service: + name: node-exporter + state: stopped + ignore_errors: true + - name: Start bundled node exporter + service: name: scylla-node-exporter state: started become: true - ignore_errors: true - #TODO: stop ignoring errors when a version check is added + when: node_exporter.stat.exists - name: configure Scylla shell: | diff --git a/ansible-scylla-node/tasks/main.yml b/ansible-scylla-node/tasks/main.yml index a082e26e..5af7085d 100644 --- a/ansible-scylla-node/tasks/main.yml +++ b/ansible-scylla-node/tasks/main.yml @@ -8,6 +8,16 @@ package_facts: manager: auto +- name: Set Scylla package prefix as OSS + set_fact: + scylla_package_prefix: "scylla" + when: scylla_edition == 'oss' + +- name: Set Scylla package prefix as Enterprise + set_fact: + scylla_package_prefix: "scylla-enterprise" + when: scylla_edition == 'enterprise' + # Upgrade - name: Upgrade Scylla include_tasks: upgrade/main.yml