ノート:
- このチュートリアルは、Oracle提供の無料ラボ環境で入手できます。
- Oracle Cloud Infrastructureの資格証明、テナンシおよびコンパートメントの値の例を使用します。演習を完了するときに、これらの値をクラウド環境に固有の値に置き換えます。
クラスタ化されたデプロイメントへのOracle Linux Automation Managerの移行
イントロダクション
以前のリリースからアップグレードする場合でも、単一ホストのインストールから開始する場合でも、両方の環境をクラスタ化されたデプロイメントに移行できます。管理者は、クラスタがコントロール・プレーン、実行ノードおよびホップ・ノードとリモート・データベースの組合せで構成されている可能性があるため、移行前にトポロジを計画する必要があります。
このチュートリアルに従うと、1つのホスト・インストールをリモート・データベースを使用したクラスタ化されたデプロイメントに移行する方法がわかります。
目的
このチュートリアルでは、次の方法を学習します。
- リモート・データベースの設定
- クラスタ化されたデプロイメントへの移行
前提条件
-
Oracle Linux Automation Managerがインストールされているシステム。
Oracle Linux Automation Managerのインストールの詳細は、『Oracle Linux Automation Managerインストレーション・ガイド』を参照してください。
Oracle Linux Automation Managerのデプロイ
ノート:独自のテナンシで実行している場合は、linux-virt-labs
GitHubプロジェクトREADME.mdを読み、演習環境をデプロイする前に前提条件を完了してください。
-
Lunaデスクトップでターミナルを開きます。
-
linux-virt-labs
GitHubプロジェクトをクローニングします。git clone https://github.com/oracle-devrel/linux-virt-labs.git
-
作業ディレクトリに移動します。
cd linux-virt-labs/olam
-
必要なコレクションをインストールします。
ansible-galaxy collection install -r requirements.yml
-
Oracle Linuxインスタンス構成を更新します。
cat << EOF | tee instances.yml > /dev/null compute_instances: 1: instance_name: "olam-node" type: "control" 2: instance_name: "exe-node" type: "execution" 3: instance_name: "db-node" type: "db" passwordless_ssh: true add_cluster_ports: true EOF
-
演習環境をデプロイします。
ansible-playbook create_instance.yml -e ansible_python_interpreter="/usr/bin/python3.6" -e "@instances.yml" -e olam_single_host=true
無料のラボ環境では、Oracle Cloud Infrastructure SDK for Python用のRPMパッケージをインストールするため、追加の変数
ansible_python_interpreter
が必要です。このパッケージのインストール場所は、python3.6モジュールの下にあります。デフォルトのデプロイメント・シェイプでは、AMD CPUおよびOracle Linux 8が使用されます。Intel CPUまたはOracle Linux 9を使用するには、デプロイメント・コマンドに
-e instance_shape="VM.Standard3.Flex"
または-e os_version="9"
を追加します。重要:プレイブックが正常に実行されるまで待機し、一時停止タスクに到達します。Oracle Linux Automation Managerのインストールはプレイブックのこの段階で完了し、インスタンスの準備ができました。デプロイするノードのパブリックIPアドレスとプライベートIPアドレスを出力する前の再生に注意してください。
WebUIにログインします。
-
端末を開き、Oracle Linux Automation ManagerへのSSHトンネルを構成します。
ssh -L 8444:localhost:443 oracle@<hostname_or_ip_address>
無料の演習環境では、lamノード・インスタンスの外部IPアドレスを使用します。
-
Webブラウザを開き、URLを入力します。
https://localhost:8444
ノート:使用するブラウザに基づいてセキュリティ警告を承認します。Chromeの場合、**「詳細」ボタンをクリックし、「localhostに進む(安全でない)」リンクをクリックします。
-
「ユーザー名」が
admin
で、「パスワード」がadmin
で自動デプロイメント中に作成されたOracle Linux Automation Managerにログインします。 -
ログインすると、WebUIが表示されます。
クラスタ・デプロイメントへの移行
Oracle Linux Automation Managerは単一ホスト・デプロイメントとして動作しますが、リモート・データベースと個別のコントロール・プレーンおよび実行ノードを含むクラスタとして実行することもサポートします。インストールによって、単一ホスト・インスタンスがhybrid
ノードとして構成されます。クラスタ・デプロイメントに移行する最初のステップは、このインスタンスをcontrol plane
ノードに変換することです。
様々なインストール・トポロジの詳細は、Oracle Linux Automation Managerインストレーション・ガイドのインストールの計画の章を参照してください。
コントロール・プレーン・ノードの準備
-
Oracle Linux Automation Managerを実行しているolam-nodeインスタンスに接続されている端末に切り替えます。
ノート:これからは、このインスタンスをコントロール・プレーン・ノードと呼びます。
-
Oracle Linux Automation Managerサービスを停止します。
sudo systemctl stop ol-automation-manager
-
データベースのバックアップを作成します。
sudo su - postgres -c 'pg_dumpall > /tmp/olamv2_db_dump'
リモート・データベースのインストール
-
データベース・バックアップをコントロール・プレーン・ノードから新しいリモート・データベース・ホストにコピーします。
scp /tmp/olamv2_db_dump oracle@db-node:/tmp/
scp
コマンドは、ノード間のSSH接続を使用して通信します。この接続は、インスタンス間でパスワードなしのSSHログインを構成している無料の演習環境が原因で可能です。 -
sshを介してdb-nodeインスタンスに接続します。
ssh oracle@db-node
-
データベース・モジュール・ストリームを有効にします。
Oracle Linux Automation Managerでは、Postgresqlデータベース・バージョン12または13を使用できます。このチュートリアルでは、バージョン13モジュール・ストリームを使用および有効化します。
sudo dnf -y module reset postgresql sudo dnf -y module enable postgresql:13
-
データベース・サーバーをインストールします。
sudo dnf -y install postgresql-server
-
データベース・ファイアウォール・ルールを追加します。
sudo firewall-cmd --add-port=5432/tcp --permanent sudo firewall-cmd --reload
-
データベースを初期化します。
sudo postgresql-setup --initdb
-
データベースのデフォルト記憶域アルゴリズムを設定します。
sudo sed -i "s/#password_encryption.*/password_encryption = scram-sha-256/" /var/lib/pgsql/data/postgresql.conf
このデータベース機能の詳細は、アップストリーム・ドキュメントのパスワード認証を参照してください。
-
データベース・ホストベースの認証ファイルを更新します。
echo "host all all 0.0.0.0/0 scram-sha-256" | sudo tee -a /var/lib/pgsql/data/pg_hba.conf > /dev/null
この追加行は、SCRAM-SHA-256認証を実行して、任意のIPアドレスから接続するときにユーザーのパスワードを検証します。
-
データベースが接続をリスニングするlisten_address値を更新します。
sudo sed -i "/^#port = 5432/i listen_addresses = '"$(hostname -s)"'" /var/lib/pgsql/data/postgresql.conf
この値には、IPアドレスまたはホスト名のいずれかを選択できます。チュートリアルでは、
hostname -s
を使用してホスト名を選択します。 -
データベース・サービスを起動して有効にします。
sudo systemctl enable --now postgresql
-
データベース・ダンプ・ファイルをインポートします。
sudo su - postgres -c 'psql -d postgres -f /tmp/olamv2_db_dump'
-
Oracle Linux Automation Managerデータベース・ユーザー・アカウントのパスワードを設定します。
sudo su - postgres -c "psql -U postgres -d postgres -c \"alter user awx with password 'password';\""
このコマンドは、
awx
パスワードをpassword
に設定します。無料の演習環境以外でこのコマンドを実行する場合は、よりセキュアなパスワードを選択します。 -
db-nodeインスタンスに接続されているSSHセッションを閉じます。これにより、リモート・データベースの設定に必要なステップが完了します。
exit
リモート・データベース設定の追加
-
端末プロンプトを確認して、olam-nodeインスタンスへの接続を確認します。
-
ホストがリモート・データベースと通信できることを確認します。
pg_isready -d awx -h db-node -p 5432 -U awx
postgresqlパッケージには、
pg_isready
コマンドが含まれています。このパッケージは、元の単一ホストインストールの一部です。このコマンドが機能しない場合は、上のステップをスキップしたか、ネットワーク上のポート5432へのイングレス・アクセスが欠落している可能性があります。 -
リモート・データベース設定を新しいカスタム構成ファイルに追加します。
cat << EOF | sudo tee /etc/tower/conf.d/db.py > /dev/null DATABASES = { 'default': { 'ATOMIC_REQUESTS': True, 'ENGINE': 'awx.main.db.profiled_pg', 'NAME': 'awx', 'USER': 'awx', 'PASSWORD': 'password', 'HOST': 'db-node', 'PORT': '5432', } } EOF
以前に
awx
データベース・ユーザー・アカウントに設定したものと同じパスワードを使用します。 -
コントロール・プレーン・ノードでローカル・データベースを停止および無効にします。
sudo systemctl stop postgresql sudo systemctl disable postgresql
-
ローカル・データベース・サービスをマスクします。
sudo systemctl mask postgresql
このステップにより、Oracle Linux Automation Managerサービスの起動時にローカル・データベース・サービスを起動できなくなります。
-
Oracle Linux Automation Managerを起動します。
sudo systemctl start ol-automation-manager
-
Oracle Linux Automation Managerがリモート・データベースに接続していることを確認します。
sudo su -l awx -s /bin/bash -c "awx-manage check_db"
接続に成功すると、リモート・データベース・バージョンの詳細が返されます。
ローカル・データベース・インスタンスの削除
リモート・データベースへの接続が機能していることを確認した後、元のローカル・データベースを削除しても安全です。
-
データベース・パッケージを削除します。
sudo dnf -y remove postgresql
-
古いデータベース・データファイルを含む
pgsql
ディレクトリを削除します。sudo rm -rf /var/lib/pgsql
コントロール・プレーン・ノードのノード・タイプの変更
クラスタ化されたデプロイメントに変換する場合は、シングルホスト・インスタンスnode_typeをhybrid
からcontrol
に切り替えます。
-
コントロール・プレーン・ノードの現在のノード・タイプを確認します。
sudo su -l awx -s /bin/bash -c "awx-manage list_instances"
出力には、
hybrid
の値に設定されたnode_type
が表示されます。 -
デフォルトのインスタンス・グループを削除します。
sudo su -l awx -s /bin/bash -c "awx-manage remove_from_queue --queuename default --hostname $(hostname -i)"
-
新しいインスタンスとキューを定義します。
sudo su -l awx -s /bin/bash -c "awx-manage provision_instance --hostname=$(hostname -i) --node_type=control" sudo su -l awx -s /bin/bash -c "awx-manage register_queue --queuename=controlplane --hostnames=$(hostname -i)"
-
カスタム設定ファイルにデフォルトのキュー名の値を追加します。
cat << EOF | sudo tee -a /etc/tower/conf.d/olam.py > /dev/null DEFAULT_EXECUTION_QUEUE_NAME = 'execution' DEFAULT_CONTROL_PLANE_QUEUE_NAME = 'controlplane' EOF
-
レセプタの設定を更新します。
cat << EOF | sudo tee /etc/receptor/receptor.conf > /dev/null --- - node: id: $(hostname -i) - log-level: info - tcp-listener: port: 27199 - control-service: service: control filename: /var/run/receptor/receptor.sock - work-command: worktype: local command: /var/lib/ol-automation-manager/venv/awx/bin/ansible-runner params: worker allowruntimeparams: true verifysignature: false EOF
-
Oracle Linux Automation Managerの再起動
sudo systemctl restart ol-automation-manager
単一ホスト・ハイブリッド・ノードからリモート・データベースを含むコントロール・プレーン・ノードへの変換が完了しました。次に、このクラスタを完全に機能させる実行プレーン・ノードを追加します。
クラスタへの実行プレーン・ノードの追加
クラスタが完全に機能する前に、1つ以上の実行ノードを追加します。実行ノードはansible-runnerを使用して標準ジョブを実行します。これにより、OLAM EE Podmanコンテナベースの実行環境内でプレイブックが実行されます。
実行プレーン・ノードの準備
-
sshを介して*exe-nodeインスタンスに接続します。
ssh exe-node
-
Oracle Linux Automation Managerリポジトリ・パッケージをインストールします。
sudo dnf -y install oraclelinux-automation-manager-release-el8
-
古いリリースのリポジトリを無効にします。
sudo dnf config-manager --disable ol8_automation ol8_automation2
-
現在のリリースのリポジトリを有効にします。
sudo dnf config-manager --enable ol8_automation2.2
-
Oracle Linux Automation Managerパッケージをインストールします。
sudo dnf -y install ol-automation-manager
-
レセプタ・ファイアウォール・ルールを追加します。
sudo firewall-cmd --add-port=27199/tcp --permanent sudo firewall-cmd --reload
-
Redisソケット構成を編集します。
sudo sed -i '/^# unixsocketperm/a unixsocket /var/run/redis/redis.sock\nunixsocketperm 775' /etc/redis.conf
-
コントロール・プレーン・ノードから秘密キーをコピーします。
ssh oracle@olam-node "sudo cat /etc/tower/SECRET_KEY" | sudo tee /etc/tower/SECRET_KEY > /dev/null
重要:すべてのクラスタ・ノードに同じ秘密キーが必要です。
-
必要な設定を含むカスタム設定ファイルを作成します。
cat << EOF | sudo tee /etc/tower/conf.d/olamv2.py > /dev/null CLUSTER_HOST_ID = '$(hostname -i)' DEFAULT_EXECUTION_QUEUE_NAME = 'execution' DEFAULT_CONTROL_PLANE_QUEUE_NAME = 'controlplane' EOF
CLUSTER_HOST_ID
は、クラスタ内のホストの一意の識別子です。 -
リモート・データベース構成を含むカスタム設定ファイルを作成します。
cat << EOF | sudo tee /etc/tower/conf.d/db.py > /dev/null DATABASES = { 'default': { 'ATOMIC_REQUESTS': True, 'ENGINE': 'awx.main.db.profiled_pg', 'NAME': 'awx', 'USER': 'awx', 'PASSWORD': 'password', 'HOST': 'db-node', 'PORT': '5432', } } EOF
-
ansible-runner実行環境をデプロイします。
-
awx
ユーザーとしてシェルを開きます。sudo su -l awx -s /bin/bash
-
権限のないネームスペースを維持しながら、既存のコンテナを最新のpodmanバージョンに移行します。
podman system migrate
-
Oracle Linux Automation ManagerのOracle Linux Automation Engine実行環境を取得します。
podman pull container-registry.oracle.com/oracle_linux_automation_manager/olam-ee:2.2
-
awx
ユーザー・シェルを終了します。exit
-
-
NGINXのSSL証明書を生成します。
sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/tower/tower.key -out /etc/tower/tower.crt
要求された情報を入力するか、
ENTER
キーを押してください。 -
デフォルトのNGINX構成を次の構成に置き換えます。
cat << 'EOF' | sudo tee /etc/nginx/nginx.conf > /dev/null user nginx; worker_processes auto; error_log /var/log/nginx/error.log; pid /run/nginx.pid; # Load dynamic modules. See /usr/share/doc/nginx/README.dynamic. include /usr/share/nginx/modules/*.conf; events { worker_connections 1024; } http { log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; access_log /var/log/nginx/access.log main; sendfile on; tcp_nopush on; tcp_nodelay on; keepalive_timeout 65; types_hash_max_size 2048; include /etc/nginx/mime.types; default_type application/octet-stream; # Load modular configuration files from the /etc/nginx/conf.d directory. # See http://nginx.org/en/docs/ngx_core_module.html#include # for more information. include /etc/nginx/conf.d/*.conf; } EOF
-
レセプタ構成ファイルを更新します。
cat << EOF | sudo tee /etc/receptor/receptor.conf > /dev/null --- - node: id: $(hostname -i) - log-level: debug - tcp-listener: port: 27199 - tcp-peer: address: $(ssh olam-node hostname -i):27199 redial: true - control-service: service: control filename: /var/run/receptor/receptor.sock - work-command: worktype: ansible-runner command: /var/lib/ol-automation-manager/venv/awx/bin/ansible-runner params: worker allowruntimeparams: true verifysignature: false EOF
node:id
は、現在のノードのホスト名またはIPアドレスです。tcp-peer:address
は、コントロール・プレーン・ノード上のレセプタ・メッシュのホスト名またはIPアドレスとポートです。
-
Oracle Linux Automation Managerサービスを起動して有効にします。
sudo systemctl enable --now ol-automation-manager.service
-
exe-nodeインスタンスに接続されているSSHセッションを閉じ、実行ノードの設定に必要なステップを完了します。
exit
実行プレーン・ノードのプロビジョニング
-
端末プロンプトを確認して、olam-nodeインスタンスへの接続を確認します。
クラスタのコントロール・プレーン・ノードの1つでプロビジョニング・ステップを実行し、Oracle Linux Automation Managerのすべてのクラスタ・インスタンスに適用する必要があります。
-
実行インスタンスとキューを定義します。
sudo su -l awx -s /bin/bash -c "awx-manage provision_instance --hostname=$(ssh exe-node hostname -i) --node_type=execution" sudo su -l awx -s /bin/bash -c "awx-manage register_default_execution_environments" sudo su -l awx -s /bin/bash -c "awx-manage register_queue --queuename=execution --hostnames=$(ssh exe-node hostname -i)"
register_queue
は、queuename
を使用して作成/更新し、ジョブが実行されるカンマ区切りのhostnames
のリストを取得します。
-
サービス・メッシュ・ピア関係を登録します。
sudo su -l awx -s /bin/bash -c "awx-manage register_peers $(ssh exe-node hostname -i) --peers $(hostname -i)"
実行プレーン・ノードの登録の確認
-
sshを介して*exe-nodeインスタンスに接続します。
ssh exe-node
-
Oracle Linux Automation Managerメッシュ・サービスが実行されていることを確認します。
sudo systemctl status receptor-awx
-
サービスメッシュのステータスをチェックします。
sudo receptorctl --socket /var/run/receptor/receptor.sock status
出力例:
[oracle@execution-node ~]$ sudo receptorctl --socket /var/run/receptor/receptor.sock status Node ID: 10.0.0.62 Version: +g System CPU Count: 2 System Memory MiB: 15713 Connection Cost 10.0.0.55 1 Known Node Known Connections 10.0.0.55 10.0.0.62: 1 10.0.0.62 10.0.0.55: 1 Route Via 10.0.0.55 10.0.0.55 Node Service Type Last Seen Tags 10.0.0.62 control Stream 2022-11-06 19:46:53 {'type': 'Control Service'} 10.0.0.55 control Stream 2022-11-06 19:46:06 {'type': 'Control Service'} Node Work Types 10.0.0.62 ansible-runner 10.0.0.55 local
リセプタの詳細は、アップストリームのドキュメンテーションを参照してください。
-
実行中のクラスタ・インスタンスを確認し、使用可能な容量を表示します。
sudo su -l awx -s /bin/bash -c "awx-manage list_instances"
クラスタがすべてのインスタンス間で通信を確立すると、出力は
green
と表示されます。結果がred
と表示される場合は、20から30秒待ってから、コマンドを再実行してみてください。出力例:
[oracle@control-node ~]$ sudo su -l awx -s /bin/bash -c "awx-manage list_instances" [controlplane capacity=136] 10.0.0.55 capacity=136 node_type=control version=19.5.1 heartbeat="2022-11-08 16:24:03" [default capacity=0] [execution capacity=136] 10.0.0.62 capacity=136 node_type=execution version=19.5.1 heartbeat="2022-11-08 17:16:45"
これで、クラスタ化されたデプロイメントへのOracle Linux Automation Managerの移行が完了します。
(オプション)クラスタが動作していることの確認
-
前のWebUIの表示に使用したWebブラウザ・ウィンドウをリフレッシュするか、新しいWebブラウザ・ウィンドウを開いてURLを入力します。
https://localhost:8444
URLで使用されるポートは、SSHトンネルのローカル・ポートと一致する必要があります。
ノート:使用するブラウザに基づいてセキュリティ警告を承認します。Chromeの場合、「詳細」ボタンをクリックし、「localhostに進む(安全でない)」リンクをクリックします。
-
USERNAME
admin
とパスワードadmin
を使用して、Oracle Linux Automation Managerに再度ログインします。 -
ログインすると、WebUIが表示されます。
-
左側のナビゲーション・メニューを使用して、「管理」セクションの「インスタンス・グループ」をクリックします。
-
メイン・ウィンドウで、「追加」ボタンをクリックし、「インスタンス・グループの追加」を選択します。
-
「新規インスタンス・グループの作成」ページで、必要な情報を入力します。
-
「保存」ボタンをクリックします。
-
「詳細」サマリー・ページで、「インスタンス」タブをクリックします。
-
「インスタンス」ページで、「関連付け」ボタンをクリックします。
-
「インスタンスの選択」ページで、実行ノードの横にあるチェック・ボックスを選択します。
-
「保存」ボタンをクリックします。
-
左側のナビゲーション・メニューを使用して、「リソース」セクションの「在庫」をクリックします。
-
メイン・ウィンドウで、「追加」ボタンをクリックし、「在庫の追加」を選択します。
-
「新規在庫の作成」ページで必要な情報を入力します。
「インスタンス・グループ」で、検索アイコンを選択して「インスタンス・グループの選択」ポップアップ・ダイアログを表示します。「実行」グループの横にあるチェックボックスをクリックし、「選択」ボタンをクリックします。
-
「保存」ボタンをクリックします。
-
「詳細」サマリー・ページで、「ホスト」タブをクリックします。
-
「ホスト」ページで、「追加」ボタンをクリックします。
-
「新規ホストの作成」ページで、使用可能なインスタンスのIPアドレスまたはホスト名を入力します。
無料の演習環境では、リモート・データベース・インスタンスのホスト名であるdb-nodeを使用します。
-
「保存」ボタンをクリックします。
-
左側のメニューに移動し、**「資格証明」をクリックします。
-
「資格証明」ページで、「追加」ボタンをクリックします。
-
「新規資格証明の作成」ページで必要な情報を入力します。
「資格証明タイプ」で、ドロップダウン・メニューをクリックし、「マシン」を選択します。資格証明の「タイプ詳細」が表示されます。
「ユーザー名」に
oracle
を入力し、「SSH秘密キー」を参照します。「参照」ボタンをクリックすると、「ファイルを開く」ダイアログ・ウィンドウが表示されます。そのダイアログのメイン・ウィンドウを右クリックし、「非表示ファイルの表示」を選択します。
次に、
.ssh
フォルダとid_rsa
ファイルを選択します。「開く」ボタンをクリックすると、秘密キー・ファイルの内容が「SSH秘密キー」ダイアログ・ボックスにコピーされます。下にスクロールして、「保存」ボタンをクリックします。 -
左側のメニューに移動し、「在庫」をクリックします。
-
「在庫」ページで、「テスト」在庫をクリックします。
-
「詳細」サマリー・ページで、「ホスト」タブをクリックします。
-
「ホスト」ページで、
db-node
ホストの横にあるチェック・ボックスを選択します。次に、「コマンドの実行」ボタンをクリックします。
-
「コマンドの実行」ダイアログで、「モジュール」値リストから
ping
モジュールを選択し、「次へ」ボタンをクリックします。 -
OLAM EE (2.2)実行環境を選択し、「次へ」ボタンをクリックします。
-
db-nodeマシン資格証明を選択し、「次へ」ボタンをクリックします。
-
パネルがリフレッシュされ、コマンドのプレビューが表示されます。
詳細を確認したら、「起動」ボタンをクリックします。
-
ジョブが起動され、ジョブの「出力」ページが表示されます。
すべてが正常に実行された場合、Ansible
ping
モジュールを使用して、実行ノードがdb-node
インスタンスに接続したというSUCCESS
メッセージが出力に表示されます。出力が表示されない場合は、「詳細」タブをクリックして「出力」タブに戻り、ページをリフレッシュします。
次のステップ
WebUI内の出力により、Oracle Linux Automation Managerの作業クラスタ環境があることが確認されます。スキルの構築を続行し、Oracle Linuxトレーニング・ステーションのその他のOracle Linux Automation Managerトレーニングを確認してください。
関連リンク
Oracle Linux Automation Managerドキュメント
Oracle Linux Automation Managerトレーニング
Oracle Linuxトレーニング・ステーション
その他の学習リソース
docs.oracle.com/learnの他のラボを確認するか、Oracle Learning YouTubeチャネルで無料のラーニング・コンテンツにアクセスしてください。また、education.oracle.com/learning-explorerにアクセスしてOracle Learning Explorerになります。
製品ドキュメントについては、Oracle Help Centerを参照してください。
Migrate Oracle Linux Automation Manager to a Clustered Deployment
F74661-02
Copyright ©2022, Oracle and/or its affiliates.