Skip to content

Insight and analysis of technology and business strategy

Save Time With This Quick OCI CLI Installation

Editor’s Note: Because our bloggers have lots of useful tips, every now and then we update and bring forward a popular post from the past. We originally published today’s post on April 15, 2019. This is more of a personal reminder than anything else, but hopefully it helps save some time for others trying to install the OCI CLI on their local Linux machines. The idea is to have a very basic set of instructions to install the oci CLI on a Linux box and test it. This includes installing a newer version of Python and setting the system to use it by default. This is easy enough, but introduces an issue that has to be worked around.

The idea

I would usually keep these quite simple things to myself in a simple text file for my own reference. However, lately I've discovered that what I consider to be very basic Linux knowledge is either not-so-basic or not as widely spread among Oracle DBAs as I thought. So, this is not only to benefit my own memory but to try and help others out there that may struggle a bit with Linux-related stuff.

Installation

Both the automated and the manual installation procedures are well-documented but there is an interesting caveat I discovered while installing in my Oracle Linux 7.6 laboratory VM. I tried the automated procedure because I'm one for automating stuff and I didn't want to deep dive into this particular procedure. So, simply following the instructions, I proceeded to execute the curl command to download and install the CLI. Please, note the highlighted line (25) in the code below:
[oracle@orapex ~]$ bash -c "$(curl -L https://raw.githubusercontent.com/oracle/oci-cli/master/scripts/install/install.sh)"
  % Total % Received % Xferd Average Speed Time Time Time Current
  Dload Upload Total Spent Left Speed
 100 6283 100 6283 0 0 14095 0 --:--:-- --:--:-- --:--:-- 14087
 Downloading Oracle Cloud Infrastructure CLI install script from https://raw.githubusercontent.com/oracle/oci-cli/6dc61e3b5fd2781c5afff2decb532c24969fa6bf/scripts/install/install.py to /tmp/oci_cli_install_tmp_LA0m.
 ######################################################################## 100.0%
 Python3 not found on system PATH
 Running install script.
 python /tmp/oci_cli_install_tmp_LA0m < /dev/tty -- Verifying Python version. -- Python version 2.7.5 okay. -- Verifying native dependencies. -- Unable to verify native dependencies. dist=oracle linux server, version=7.5. Continuing... ===> In what directory would you like to place the install? (leave blank to use '/home/oracle/lib/oracle-cli'): 
 -- Creating directory '/u01/userhome/oracle/lib/oracle-cli'.
 -- We will install at '/u01/userhome/oracle/lib/oracle-cli'.
 ===> In what directory would you like to place the 'oci' executable? (leave blank to use '/home/oracle/bin'): 
 -- The executable will be in '/u01/userhome/oracle/bin'.
 ===> In what directory would you like to place the OCI scripts? (leave blank to use '/home/oracle/bin/oci-cli-scripts'): 
 -- Creating directory '/u01/userhome/oracle/bin/oci-cli-scripts'.
 -- The scripts will be in '/u01/userhome/oracle/bin/oci-cli-scripts'.
 -- Downloading virtualenv package from https://github.com/pypa/virtualenv/archive/15.0.0.tar.gz.
 -- Downloaded virtualenv package to /tmp/tmpRjNdhT/15.0.0.tar.gz.
 -- Checksum of /tmp/tmpRjNdhT/15.0.0.tar.gz OK.
 -- Extracting '/tmp/tmpRjNdhT/15.0.0.tar.gz' to '/tmp/tmpRjNdhT'.
 -- Executing: ['/usr/bin/python', 'virtualenv.py', '--python', '/usr/bin/python', '/u01/userhome/oracle/lib/oracle-cli']
 Already using interpreter /usr/bin/python
 New python executable in /u01/userhome/oracle/lib/oracle-cli/bin/python
 Installing setuptools, pip, wheel...done.
 -- Executing: ['/u01/userhome/oracle/lib/oracle-cli/bin/pip', 'install', '--cache-dir', '/tmp/tmpRjNdhT', 'oci_cli', '--upgrade']
 DEPRECATION: Python 2.7 will reach the end of its life on January 1st, 2020. Please upgrade your Python as Python 2.7 won't be maintained after that date. A future version of pip will drop support for Python 2.7.
 Collecting oci_cli
  Downloading https://files.pythonhosted.org/packages/83/aa/922fc63808ffc79d114474bef9af8b4a066e4653898b6df427cfcf98f166/oci_cli-2.5.5-py2.py3-none-any.whl (3.8MB)
  100% |------------------------------| 3.8MB 6.4MB/s 
 (:..)
  Downloading https://files.pythonhosted.org/packages/68/9e/49196946aee219aead1290e00d1e7fdeab8567783e83e1b9ab5585e6206a/pycparser-2.19.tar.gz (158kB)
  100% |------------------------------| 163kB 25.2MB/s 
 Building wheels for collected packages: arrow, configparser, terminaltables, retrying, PyYAML, pycparser
  Building wheel for arrow (setup.py) ... done
  Stored in directory: /tmp/tmpRjNdhT/wheels/ce/4f/95/64541c7466fd88ffe72fda5164f8323c91d695c9a77072c574
  Building wheel for configparser (setup.py) ... done
  Stored in directory: /tmp/tmpRjNdhT/wheels/a3/61/79/424ef897a2f3b14684a7de5d89e8600b460b89663e6ce9d17c
  Building wheel for terminaltables (setup.py) ... done
  Stored in directory: /tmp/tmpRjNdhT/wheels/30/6b/50/6c75775b681fb36cdfac7f19799888ef9d8813aff9e379663e
  Building wheel for retrying (setup.py) ... done
  Stored in directory: /tmp/tmpRjNdhT/wheels/d7/a9/33/acc7b709e2a35caa7d4cae442f6fe6fbf2c43f80823d46460c
  Building wheel for PyYAML (setup.py) ... done
  Stored in directory: /tmp/tmpRjNdhT/wheels/ad/da/0c/74eb680767247273e2cf2723482cb9c924fe70af57c334513f
  Building wheel for pycparser (setup.py) ... done
  Stored in directory: /tmp/tmpRjNdhT/wheels/f2/9a/90/de94f8556265ddc9d9c8b271b0f63e57b26fb1d67a45564511
 Successfully built arrow configparser terminaltables retrying PyYAML pycparser
 Installing collected packages: idna, six, python-dateutil, arrow, jmespath, configparser, enum34, pycparser, cffi, asn1crypto, ipaddress, cryptography, pyOpenSSL, httpsig-cffi, terminaltables, click, cx-Oracle, retrying, pytz, PyYAML, certifi, oci, oci-cli
 Successfully installed PyYAML-3.13 arrow-0.10.0 asn1crypto-0.24.0 certifi-2019.3.9 cffi-1.12.2 click-6.7 configparser-3.5.0 cryptography-2.4.2 cx-Oracle-7.0.0 enum34-1.1.6 httpsig-cffi-15.0.0 idna-2.6 ipaddress-1.0.22 jmespath-0.9.3 oci-2.2.4 oci-cli-2.5.5 pyOpenSSL-18.0.0 pycparser-2.19 python-dateutil-2.7.3 pytz-2016.10 retrying-1.3.3 six-1.11.0 terminaltables-3.1.0
 ===> Modify profile to update your $PATH and enable shell/tab completion now? (Y/n): Y
 ===> Enter a path to an rc file to update (leave blank to use '/home/oracle/.bashrc'): 
 -- Backed up '/u01/userhome/oracle/.bashrc' to '/u01/userhome/oracle/.bashrc.backup'
 -- Tab completion set up complete.
 -- If tab completion is not activated, verify that '/u01/userhome/oracle/.bashrc' is sourced by your shell.
 -- 
 -- ** WARNING: Other 'oci' or 'bmcs' executables are on your $PATH. **
 -- Conflicting paths: /home/oracle/bin/oci, /home/oracle/bin/bmcs, /home/oracle/bin/oci, /home/oracle/bin/bmcs, /home/oracle/bin/oci, /home/oracle/bin/bmcs, /home/oracle/bin/oci, /home/oracle/bin/bmcs
 -- You can run this installation of the CLI with '/u01/userhome/oracle/bin/oci'.
 -- 
 -- ** Run `exec -l $SHELL` to restart your shell. **
 -- 
 -- Installation successful.
 -- Run the CLI with /u01/userhome/oracle/bin/oci --help
