OCI-CLIオフライン・インストールの手順

このシリーズの他の記事は、[オラクル・クラウドの個人ブログ一覧 ](https://qiita.com/letian/items/10152a4fec813c1b7d98)からご覧いただけます。

# 初めに
インターネットにアクセスできないサーバーに OCI-CLI をインストールしたい方がいます。例えば、サービスGW のみを使用して、プライベートサブネットに存在する OCI Compute インスタンスに OCI-CLI をインストールする場合です。このような要件に対し、オフラインインストールの手順を提供します。

__環境情報__
|項目|バージョン|
|:--|:--|
|Windows OS|Windows Server 2019 Standard (OCI VM)|
|Linux OS|Oracle Linux 8 (OCI VM)|
|Python|3.11.9 (for Windows), 3.6.8 (for Linux)|
|OCI CLI|3.44.3|

※、CLIは、OCI上の<strong>Oracle Linux 9</strong>にインストール済みです。。
※、OSによってサポートされるPythonのバージョンが異なります。詳しくは[こちら](https://docs.oracle.com/ja-jp/iaas/Content/API/Concepts/cliconcepts.htm#Requirements__SupportedPythonVersionsandOperatingSystems)をご参照ください。

# 目次
- [Windowsサーバにインストールする場合](#windowsサーバにインストールする場合)
  - [1. Pythonをオフラインでインストールする](#1-pythonをオフラインでインストールする)
  - [2. OCI-CLIをオフラインでインストールする](#2-oci-cliをオフラインでインストールする)
- [Oracle Linux 8にインストールする場合](#oracle-linux-8にインストールする場合)
- [トラブルシューティング](#トラブルシューティング)

# Windowsサーバにインストールする場合
## 1. Pythonをオフラインでインストールする
OCI-CLIをインストールする前に、Pythonをインストールする必要があります。

__1-1. インストーラのダウンロード__
インターネットにアクセスできるクライアントからPythonのインストーラーをダウンロードします。
URL: https://www.python.org/downloads/

この例では、Python <strong>3.11.9</strong> を選択します。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/9ba7e67b-d7a3-c582-a08c-7696ae1f8b03.png", width="500">

この例では、<strong>Windows installer (64-bit)</strong> を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/dc9b4218-f7d2-2784-fc14-007e66d8e518.png)

インストーラー・ファイル名: `python-3.11.9-amd64.exe`

__1-2. ファイルコピー__
インストーラー・ファイルを、インストール先の Windowsサーバーにコピーします。

__1-3. オフライン・インストール__
インストーラーファイルを管理者として実行します。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/081eecce-dd3d-d890-b42b-4fcf9fab7914.png", width="500">

インストールが完了したら、「Disable path length limit」をクリックします。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/24916ddf-0607-a10e-1ad1-9917fde4a452.png", width="500">

「Disable path length limit」の表示が消えたら、"Close"を押し画面を閉じます。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/9fa9e3f9-89e4-1855-c7a1-06308f5e349e.png", width="500">

Pythonのバージョンを確認します。
```bat
C:\Users\opc>python -V
Python 3.11.9
```

## 2. OCI-CLIをオフラインでインストールする
__2-1. インストーラのダウンロード__
インターネットにアクセスできるクライアントからOCI-CLIのインストーラーをダウンロードします。
URL: https://github.com/oracle/oci-cli/releases
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/c9c85c4a-d8cf-fb77-82d3-1ad47ce6ff8c.png", width="500">

インストーラー・ファイル名: `oci-cli-3.44.3-Windows-Server-2019-Offline.zip`

__2-2. ファイルコピー__
zipファイルを、ターゲット・サーバーにコピーします。

__2-3. ファイル解凍__
zipファイルを解凍すると、これらのファイルを取得できます。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/8a6fb69e-c2a1-999f-db6c-4459f3249ccd.png", width="600">

__2-4. オフライン・インストール__
PowerShell を起動し、次のコマンドを実行します。
`install.ps1 -OfflineInstall`.

このテストでは、プロンプトが表示されたときにリターンキー（デフォルト）を押しました。
```PowerShell
PS C:\Users\opc\Downloads\oci-cli-installation> .\install.ps1 -OfflineInstall

        ******************************************************************************
        You have started the OCI CLI Installer in interactive mode. If you do not wish
        to run this in interactive mode, please include the -AcceptAllDefaults option.
        If you have the script locally and would like to know more about
        input options for this script, then you can run:
        help .\install.ps1
        If you would like to know more about input options for this script, refer to:
        https://github.com/oracle/oci-cli/blob/master/scripts/install/README.rst
        ******************************************************************************

        ******************************************************************************
        Starting OCI CLI Offline Installation
        ******************************************************************************
VERBOSE: Python found in registry: HKCU:\Software\Python\PythonCore
VERBOSE:  False     False
VERBOSE: Using Python executable: C:\Users\opc\AppData\Local\Programs\Python\Python311\python.exe to run install
script...
VERBOSE: Arguments to python script: "C:\Users\opc\Downloads\oci-cli-installation\install.py" --offline-install
-- Verifying Python version.
-- Python version 3.11.9 okay.

===> In what directory would you like to place the install? (leave blank to use 'C:\Users\opc\lib\oracle-cli'):
-- Creating directory 'C:\Users\opc\lib\oracle-cli'.
-- We will install at 'C:\Users\opc\lib\oracle-cli'.

===> In what directory would you like to place the 'oci.exe' executable? (leave blank to use 'C:\Users\opc\bin'):
-- Creating directory 'C:\Users\opc\bin'.
-- The executable will be in 'C:\Users\opc\bin'.

===> In what directory would you like to place the OCI scripts? (leave blank to use 'C:\Users\opc\bin\oci-cli-scripts'):
-- Creating directory 'C:\Users\opc\bin\oci-cli-scripts'.
-- The scripts will be in 'C:\Users\opc\bin\oci-cli-scripts'.
-- Trying to use python3 venv.
-- Executing: ['C:\\Users\\opc\\AppData\\Local\\Programs\\Python\\Python311\\python.exe', '-m', 'venv', 'C:\\Users\\opc\\lib\\oracle-cli']
-- Executing: ['C:\\Users\\opc\\lib\\oracle-cli\\Scripts\\python.exe', '-m', 'pip', 'install', 'pip', '--upgrade', '--find-links', 'cli-deps\\python311.html', '--no-index']
Looking in links: cli-deps\python311.html
Requirement already satisfied: pip in c:\users\opc\lib\oracle-cli\lib\site-packages (24.0)
Processing c:\users\opc\downloads\oci-cli-installation\cli-deps\pip-24.1.2-py3-none-any.whl
Installing collected packages: pip
  Attempting uninstall: pip
    Found existing installation: pip 24.0
    Uninstalling pip-24.0:
      Successfully uninstalled pip-24.0
Successfully installed pip-24.1.2
-- Executing: ['C:\\Users\\opc\\lib\\oracle-cli\\Scripts\\pip', 'install', 'oci_cli', '--find-links', 'cli-deps/python311.html', '--no-index', '--ignore-requires-python']
Looking in links: cli-deps/python311.html
Processing c:\users\opc\downloads\oci-cli-installation\cli-deps\oci_cli-3.44.3-py3-none-any.whl
Processing c:\users\opc\downloads\oci-cli-installation\cli-deps\oci-2.129.3-py3-none-any.whl (from oci_cli)
Processing c:\users\opc\downloads\oci-cli-installation\cli-deps\arrow-1.3.0-py3-none-any.whl (from oci_cli)
Processing c:\users\opc\downloads\oci-cli-installation\cli-deps\certifi-2024.7.4-py3-none-any.whl (from oci_cli)
Processing c:\users\opc\downloads\oci-cli-installation\cli-deps\click-8.0.4-py3-none-any.whl (from oci_cli)
Processing c:\users\opc\downloads\oci-cli-installation\cli-deps\cryptography-42.0.8-cp39-abi3-win_amd64.whl (from oci_cli)
Processing c:\users\opc\downloads\oci-cli-installation\cli-deps\jmespath-0.10.0-py2.py3-none-any.whl (from oci_cli)
Processing c:\users\opc\downloads\oci-cli-installation\cli-deps\python_dateutil-2.9.0.post0-py2.py3-none-any.whl (from oci_cli)
Processing c:\users\opc\downloads\oci-cli-installation\cli-deps\pytz-2024.1-py2.py3-none-any.whl (from oci_cli)
Processing c:\users\opc\downloads\oci-cli-installation\cli-deps\six-1.16.0-py2.py3-none-any.whl (from oci_cli)
Processing c:\users\opc\downloads\oci-cli-installation\cli-deps\terminaltables-3.1.10-py2.py3-none-any.whl (from oci_cli)
Processing c:\users\opc\downloads\oci-cli-installation\cli-deps\pyopenssl-24.1.0-py3-none-any.whl (from oci_cli)
Processing c:\users\opc\downloads\oci-cli-installation\cli-deps\pyyaml-6.0.1-cp311-cp311-win_amd64.whl (from oci_cli)
Processing c:\users\opc\downloads\oci-cli-installation\cli-deps\prompt_toolkit-3.0.43-py3-none-any.whl (from oci_cli)
Processing c:\users\opc\downloads\oci-cli-installation\cli-deps\colorama-0.4.6-py2.py3-none-any.whl (from click==8.0.4->
oci_cli)
Processing c:\users\opc\downloads\oci-cli-installation\cli-deps\circuitbreaker-1.4.0.tar.gz (from oci==2.129.3->oci_cli)
  Installing build dependencies ... done
  Getting requirements to build wheel ... done
  Preparing metadata (pyproject.toml) ... done
Processing c:\users\opc\downloads\oci-cli-installation\cli-deps\types_python_dateutil-2.9.0.20240316-py3-none-any.whl (from arrow>=1.0.0->oci_cli)
Processing c:\users\opc\downloads\oci-cli-installation\cli-deps\cffi-1.16.0-cp311-cp311-win_amd64.whl (from cryptography<43.0.0,>=3.2.1->oci_cli)
Processing c:\users\opc\downloads\oci-cli-installation\cli-deps\wcwidth-0.2.13-py2.py3-none-any.whl (from prompt-toolkit<=3.0.43,>=3.0.38->oci_cli)
Processing c:\users\opc\downloads\oci-cli-installation\cli-deps\pycparser-2.22-py3-none-any.whl (from cffi>=1.12->cryptography<43.0.0,>=3.2.1->oci_cli)
Building wheels for collected packages: circuitbreaker
  Building wheel for circuitbreaker (pyproject.toml) ... done
  Created wheel for circuitbreaker: filename=circuitbreaker-1.4.0-py3-none-any.whl size=7554 sha256=27b49726fbe73f0cb2a57a2916b3a921bd49758fde35594726e1221a57ab11b0
  Stored in directory: c:\users\opc\appdata\local\pip\cache\wheels\5c\b4\86\6493e7ad366f02b93f598fb48149e9e40a2726fdde8f24be1b
Successfully built circuitbreaker
Installing collected packages: wcwidth, types-python-dateutil, terminaltables, six, PyYAML, pytz, pycparser, jmespath, colorama, circuitbreaker, certifi, python-dateutil, prompt-toolkit, click, cffi, cryptography, arrow, pyOpenSSL, oci, oci_cli
Successfully installed PyYAML-6.0.1 arrow-1.3.0 certifi-2024.7.4 cffi-1.16.0 circuitbreaker-1.4.0 click-8.0.4 colorama-0.4.6 cryptography-42.0.8 jmespath-0.10.0 oci-2.129.3 oci_cli-3.44.3 prompt-toolkit-3.0.43 pyOpenSSL-24.1.0 pycparser-2.22 python-dateutil-2.9.0.post0 pytz-2024.1 six-1.16.0 terminaltables-3.1.10 types-python-dateutil-2.9.0.20240316 wcwidth-0.2.13

===> Modify PATH to include the CLI and enable tab completion in PowerShell now? (Y/n): y

-- ** Close and re-open PowerShell to reload changes to your PATH **
-- In order to run the autocomplete script, you may also need to set your PowerShell execution policy to allow for running local scripts (as an Administrator run Set-ExecutionPolicy RemoteSigned in a PowerShell prompt)

-- Installation successful.

Announcement
============
1. Interactive mode now available in CLI
Have you tried the new interactive features in OCI CLI yet? You can get started by typing `oci -i`.
Learn more by watching our informative video on YouTube -> https://www.youtube.com/watch?v=lX29Xw1Te54&ab_channel=OracleLearning
Also see https://docs.oracle.com/iaas/Content/API/SDKDocs/cliusing_topic-Using_Interactive_Mode.htm
============

-- Run the CLI with C:\Users\opc\bin\oci.exe --help
VERBOSE: Successfully installed OCI CLI!
PS C:\Users\opc\Downloads\oci-cli-installation>
```

OCI-CLIのバージョンを確認します。
```PowerShell
PS C:\Users\opc\Downloads\oci-cli-installation> oci -v
3.44.3
```

構成ファイルの設定については省略します。詳しくは[ドキュメント](https://docs.oracle.com/ja-jp/iaas/Content/API/SDKDocs/cliinstall.htm#configfile)をご参考ください。

# Oracle Linux 8にインストールする場合
Oracle Linux 8ではPythonが既にインストールされています。

```bash
[opc@ol8 ~]$ python -V
Python 3.6.8
```
__インストーラのダウンロード__
インターネットにアクセスできるクライアントからOCI-CLIのインストーラーをダウンロードします。
URL: https://github.com/oracle/oci-cli/releases
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/aacd51c7-7225-dd45-f6ee-3ce86595173c.png", width="500">

インストーラー・ファイル名: `oci-cli-3.44.3-Oracle-Linux-8-Offline.zip`

__ファイルコピー__
zipファイルをターゲット・サーバーにコピーします（例：`scp`）。

__ファイル解凍__
zipファイルを解凍します。

```bash
[opc@ol8 ~]$ unzip oci-cli-3.44.3-Oracle-Linux-8-Offline.zip
```

__オフライン・インストール__
`bash install.sh --offline-install`を実行します。

```bash
[opc@ol8 oci-cli-installation]$ pwd
/home/opc/oci-cli-installation
[opc@ol8 oci-cli-installation]$ ll
total 60
drwxrwxr-x. 2 opc opc  4096 Jul 18 18:09 cli-deps
-rwxrwxr-x. 1 opc opc 36648 Jul 18 18:08 install.py
-rwxr-xr-x. 1 opc opc 16926 Jul 18 18:08 install.sh
[opc@ol8 oci-cli-installation]$ bash install.sh --offline-install

    ******************************************************************************
    You have started the OCI CLI Installer in interactive mode. If you do not wish
    to run this in interactive mode, please include the --accept-all-defaults option.
    If you have the script locally and would like to know more about
    input options for this script, then you can run:
    ./install.sh -h
    If you would like to know more about input options for this script, refer to:
    https://github.com/oracle/oci-cli/blob/master/scripts/install/README.rst
    ******************************************************************************
Starting OCI CLI Offline Installation
<中略>
-- Installation successful.
<中略>
```

OCI-CLIのバージョンを確認します。
```bash
[opc@ol8 oci-cli-installation]$ oci -v
/home/opc/lib/oracle-cli/lib64/python3.6/site-packages/oci/_vendor/httpsig_cffi/sign.py:10: CryptographyDeprecationWarning: Python 3.6 is no longer supported by the Python core team. Therefore, support for it is deprecated in cryptography. The next release of cryptography will remove support for Python 3.6.
  from cryptography.hazmat.backends import default_backend  # noqa: F401
3.44.3
```
※、Python 3.6を使用している場合、上記の警告メッセージが表示されますが、OCI-CLIの使用には特に影響はありません。Python 3.8にアップグレードすると、警告メッセージは消えます。
```bash
[opc@ol8 ~]$ python -V
Python 3.8.17
[opc@ol8 ~]$ oci -v
3.44.3
```

# トラブルシューティング
## 1. Pythonがインストールされていない
現象：`install.ps1 -OfflineInstall`を実行した直後に、次のエラーが発生した。
```
VERBOSE: No valid Python installation found.
VERBOSE: Exiting script. Offline installation requires Python3.5+ to be installed, Please install Python manually and
re-run.
```
原因：pythonがインストールされていない。
対策：[このステップ](#1-pythonをオフラインでインストールする)を先行に実施してください。

## 2. Windowsファイル名の長さが制限を超えた
現象：`install.ps1 -OfflineInstall`を実行した際に、次のエラーが発生した。
```
Installing collected packages: wcwidth, types-python-dateutil, terminaltables, six, PyYAML, pytz, pycparser, jmespath, colorama, circuitbreaker, certifi, python-dateutil, prompt-toolkit, click, cffi, cryptography, arrow, pyOpenSSL, oci, oci_cli
ERROR: Could not install packages due to an OSError: [Errno 2] No such file or directory: 'C:\\Users\\opc\\lib\\oracle-cli\\Lib\\site-packages\\oci_cli\\help_text_producer\\data_files\\text\\cmdref\\database-management\\managed-database\\enable-external-pluggable-database-management-feature-external-pluggable-database-diagnostics-and-management-feature-details.txt'
HINT: This error might have occurred since this system does not have Windows Long Path support enabled. You can find information on how to enable this at https://pip.pypa.io/warnings/enable-long-paths
```
原因：次のファイル（フルパス）の長さが<strong>260</strong>文字の制限を超えてしまった。
`C:\Users\opc\lib\oracle-cli\Lib\site-packages\oci_cli\help_text_producer\data_files\text\cmdref\database-management\managed-database\enable-external-pluggable-database-management-feature-external-pluggable-database-diagnostics-and-management-feature-details.txt`

対策-1：Pythonをインストールした後、「<strong>Disable path length limit</strong>」をクリックする。
対策-2：Windowsサーバのレジストリを手動編集する。
PATH: `HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem`
Item: `LongPathsEnabled`
Value: `1`
※、デフォルト値は0（無効）であり、1（有効）に変更する。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/418d3c0a-7513-6b51-e561-1531995f0682.png", width="300">

## 3. オフライン・アップデートしょうとすると、タイムアウトが発生した。
現象：`pip install oci-cli --upgrade`を実行すると、タイムアウトが発生しアップデートできない。（メッセージ：`Connection to pypi.org timed out`）
原因：オフライン・アップデートがサポートされていない。
対策：古いバージョンをアンインストールしてから、最新バージョンを再インストールしてください。

以上

----

__関連記事__
[オラクル・クラウドの個人ブログ一覧](https://qiita.com/letian/items/10152a4fec813c1b7d98)
[便利なOCI CLIコマンド例](https://qiita.com/letian/items/ed30da7a4d37a56ba8bc)
[OCIインスタンスの自動起動・停止](https://qiita.com/letian/items/2f059ec0ce4139632a11)
[OCI-CLIについてのFAQ (よくある質問)](https://qiita.com/letian/items/890e3f285c0dff93509f)

----
# ドキュメント
__OCI Doc__
オフライン・インストール: [英語](https://docs.oracle.com/en-us/iaas/Content/API/SDKDocs/climanualinst.htm#InstallingCLI_Offline) [日本語](https://docs.oracle.com/ja-jp/iaas/Content/API/SDKDocs/climanualinst.htm#InstallingCLI_Offline)
サポートされるPythonバージョンおよびオペレーティング・システム: [英語](https://docs.oracle.com/en-us/iaas/Content/API/Concepts/cliconcepts.htm#Requirements__SupportedPythonVersionsandOperatingSystems) [日本語](https://docs.oracle.com/ja-jp/iaas/Content/API/Concepts/cliconcepts.htm#Requirements__SupportedPythonVersionsandOperatingSystems)

__My Oracle Support(MOS) Doc__
OCI Command Line Interface (CLI) - Installation on an Offline Windows Instance [Video] ([Doc ID 2922241.1](https://support.oracle.com/knowledge/Oracle%20Cloud/2922241_1.html))