Let’s have a look how we can install and update Oracle Zero Downtime Migration tool, and see how we can automatise it with ansible…
Check ZDM build
Let’s first see how we can check ZDM version using zdm cli.
[zdm@zdmhost ~]$ zdmcli -v RHP_PT.ZDM21_LINUX.X64_221207.30 [zdm@zdmhost ~]$ zdmcli -build version: 21.0.0.0.0 full version: 21.4.0.0.0 patch version: 21.4.5.0.0 label date: 221207.30 ZDM kit build date: Mar 21 2024 22:07:12 UTC CPAT build version: 24.6.0 [exauser@sva-oelexa501 ~]$
Version installed is 21.4, and we would see how to update it to last current version, which is 21.5.
Manuel installation and update
Manuel installation and update is quite easy as it will be done through the zdminstall.sh
script. It will be the option that will highlight if it is a first installation or an update. For a first installation, the option will be setup
and for an update it will be update
.
Automatisation of the installation and update of ZDM
The playbook to automatise the installation and the update, in my case named deploy_zdm.yml
, is composed of following tasks.
We start by defining the playbook and the variable that will be used in the included tasks to install or update to zdm current last version, which is 21.5. The zip file to unarchive will be stored in the ../oracle_swfiles
directory.
--- # Playbook for deploying ZDM host # Marc Wagner - dbi # Date : 06.10.2023 # 11.06.2025 : stop service + new 21.5 version - name: Deploy ZDM hosts: "zdmhost" vars: sfw_folder: "../oracle_swfiles" zdm_base: "/u01/app/oracle" zdm_install_dir: "zdm21.5" zdm_download_dir: "/u01/app/zdm_download_dir" zdm_archive: "{{ sfw_folder }}/V1045330-01.zip" # ZDM update is an in-place process zdm_home: "/u01/app/oracle/product/zdm" environment: HTTP_PROXY: "" HTTPS_PROXY: "" tasks:
Then we will have all the tasks performing the installation.
The first one will be used to define the variable for the option provided as extra argument of the ansible playbook. And we will assert that the variable is provided.
- name: Assert extra-var has been passed as argument to playbook ansible.builtin.assert: that: - deploy_option is defined quiet: false fail_msg: "Please provide --extra-var deploy_option=" success_msg: "deploy_option={{ deploy_option }}"
The next task will stop ZDM service and will only run if following file exists : /u01/app/oracle/product/zdm/bin/zdmservice
.
This check is done so the task will only run if ZDM tool is already installed.
- name: Stop ZDM service ansible.builtin.shell: | cmd: | {{ zdm_home }}/bin/zdmservice stop args: executable: "/bin/bash" removes: "/u01/app/oracle/product/zdm/bin/zdmservice"
The next task will install some prerequisite if not already installed.
- name: Install ZDM software prerequisites become: true become_user: root ansible.builtin.dnf: name: "{{ item }}" loop: - perl - expect - libaio - glibc-devel - unzip - libnsl - ncurses-compat-libs - oraclelinux-developer-release-el8
The next task will create all needed directories like zdm base, zdm home and the file used to store the installation archive file.
- name: Create directories for ZDM tool become: true become_user: root ansible.builtin.file: path: "{{ item }}" state: directory owner: exauser group: exauser mode: '755' loop: - "{{ zdm_base }}" - "{{ zdm_home }}" - "{{ zdm_download_dir }}"
The next task will unarchive the installation zip file.
- name: Unarchive ZDM ansible.builtin.unarchive: src: "{{ zdm_archive }}" dest: "{{ zdm_download_dir }}"
And the next task will finally installed or update zdm tool according to the option given to the playbook.
- name: Install or update ZDM ansible.builtin.shell: cmd: | {{ zdm_download_dir }}/{{ zdm_install_dir }}/zdminstall.sh \ {{ deploy_option }} oraclehome={{ zdm_home }} oraclebase={{ zdm_base }} \ ziploc={{ zdm_download_dir }}/{{ zdm_install_dir }}/zdm_home.zip -zdm args: executable: "/bin/bash"
And we can finally with the last steps start ZDM service.
- name: Start ZDM service ansible.builtin.shell: | cmd: | {{ zdm_home }}/bin/zdmservice start args: executable: "/bin/bash"
Run the playbook
As prerequisite, let’s first check that the appropriate ZDM installation zip file is in the expected ansible folder.
[[email protected]@admin-host zdm_ansible]$ ls -ltrh ./oracle_swfiles/ total 874M -rw-r--r--. 1 [email protected] [email protected] 871M Jun 11 10:12 V1045330-01.zip [[email protected]@admin-host zdm_ansible]$
We can check that the assert task to ensure we put the appropriate –extra-vars works.
[[email protected]@admin-host zdm_ansible]$ ansible-playbook ./playbooks/deploy_zdm.yml PLAY [Deploy ZDM] *********************************************************************************************************************************************************************************************************************************************************************** TASK [Gathering Facts] ****************************************************************************************************************************************************************************************************************************************************************** [WARNING]: Platform linux on host zdmhost is using the discovered Python interpreter at /usr/bin/python3, but future installation of another Python interpreter could change the meaning of that path. See https://docs.ansible.com/ansible- core/2.15/reference_appendices/interpreter_discovery.html for more information. ok: [zdmhost] TASK [Assert extra-var has been passed as argument to playbook] ************************************************************************************************************************************************************************************************************************* fatal: [zdmhost]: FAILED! => {"msg": "The task includes an option with an undefined variable. The error was: 'deploy_option' is undefined. 'deploy_option' is undefined\n\nThe error appears to be in '/home/nfs/domain.com/myuser/ExaCCGit/zdm_ansible/playbooks/deploy_zdm.yml': line 25, column 7, but may\nbe elsewhere in the file depending on the exact syntax problem.\n\nThe offending line appears to be:\n\n\n - name: Assert extra-var has been passed as argument to playbook\n ^ here\n"} PLAY RECAP ****************************************************************************************************************************************************************************************************************************************************************************** zdmhost : ok=1 changed=0 unreachable=0 failed=1 skipped=0 rescued=0 ignored=0 [[email protected]@admin-host zdm_ansible]$
Then we can run the playbook with the update option.
[[email protected]@admin-host zdm_ansible]$ ansible-playbook ./playbooks/deploy_zdm.yml -e deploy_option="update" PLAY [Deploy ZDM] *********************************************************************************************************************************************************************************************************************************************************************** TASK [Gathering Facts] ****************************************************************************************************************************************************************************************************************************************************************** [WARNING]: Platform linux on host zdmhost is using the discovered Python interpreter at /usr/bin/python3, but future installation of another Python interpreter could change the meaning of that path. See https://docs.ansible.com/ansible- core/2.15/reference_appendices/interpreter_discovery.html for more information. ok: [zdmhost] TASK [Assert extra-var has been passed as argument to playbook] ************************************************************************************************************************************************************************************************************************* ok: [zdmhost] => { "changed": false, "msg": "deploy_option=update" } TASK [Stop ZDM service] ***************************************************************************************************************************************************************************************************************************************************************** changed: [zdmhost] TASK [Install ZDM software prerequisites] *********************************************************************************************************************************************************************************************************************************************** ok: [zdmhost] => (item=perl) ok: [zdmhost] => (item=expect) ok: [zdmhost] => (item=libaio) ok: [zdmhost] => (item=glibc-devel) ok: [zdmhost] => (item=unzip) ok: [zdmhost] => (item=libnsl) ok: [zdmhost] => (item=ncurses-compat-libs) ok: [zdmhost] => (item=oraclelinux-developer-release-el8) TASK [Create directories for ZDM tool] ************************************************************************************************************************************************************************************************************************************************** ok: [zdmhost] => (item=/u01/app/oracle) ok: [zdmhost] => (item=/u01/app/oracle/product/zdm) ok: [zdmhost] => (item=/u01/app/zdm_download_dir) TASK [Unarchive ZDM] ******************************************************************************************************************************************************************************************************************************************************************** ok: [zdmhost] TASK [Install or update ZDM] ************************************************************************************************************************************************************************************************************************************************************ changed: [zdmhost] TASK [Start ZDM service] **************************************************************************************************************************************************************************************************************************************************************** changed: [zdmhost] PLAY RECAP ****************************************************************************************************************************************************************************************************************************************************************************** zdmhost : ok=8 changed=3 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
Check new ZDM version
And we can check that the new ZDM tool version is 21.5.
[zdm@zdmhost ~]$ zdmcli -v RHP_PT.ZDM21_LINUX.X64_240219.12 [zdm@zdmhost ~]$ zdmcli -build version: 21.0.0.0.0 full version: 21.5.0.0.0 patch version: N/A label date: 240219.12 ZDM kit build date: Sep 10 2024 21:59:18 UTC CPAT build version: 24.6.0 [zdm@zdmhost ~]$
To wrap up…
Installing and updating ZDM cli is quite easy, and writing an ansible playbook will help automatising the installation and further update.