The highlighted line offers a deprecation warning for the currently available Python version, so I decided to have Python 3 installed for the CLI to use.

Python installation

This is a simple call to yum to install the package python36.
[root@orapex ~]# yum install -y python36
 Loaded plugins: langpacks, ulninfo
 Resolving Dependencies
 --> Running transaction check
 ---> Package python36.x86_64 0:3.6.6-2.el7 will be installed
 --> Processing Dependency: python36-libs(x86-64) = 3.6.6-2.el7 for package: python36-3.6.6-2.el7.x86_64
 --> Processing Dependency: libpython3.6m.so.1.0()(64bit) for package: python36-3.6.6-2.el7.x86_64
 --> Running transaction check
 ---> Package python36-libs.x86_64 0:3.6.6-2.el7 will be installed
 --> Finished Dependency Resolution
 Dependencies Resolved
 ===================================================================================================================================================================================================================
  Package Arch Version Repository Size
 ===================================================================================================================================================================================================================
 Installing:
  python36 x86_64 3.6.6-2.el7 ol7_developer_EPEL 65 k
 Installing for dependencies:
  python36-libs x86_64 3.6.6-2.el7 ol7_developer_EPEL 8.5 M
 Transaction Summary
 ===================================================================================================================================================================================================================
 Install 1 Package (+1 Dependent package)
 Total download size: 8.6 M
 Installed size: 36 M
 Downloading packages:
 (1/2): python36-libs-3.6.6-2.el7.x86_64.rpm | 8.5 MB 00:00:01 
 (2/2): python36-3.6.6-2.el7.x86_64.rpm | 65 kB 00:00:03 
 -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
 Total 2.6 MB/s | 8.6 MB 00:00:03 
 Running transaction check
 Running transaction test
 Transaction test succeeded
 Running transaction
  Installing : python36-libs-3.6.6-2.el7.x86_64 1/2 
  Installing : python36-3.6.6-2.el7.x86_64 2/2 
  Verifying : python36-3.6.6-2.el7.x86_64 1/2 
  Verifying : python36-libs-3.6.6-2.el7.x86_64 2/2 
 Installed:
  python36.x86_64 0:3.6.6-2.el7 
 Dependency Installed:
  python36-libs.x86_64 0:3.6.6-2.el7 
 Complete!
 [root@orapex ~]# python -V
 Python 2.7.5
 [root@orapex ~]# python36 -V
 Python 3.6.6
