diff --git a/roles/cifmw_cephadm/README.md b/roles/cifmw_cephadm/README.md index 45a7ac2bd..c2f23da9b 100644 --- a/roles/cifmw_cephadm/README.md +++ b/roles/cifmw_cephadm/README.md @@ -122,6 +122,30 @@ that they do not need to be changed for a typical EDPM deployment. Example values are `"aes,aes256k"` or `"aes256k"` or `"aes"`. Defaults to `""` (unset, no command is run). +* `cifmw_cephadm_server_version`: (String) Optional override for Ceph server + version during cephadm installation. Both this and `cifmw_cephadm_client_version` + must be set (and different) to activate version override logic. When activated, + temporarily switches repos to install cephadm at this version, then restores + to client version. Example: `"7.1"` or `"9.1"`. Defaults to `""` (empty), + which uses `cifmw_repo_setup_rhos_release_args` for everything. + +* `cifmw_cephadm_client_version`: (String) Optional client package version, + used with `cifmw_cephadm_server_version`. Both must be set (and different) + to activate version override logic. Example: `"9.1"`. Defaults to `""` (empty), + which uses `cifmw_repo_setup_rhos_release_args` for everything. + +The `cifmw_cephadm_server_version` and `cifmw_cephadm_client_version` are +only used for testing a corner case where the ceph clients and ceph server +are of different versions. Usually the `repo_setup` role's parameter +`cifmw_repo_setup_rhos_release_args` determines which ceph repository is +enabled and the same repository is enabled for both clients and servers. +If the server version and client version differ, then the repository +from the server version is temporarily enabled, when cephadm is installed +(so that cephadm will install that version of the ceph server), and then +the repository from `cifmw_repo_setup_rhos_release_args` is enabled again. +If `cifmw_repo_setup_rhos_release_args` is not the same as the client +version, a warning is printed. + Use the `cifmw_cephadm_pools` list of dictionaries to define pools for Nova (vms), Cinder (volumes), Cinder-backups (backups), and Glance (images). ``` diff --git a/roles/cifmw_cephadm/defaults/main.yml b/roles/cifmw_cephadm/defaults/main.yml index 2d516ed06..cd8691eb2 100644 --- a/roles/cifmw_cephadm/defaults/main.yml +++ b/roles/cifmw_cephadm/defaults/main.yml @@ -148,6 +148,16 @@ cifmw_cephadm_repository_override: false # we usually support N+1 Ceph version: Adding Squid here because Reef is the # default version installed in a greenfield scenario cifmw_cephadm_version: "squid" +# Optional: Override Ceph server version for cephadm installation +# Both server_version and client_version must be set (and different) to activate +# version override logic. Will temporarily switch repos to install cephadm at +# server_version, then restore to client_version. Example: "7.1" or "9.1" +# Leave empty (default) to use cifmw_repo_setup_rhos_release_args for everything +cifmw_cephadm_server_version: "" +# Optional: Client package version (used with server_version) +# Must be set along with server_version (and different) to activate override logic +# Leave empty (default) to use cifmw_repo_setup_rhos_release_args for everything +cifmw_cephadm_client_version: "" # bug in cephadm: if you skip "prepare host" it will fail cifmw_cephadm_prepare_host: false cifmw_cephadm_wait_install_retries: 8 diff --git a/roles/cifmw_cephadm/tasks/install_cephadm.yml b/roles/cifmw_cephadm/tasks/install_cephadm.yml index d334a725e..6f243ceaa 100644 --- a/roles/cifmw_cephadm/tasks/install_cephadm.yml +++ b/roles/cifmw_cephadm/tasks/install_cephadm.yml @@ -14,6 +14,45 @@ # License for the specific language governing permissions and limitations # under the License. +- name: Check if server/client version override is configured + ansible.builtin.set_fact: + _cifmw_cephadm_version_override: >- + {{ + (cifmw_cephadm_server_version | length > 0) and + (cifmw_cephadm_client_version | length > 0) and + (cifmw_cephadm_server_version != cifmw_cephadm_client_version) + }} + +- name: Handle version override for cephadm installation + when: _cifmw_cephadm_version_override | bool + become: true + block: + - name: Parse version from cifmw_repo_setup_rhos_release_args + ansible.builtin.set_fact: + _cifmw_cephadm_default_version: "{{ cifmw_repo_setup_rhos_release_args | regex_search('ceph-([0-9.]+)') | regex_replace('^ceph-', '') }}" + + - name: Display version configuration + ansible.builtin.debug: + msg: + - "Default: {{ _cifmw_cephadm_default_version }}" + - "Server: {{ cifmw_cephadm_server_version }}" + - "Client: {{ cifmw_cephadm_client_version }}" + - "{{ 'WARNING: Client version differs from default rhos-release version' if (_cifmw_cephadm_default_version | trim) != (cifmw_cephadm_client_version | trim) else 'Client version matches default' }}" + + - name: Disable default ceph repository + when: cifmw_cephadm_server_version != _cifmw_cephadm_default_version + ansible.builtin.replace: + path: "/etc/yum.repos.d/rhos-release-ceph-{{ _cifmw_cephadm_default_version }}.repo" + regexp: '^enabled=1' + replace: 'enabled=0' + + - name: Switch to server version repository + when: cifmw_cephadm_server_version != _cifmw_cephadm_default_version + ansible.builtin.command: + cmd: "rhos-release {{ cifmw_repo_setup_rhos_release_args | regex_replace('ceph-[0-9.]+', 'ceph-' + cifmw_cephadm_server_version) }}" + register: _cifmw_cephadm_server_repo + changed_when: "'Installed' in _cifmw_cephadm_server_repo.stdout" + - name: Enabled ceph Tools Repository when: - cifmw_cephadm_repository_override | bool @@ -35,6 +74,22 @@ delay: "{{ cifmw_cephadm_wait_install_delay }}" until: task_result is success +- name: Disable server ceph repository before restore + when: _cifmw_cephadm_version_override | bool + become: true + ansible.builtin.replace: + path: "/etc/yum.repos.d/rhos-release-ceph-{{ cifmw_cephadm_server_version }}.repo" + regexp: '^enabled=1' + replace: 'enabled=0' + +- name: Restore cifmw_repo_setup_rhos_release_args + when: _cifmw_cephadm_version_override | bool + become: true + ansible.builtin.command: + cmd: "rhos-release {{ cifmw_repo_setup_rhos_release_args }}" + register: _cifmw_cephadm_restore_repo + changed_when: "'Installed' in _cifmw_cephadm_restore_repo.stdout" + - name: Stat cephadm file ansible.builtin.stat: path: "{{ cifmw_cephadm_bin }}"