使用 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 VaultInstance Principals) 整合,以安全地管理加密密碼 (例如 SSH 私密金鑰),並自動化跨雲端執行個體的工作。

工作 1:自行代管的執行處理

建立運算執行處理

首先,啟動一個運算執行處理。選擇是要建立新執行處理或選取現有的執行處理,然後依照下方的詳細步驟進行。

注意:如需有關如何在 Oracle Cloud Infrastructure 中建立運算執行處理的詳細逐步指示,請參閱 Oracle 官方文件:建立執行處理

在 OCI Fleet Application Management 中註冊自行代管的執行處理

自行代管的執行處理可以作為中央中樞,以監督及管理數個資源。如果選擇執行處理作為自行代管的執行處理,您可以執行各種檢查以確保運算執行處理如預期般執行。

  1. 登入 OCI 主控台,瀏覽至可觀測性與管理,然後選取機組應用程式管理
  2. 按一下管理
  3. 描述資料管理底下,按一下自行代管執行處理建立自行代管執行處理
  4. 為自行代管的執行處理輸入下列資訊。
    • 名稱:輸入自行代管的執行處理,避免使用任何機密資訊 (例如金鑰等等)。
    • 區間:選擇包含自行代管執行處理的區間
    • 選取執行處理 → 區間: 
    • 執行處理:選擇所選區間中的執行處理 **

建立自行代管執行處理

重要事項:請確定在自行代管的執行處理及其關聯的執行處理上啟用機組應用程式管理 Plugin。此步驟可確保運輸隊伍應用系統管理能夠有效地將這些執行處理納入生命週期作業。

工作 2:設定自行代管的執行處理

接下來,請安裝並驗證下列元件,準備您自行代管的控制節點: 

Ansible 集合 RPM 會安裝 OCI Ansible 集合與其必要的相依性。安裝 RPM 之後,您必須依照設定認證中的說明,設定 SDK 和 CLI 組態檔

安裝適用於 Python 的 OCI SDK

在運算執行處理 (自行代管的執行處理) 上安裝 OCI SDK 通常與使用套裝管理程式或直接下載和安裝方法有關,取決於 SDK 語言和運算執行處理的作業系統 (自行代管)。

  1. 依照 SDK for Python 主題中的指示下載並安裝 Python 適用的 SDK。如需其他指引,請參閱下載與安裝 SDK
  2. 為 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

注意:此安裝使用 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 服務,而不儲存或輪換使用者證明資料。透過將執行處理置於動態群組中並授予適當的 IAM 原則,執行處理即可安全地從 OCI 保存庫讀取加密密碼。若要使用執行處理主體,您必須建立動態群組和原則,如下所示。

建立動態群組

「動態群組」使用規則來定義哪些實例是群組的成員。比對規則可以是簡單規則,您可以在其中提供用於 CLI 之運算執行處理的 OCID。您可以從 OCI 主控台使用「規則產生器」來制定規則。若要使用 OCI 主控台建立動態群組,請參閱此處的文件。 

若要建立動態群組,請執行下列動作:

  1. 登入 OCI 主控台
  2. 選取左上角的漢堡功能表,選取識別,選取動態群組,然後按一下建立動態群組
  3. 輸入它的名稱和易記的說明
  4. 輸入比對規則,讓您的執行處理符合動態群組的資格

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

輸入比對規則,然後按「新增規則」按鈕。在建立動態群組畫面中,按一下建立按鈕

建立原則

建立動態群組之後,您需要建立一個原則,讓您的群組具備讀取保存庫區間中加密密碼的權限。如需撰寫原則的文件,請參閱這個網頁。 

若要建立原則,請執行下列動作:

  1. 登入 OCI 主控台
  2. 選取左上角的漢堡功能表,選取身分識別,選取原則,然後按一下建立原則
    • 名稱:輸入名稱
    • 描述:新增描述 
    • 區間:選擇區間
    • 原則敘述句:新增下列項目:

      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 手冊

\\---

\\# 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 作業系統修正命令檔,因為該命令檔不在標準生命週期類別之下。

  1. 在 OCI 主控台中,瀏覽至機組應用程式管理 > 中繼資料管理 > 生命週期作業
  2. 建立名為 Ansible_playbook_execution_operation 的新生命週期作業。
  3. 指定它使用自行代管的執行處理 (在後續步驟中設定)

    透過 OCI 主控台建立 Runbook

    此教學課程使用 OCI FAM Runbook 執行包含自行代管執行處理的可顯示手冊,此手冊可定義如何使用變數執行手冊。例如,要執行隱藏的手冊,您必須寫下執行隱藏的手冊的命令 。

若要建立 Runbook,請依照下列步驟進行:

  1. 前往 OCI 主控台,瀏覽至 Fleet Application Management ,然後按一下動作與控制項
  2. 按一下執行手冊建立執行手冊
  3. 輸入名稱描述生命週期作業重新預訂類型,然後選取作業系統 (OS) 類型預估完成時間
  4. 使用視覺設計工具、上傳 YAML 或 JSON 檔案,或透過 Runbook 中的 Bash 或 Python 命令檔工作參照現有的自動化命令檔來建立您的 Runbook。
    • 。上傳檔案 (playbook yml)
  5. 提供在 Runbook 中執行 Bash 或 Python 文稿工作的命令 。
  6. 新增要執行的命令之後,您必須將特性變更為「自行代管」執行處理,然後選擇先前建立之工作 1 的自行代管執行處理。
  7. 視需要新增更多任務以自訂 Runbook。

    工作 5:執行 Ansible 手冊

建立 Runbook 之後,您就可以在 OCI Fleet Application Management 中執行 Ansible Playbook。現在,您可以透過自行代管的執行處理來執行可顯示的手冊。若要執行 Runbook,請建立包含自行代管執行處理的機組。

為此執行處理建立隊伍

在 FAM 中建立機組以管理自行代管的執行處理。不需要新增產品以執行 CR。

  1. 在 OCI 主控台中,前往機組應用程式管理 > 機組
  2. 建立新機組 (例如 ansible_playbook_fleet),然後新增自行代管的執行處理作為資源
  3. 請確定機組位於想要的區間中,並且設為「生產環境類型」(如果適用)。

    執行 Ansible Playbook Runbook

觸發執行 Ansible Playbook 的 Runbook。

  1. 在 OCI 主控台中,前往機組應用程式管理 > 機組 > ansible_playbook_fleet。
  2. 建立新的工作或執行項目,選取 ansible_playbook_runbook 和生命週期作業。
  3. 排定執行或立即執行。
  4. 按一下以執行
  5. 執行項目

    執行輸出

執行完成後或在執行期間,您可以監視可播放手冊的執行進度。

請查看 FAM 中的執行日誌,以確認已順利執行指令碼。

  1. 在 OCI 主控台中,前往機組應用程式管理 > 生命週期管理 > 工作
  2. 選取執行工作並檢視其日誌,以檢查錯誤或成功訊息 (例如作業系統修正工作進度)。
  3. 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

確認

其他學習資源

docs.oracle.com/learn 上探索其他實驗室,或在 Oracle Learning YouTube 頻道上存取更多免費學習內容。此外,請造訪 education.oracle.com/learning-explorer 以成為 Oracle Learning Explorer。

如需產品文件,請造訪 Oracle Help Center