As you may have noted, in order to use the new version of Python, we would use the python36 command, while python will call version 2.7. This is a little problem when the oci CLI will call python and we want it to be the latest version. In order to solve this little problem, I decided to go for Linux alternatives. This is a command to help maintain symbolic links to determine default commands system-wide. I've highlighted "system-wide" for a good reason we'll see below. Using alternatives is pretty straightforward. It requires a simple call defining the new symbolic link and the command it points to, plus a priority value. In my case, I opted for creating the same link for Python 2 and Python 3, giving a higher priority to Python 3. This means the system will first try Python 3, then Python 2 if the first one is not available.
[root@orapex ~]# alternatives --install /usr/bin/python python /bin/python36 2
 [root@orapex ~]# alternatives --install /usr/bin/python python /bin/python 1
 [root@orapex ~]# alternatives --display python
 python - status is auto.
  link currently points to /bin/python36
 /bin/python36 - priority 2
 /bin/python - priority 1
 Current 'best' version is /bin/python36.
 [oracle@orapex ~]$ python -V
 Python 3.6.6

System-wide change means trouble

At this point we have the OCI CLI installed and using Python 3 for its calls, so we are fine here. Fortunately, I was following the steps found in this blog post to configure alternatives properly and it includes an appendix. In this appendix, the post mentions a problem that appears in yum once the system-wide switch to Python 3 has completed. Also, fortunately, the post provides the solution / workaround for it, which I immediately applied. The solution is pretty simple; just modify the yum Python scripts to use the older Python version. There are two files to modify:
[root@orapex ~]# yum search python
  File "/bin/yum", line 30
  except KeyboardInterrupt, e:
  ^
 SyntaxError: invalid syntax
 [root@orapex ~]# head -1 /usr/bin/yum
 #!/usr/bin/python
 [root@orapex ~]# vi /usr/bin/yum
 [root@orapex ~]# head -1 /usr/bin/yum
 #!/usr/bin/python2.7
 [root@orapex ~]# yum search python |more
 Loaded plugins: langpacks, ulninfo
 ============================= N/S matched: python ==============================
 GitPython.noarch : Python Git Library
 (...)
 [root@orapex ~]# head -1 /usr/libexec/urlgrabber-ext-down
 #! /usr/bin/python
 [root@orapex ~]# vim /usr/libexec/urlgrabber-ext-down
 [root@orapex ~]# head -1 /usr/libexec/urlgrabber-ext-down
 #! /usr/bin/python2.7
With these simple steps, we have the OCI CLI installed and working with the latest Python version, until a Python 4 version comes in, but now we know how to use alternatives to fix it. The next step is to use the CLI itself to create a configuration file to access our OCI tenancy resources and start working, but that will be in another blog post. Thank you for reading.

Top Categories

  • There are no suggestions because the search field is empty.

Tell us how we can help!

dba-cloud-services
Upcoming-Events-banner