使用 OCI Fleet Application Management 協調 Ansible 手冊
簡介
Oracle Cloud Infrastructure (OCI) 為客戶提供全方位的雲端平台,以管理其基礎架構和應用程式。為了進一步增強管理功能,OCI 中的 Fleet Application Management (FAM) 可大規模協調營運任務。作為此協調流程的一部分,FAM 可讓使用者協調熱門的開源自動化工具 Ansible,讓客戶更有效率地自動化和管理其 OCI 資源。
藉由允許使用者與 FAM 協調 Ansible,客戶可以使用 Ansible 的自動化功能來管理其 OCI 基礎架構和應用程式堆疊。
- 組態管理
- 部署應用程式
- 協調
在本教學課程中,我們將示範如何透過使用 OCI Fleet Application Management (FAM) 的自行代管執行處理執行 Ansible 手冊。
注意: 我們使用 OCI 主控台描述此處理作業,但是您也可以使用 Oracle Cloud Infrastructure 命令行介面 (OCI CLI) 或 API。如需 OCI Fleet Application Management 的相關資訊,請參閱 Fleet Application Management 。
開始使用 - 執行 Ansible Runbook
OCI FAM 會使用 Runbook 在自行代管的執行處理上觸發命令檔,在該執行處理上會對目標運算執行處理執行可顯示的手冊。Ansible 可以與 OCI 的原生安全機制 (例如 OCI Vault 和 Instance Principals) 整合,以安全地管理加密密碼 (例如 SSH 私密金鑰),並自動化跨雲端執行個體的工作。
- 保存庫儲存 SSH 金鑰:SSH 私密金鑰儲存在 OCI 保存庫中,只有特定執行處理 (透過執行處理主體) 具備存取權限。
- Ansible Playbook:Ansible Playbook 不直接包含 SSH 金鑰。而是在程式實際執行時使用執行處理主體從 OCI Vault 擷取 SSH 金鑰的邏輯。
- 執行流程:當播放手冊由 FAM 執行時,它會從保存庫擷取 SSH 私密金鑰、認證目標執行處理,然後繼續部署或組態作業。
- 完成:播放手冊執行完成後,運算執行處理上的機密 SSH 金鑰會被清除,以確保執行環境乾淨且安全。
目標
- 使用 OCI FAM 自行代管執行處理對遠端系統執行 Ansible 手冊,並動態從 OCI 保存庫擷取 SSH 金鑰,然後在手冊執行期間使用它向遠端系統進行認證。

工作 1:自行代管的執行處理
建立運算執行處理
首先,啟動一個運算執行處理。選擇是要建立新執行處理或選取現有的執行處理,然後依照下方的詳細步驟進行。
注意:如需有關如何在 Oracle Cloud Infrastructure 中建立運算執行處理的詳細逐步指示,請參閱 Oracle 官方文件:建立執行處理
在 OCI Fleet Application Management 中註冊自行代管的執行處理
自行代管的執行處理可以作為中央中樞,以監督及管理數個資源。如果選擇執行處理作為自行代管的執行處理,您可以執行各種檢查以確保運算執行處理如預期般執行。
- 登入 OCI 主控台,瀏覽至可觀測性與管理,然後選取機組應用程式管理。
- 按一下管理。
- 在描述資料管理底下,按一下自行代管執行處理並建立自行代管執行處理。

- 為自行代管的執行處理輸入下列資訊。
- 名稱:輸入自行代管的執行處理,避免使用任何機密資訊 (例如金鑰等等)。
- 區間:選擇包含自行代管執行處理的區間
- 選取執行處理 → 區間:
- 執行處理:選擇所選區間中的執行處理 **
建立自行代管執行處理 
重要事項:請確定在自行代管的執行處理及其關聯的執行處理上啟用機組應用程式管理 Plugin。此步驟可確保運輸隊伍應用系統管理能夠有效地將這些執行處理納入生命週期作業。
工作 2:設定自行代管的執行處理
接下來,請安裝並驗證下列元件,準備您自行代管的控制節點:
- 適用於 Python 的 OCI SDK
- 安裝與配置 Ansible
- Ansible 集合
Ansible 集合 RPM 會安裝 OCI Ansible 集合與其必要的相依性。安裝 RPM 之後,您必須依照設定認證中的說明,設定 SDK 和 CLI 組態檔。
安裝適用於 Python 的 OCI SDK
在運算執行處理 (自行代管的執行處理) 上安裝 OCI SDK 通常與使用套裝管理程式或直接下載和安裝方法有關,取決於 SDK 語言和運算執行處理的作業系統 (自行代管)。
- 依照 SDK for Python 主題中的指示下載並安裝 Python 適用的 SDK。如需其他指引,請參閱下載與安裝 SDK 。
- 為 Python 安裝 SDK 之後,您必須使用設定 SDK 主題中的指示來設定 SDK。
\\# Create and activate a Python virtual environment (for pip/CLI tools)
python3 -m venv fam\\_ansible
source fam\\_ansible/bin/activate
\\# Upgrade pip inside the venv
pip install --upgrade pip
\\# Verify OCI CLI if already present in your path
oci -version
3\\.66.1
\\# If OCI CLI not installed
\$ pip install oci-cli
Collecting oci-cli`
Downloading oci\\_cli-3.66.1-py3-none-any.whl
Successfully installed oci-2.160.1 oci-cli-3.66.1
安裝與配置 Ansible
- 若要安裝 Ansible,請依照 Ansible Installation Guide 中提供的指示進行。
- 如需設定 Ansible 的指引,請參閱設定 Ansible 。
注意:此安裝使用 Python 版本 3.6 和 Ansible 版本 2.9 或更新版本。
安裝 OCI Ansible 集合
使用下列命令從 Ansible Galaxy 安裝 OCI Ansible 集合:
\\# Install the Oracle OCI Ansible Collection
ansible-galaxy collection install oracle.oci
Starting galaxy collection install process
Process install dependency map
Starting collection install process
Downloading https://galaxy.ansible.com/oracle-oci-5.5.0.tar.gz
Installing 'oracle.oci:5.5.0' to '/root/.ansible/collections/ansible\\_collections/oracle/oci'
oracle.oci:5.5.0 was installed successfully
\\#
ansible-doc -l | grep oracle.oci
oracle.oci (collection) 5.5.0
\\#
ansible -m ping localhost -c local
localhost | SUCCESS => {
"changed": false,
"ping": "pong"
}
\\#
ansible-doc -l | grep oci\\_ | tail
oracle.oci.oci\\_waf\\_web\\_app\\_firewall\\_policy\\_facts
oracle.oci.oci\\_work\\_requests\\_work\\_request\\_error\\_facts
oracle.oci.oci\\_work\\_requests\\_work\\_request\\_facts
oracle.oci.oci\\_work\\_requests\\_work\\_request\\_log\\_entry\\_facts
如果您已經安裝此集合,可以在指令中新增 – force 旗標,將其模組更新為最新版本。舉例而言:
\$ ansible-galaxy collection install --force oracle.oci
如果您必須在運算中安裝顯示的核心:
\\# Refresh repo metadata and install Ansible core + Git
sudo dnf makecache
sudo dnf install -y ansible-core git
\\# Verify Ansible
ansible --version
ansible [core 2.14.18]
config file = /etc/ansible/ansible.cfg
ansible python module location = /usr/lib/python3.9/site-packages/ansible
executable location = /usr/bin/ansible
python version = 3.9.21
注意:如需有關如何在 Oracle Cloud Infrastructure 中開始使用 Ansible 的詳細逐步指示,請參閱 Oracle 官方文件:開始使用 Ansible Collection 。
工作 3:設定執行處理主體以存取加密密碼 (IAM)
在此區段中,您將設定下列項目的必要 IAM 權限:
- 自行代管的執行處理 (使用執行處理主體) 可讀取 OCI 保存庫的加密密碼
- 使用者群組權限,可管理 Runbook 以執行可顯示的手冊。
使用執行處理主體存取加密密碼
使用執行處理主體可讓您的運算執行處理呼叫 OCI 服務,而不儲存或輪換使用者證明資料。透過將執行處理置於動態群組中並授予適當的 IAM 原則,執行處理即可安全地從 OCI 保存庫讀取加密密碼。若要使用執行處理主體,您必須建立動態群組和原則,如下所示。
建立動態群組
「動態群組」使用規則來定義哪些實例是群組的成員。比對規則可以是簡單規則,您可以在其中提供用於 CLI 之運算執行處理的 OCID。您可以從 OCI 主控台使用「規則產生器」來制定規則。若要使用 OCI 主控台建立動態群組,請參閱此處的文件。
若要建立動態群組,請執行下列動作:
- 登入 OCI 主控台
- 選取左上角的漢堡功能表,選取識別,選取動態群組,然後按一下建立動態群組。
- 輸入它的名稱和易記的說明
- 輸入比對規則,讓您的執行處理符合動態群組的資格

如果您不確定如何定義規則,可以使用「規則建置器」來協助您建置規則。按一下「規則建置器」按鈕。輸入規則的準則。在本教學課程中,我們使用非常簡單的規則,其中指定將執行 Ansible 手冊之運算執行處理的 OCID。

輸入比對規則,然後按「新增規則」按鈕。在建立動態群組畫面中,按一下建立按鈕。
建立原則
建立動態群組之後,您需要建立一個原則,讓您的群組具備讀取保存庫區間中加密密碼的權限。如需撰寫原則的文件,請參閱這個網頁。
若要建立原則,請執行下列動作:
- 登入 OCI 主控台
- 選取左上角的漢堡功能表,選取身分識別,選取原則,然後按一下建立原則。
- 名稱:輸入名稱
- 描述:新增描述
- 區間:選擇區間
-
原則敘述句:新增下列項目:

allow dynamic-group ansible\_control\_node\_dg to use secret-family in compartment <vault-compartment>allow dynamic-group ansible\_control\_node\_dg to read vaults in compartment <vault-compartment> - 按一下建立。
啟用 OCI 加密密碼的執行處理主要項目授權
建立動態群組、比對規則和原則之後,即可使用執行處理主體授權 OCI CLI 呼叫 OCI 保存庫 / 秒的原則。若要從 CLI 啟用「執行處理主體」授權,您可以使用命令的授權選項 (– auth)。舉例而言:
\\# From the self-host, check a simple IAM call via Instance Principals
oci iam region list --auth instance\\_principal
\\# Test a secrets call (replace with your secret OCID)
oci secrets secret-bundle get \\
--secret-id ocid1.vaultsecret.oc1..example \\
--auth instance\\_principal \\
--raw-output \\
--query 'data."secret-bundle-content".content' | base64 -d
參照
工作 4:建立執行 Ansible 手冊的 Runbook
安裝和組態完成後,您可以撰寫使用 Ansible 的範例手冊。以下是在遠端運算執行處理上執行簡單命令的範例手冊 (名稱為 run_uptime_date_commands.yml)。
建立 Ansible 手冊
- 使用執行處理主體從保存庫取得 ssh 金鑰
- 動態新增具有 SSH 參數的目標主機
- 將金鑰寫入安全檔案
- 在遠端系統上執行簡單指令 (正常運作時間 && date)
\\---
\\# Play 1: Fetch the OCI Vault secret (private key) and write to a local file
\\- name: Fetch private key from OCI Vault and save to file
hosts: localhost
connection: local
gather\\_facts: false
vars:
# Override at runtime: -e secret\\_ocid= -e output\\_path= -e target\\_host= -e ssh\\_user=
secret\\_ocid: "ocid1.vaultsecret.oc1.iad.amXXXXXXaaaal4XXXXXXXXXXXXXXXXXXXXX2d7swXXXXXzq"
output\\_path: "/secret\\_value.txt"
# SSH connection parameters to the target
target\\_host: "famosXXXXXXXXXXXXXXXXX.com"
ssh\\_user: "XXXXX"
ssh\\_port: 22
# Optional: relax host key checking for first-time connections
# For production, set to "" and manage known\\_hosts strictly
ssh\\_common\\_args: "-o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null"
tasks:
- name: Fetch secret (base64) via OCI CLI using instance principals
ansible.builtin.command:
argv:
- oci
- secrets
- secret-bundle
- get
- --secret-id
- ""
- --auth
- instance\\_principal
- --raw-output
- --query
- "data.\\"secret-bundle-content\\".content"
register: secret\\_b64
changed\\_when: false
environment:
NO\\_PROXY: "169.254.0.0/16,127.0.0.1,localhost"
no\\_proxy: "169.254.0.0/16,127.0.0.1,localhost"
- name: Fail if fetch failed
ansible.builtin.fail:
msg: "Failed to fetch secret. stderr="
when: secret\\_b64.rc != 0
- name: Decode base64 to raw secret string
ansible.builtin.set\\_fact:
secret\\_raw: ""
# If the secret was stored with literal "\\n", convert to real newlines (typical for PEM pasted as single line)
- name: Normalize newlines if needed
ansible.builtin.set\\_fact:
secret\\_value: ""
when: "'\\\\n' in secret\\_raw or '\\\\r\\\\n' in secret\\_raw"
- name: Keep decoded secret as-is
ansible.builtin.set\\_fact:
secret\\_value: ""
when: "'\\\\n' not in secret\\_raw and '\\\\r\\\\n' not in secret\\_raw"
- name: Write key to file with strict permissions (0600)
ansible.builtin.copy:
dest: ""
content: ""
mode: "0600"
no\\_log: true
- name: Add dynamic host with SSH parameters
ansible.builtin.add\\_host:
name: ""
groups: dynamic\\_targets
ansible\\_user: ""
ansible\\_port: ""
ansible\\_ssh\\_private\\_key\\_file: ""
ansible\\_ssh\\_common\\_args: ""
\\# Play 2: Connect to the target and run uptime and date
\\- name: Run health checks on target
hosts: dynamic\\_targets
gather\\_facts: false
tasks:
- name: Wait for SSH to be ready
ansible.builtin.wait\\_for\\_connection:
timeout: 60
sleep: 3
- name: Run uptime
ansible.builtin.command: uptime
register: uptime\\_out
changed\\_when: false
- name: Show uptime output
ansible.builtin.debug:
var: uptime\\_out.stdout
- name: Run date
ansible.builtin.command: date
register: date\\_out
changed\\_when: false
- name: Show date output
ansible.builtin.debug:
var: date\\_out.stdout
備註:建議您讓播放簿保持獨立,並透過 -e 傳送所有輸入,如此相同的 FAM Runbook 才能在不編輯檔案的情況下執行不同的主機 / 使用者 / 指令。此外,強烈建議將 ssh 金鑰儲存在保存庫中,並視需要擷取加密密碼。
建立 Ansible Playbook 執行的生命週期作業
請在 FAM 中建立自訂生命週期作業,以執行 DbNode 作業系統修正命令檔,因為該命令檔不在標準生命週期類別之下。
- 在 OCI 主控台中,瀏覽至機組應用程式管理 > 中繼資料管理 > 生命週期作業
- 建立名為 Ansible_playbook_execution_operation 的新生命週期作業。
- 指定它使用自行代管的執行處理 (在後續步驟中設定)
透過 OCI 主控台建立 Runbook
此教學課程使用 OCI FAM Runbook 執行包含自行代管執行處理的可顯示手冊,此手冊可定義如何使用變數執行手冊。例如,要執行隱藏的手冊,您必須寫下執行隱藏的手冊的命令 。
若要建立 Runbook,請依照下列步驟進行:
- 前往 OCI 主控台,瀏覽至 Fleet Application Management ,然後按一下動作與控制項。
- 按一下執行手冊和建立執行手冊。
- 輸入名稱、描述、生命週期作業、重新預訂類型,然後選取作業系統 (OS) 類型和預估完成時間。

- 使用視覺設計工具、上傳 YAML 或 JSON 檔案,或透過 Runbook 中的 Bash 或 Python 命令檔工作參照現有的自動化命令檔來建立您的 Runbook。
- 。上傳檔案 (playbook yml)

- 。上傳檔案 (playbook yml)
- 提供在 Runbook 中執行 Bash 或 Python 文稿工作的命令 。

- 新增要執行的命令之後,您必須將特性變更為「自行代管」執行處理,然後選擇先前建立之工作 1 的自行代管執行處理。

- 視需要新增更多任務以自訂 Runbook。
工作 5:執行 Ansible 手冊
建立 Runbook 之後,您就可以在 OCI Fleet Application Management 中執行 Ansible Playbook。現在,您可以透過自行代管的執行處理來執行可顯示的手冊。若要執行 Runbook,請建立包含自行代管執行處理的機組。
為此執行處理建立隊伍
在 FAM 中建立機組以管理自行代管的執行處理。不需要新增產品以執行 CR。
- 在 OCI 主控台中,前往機組應用程式管理 > 機組。
- 建立新機組 (例如 ansible_playbook_fleet),然後新增自行代管的執行處理作為資源。
- 請確定機組位於想要的區間中,並且設為「生產環境類型」(如果適用)。
執行 Ansible Playbook Runbook
觸發執行 Ansible Playbook 的 Runbook。
- 在 OCI 主控台中,前往機組應用程式管理 > 機組 > ansible_playbook_fleet。
- 建立新的工作或執行項目,選取 ansible_playbook_runbook 和生命週期作業。
- 排定執行或立即執行。

- 按一下以執行。
- 執行項目
執行輸出
執行完成後或在執行期間,您可以監視可播放手冊的執行進度。
請查看 FAM 中的執行日誌,以確認已順利執行指令碼。
- 在 OCI 主控台中,前往機組應用程式管理 > 生命週期管理 > 工作。
- 選取執行工作並檢視其日誌,以檢查錯誤或成功訊息 (例如作業系統修正工作進度)。

- Ansible 日誌
Parsing the config file
Validating config format
Successfully validated config format
Processing target section
Target section not found or empty, skipping target parsing
Processing subjects section
Subject section patches is missing or invalid. Skipping
Subjects section parsed and written to file
Either Patches section not found or it has empty list
Processing script section
Script section extracted
Processing input\\_variables section
Input variables section not found or empty
Processing credentials section
Credentials section not found or has wrong format
Finished parseJSON function
Mount point: /
/var/lib/oracle-cloud-agent/plugins/oci-fams/executions/run/ocid1.famsschedulerjob.oc1.iad..amaaaaaal4gwqoaahh3nhaske7upkuttqsqkwjbesec525zxsosjxcw2nska/1861f58f-bb31-467e-9350-143060d360c9/run\\_uptime\\_date\\_commands.yml
object content written to file: /var/lib/oracle-cloud-agent/plugins/oci-fams/executions/run/ocid1.famsschedulerjob.oc1.iad..amaaaaaal4gwqoaahh3nhaske7upkuttqsqkwjbesec525zxsosjxcw2nska/1861f58f-bb31-467e-9350-143060d360c9/run\\_uptime\\_date\\_commands.yml
No input variable object storage namespace provided
Executing command: /bin/sh -c set -e; source /root/fams\\_ansible/fam\\_ansi/bin/activate; ansible-playbook -i "localhost," -c local run\\_uptime\\_date\\_commands.yml -e target\\_host="famoscompute01.xxxx.xxxx.oraclevcn.com" -e ssh\\_user="rduser" -e output\\_path="/root/fams\\_ansible/secret\\_value.txt" -e ssh\\_port=22
PLAY [Fetch private key from OCI Vault and save to file] \\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*
TASK [Fetch secret (base64) via OCI CLI using instance principals] \\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*
ok: [localhost]
TASK [Fail if fetch failed] \\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*
skipping: [localhost]
TASK [Decode base64 to raw secret string] \\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*
ok: [localhost]
TASK [Normalize newlines if needed] \\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*
ok: [localhost]
TASK [Keep decoded secret as-is] \\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*
skipping: [localhost]
TASK [Write key to file with strict permissions (0600)] \\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*
ok: [localhost]
TASK [Add dynamic host with SSH parameters] \\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*
changed: [localhost]
PLAY [Run health checks on target] \\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*
TASK [Wait for SSH to be ready] \\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*
ok: [famoscompute01.xxx.xxx.oraclevcn.com]
TASK [Run uptime] \\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*
ok: [famoscompute01.xxx.xxx.oraclevcn.com]
TASK [Show uptime output] \\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*
ok: [famoscompute01.xxx.xxx.oraclevcn.com] => {
` `"uptime\\_out.stdout": " 08:37:26 up 89 days, 18:55, 0 users, load average: 0.11, 0.05, 0.01"
}
TASK [Run date] \\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*
ok: [famoscompute01.xxx.xxx.oraclevcn.com]
TASK [Show date output] \\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*
ok: [famoscompute01.xxx.xxx.oraclevcn.com] => {
` `"date\\_out.stdout": "Tue Sep 30 08:37:27 AM GMT 2025"
}
PLAY RECAP \\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*
famoscompute01.xxx.xxx.oraclevcn.com : ok=5 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
localhost : ok=5 changed=1 unreachable=0 failed=0 skipped=2 rescued=0 ignored=0
======= Stderr ========
stderr
確認
- 作者 - Jerry Shin (資深網站可靠性工程師)
- 貢獻者 - Shabbir Hussain (諮詢成員技術人員)、Saikumar Daram (主要網站可靠性工程師)、Fabio Bonisoli (資深首席產品經理)
其他學習資源
在 docs.oracle.com/learn 上探索其他實驗室,或在 Oracle Learning YouTube 頻道上存取更多免費學習內容。此外,請造訪 education.oracle.com/learning-explorer 以成為 Oracle Learning Explorer。
如需產品文件,請造訪 Oracle Help Center 。
Orchestrating Ansible Playbooks with OCI Fleet Application Management
G53260-01