附註:

使用 Oracle Linux Automation Engine 執行 Oracle Linux 工作

簡介

Oracle Linux Automation Engine 可讓管理員透過一系列的手冊和工作,使用基礎架構即程式碼 (IaC) 組態管理工具,將 Oracle Linux 的初始設定自動化,並執行其他管理工作。

目標

在本教學課程中,您將瞭解如何:

必要條件

部署 Oracle Linux Automation Engine

注意:如果在您自己的租用戶中執行,請先閱讀 linux-virt-labs GitHub 專案 README.md 並完成先決條件,再部署實驗室環境。

  1. 在 Luna 桌面上開啟終端機。

  2. 複製 linux-virt-labs GitHub 專案。

    git clone https://github.com/oracle-devrel/linux-virt-labs.git
    
  3. 變更至工作目錄。

    cd linux-virt-labs/olam
    
  4. 安裝所需的集合。

    ansible-galaxy collection install -r requirements.yml
    
  5. 更新 Oracle Linux 執行處理組態。

    cat << EOF | tee instances.yml > /dev/null
    compute_instances:
      1:
        instance_name: "ol-control-node"
        type: "control"
      2:
        instance_name: "ol-host"
        type: "remote"
    use_olae_only: true
    EOF
    
  6. 部署實驗室環境。

    ansible-playbook create_instance.yml -e localhost_python_interpreter="/usr/bin/python3.6" -e "@instances.yml"
    

    自由實驗室環境需要額外的變數 local_python_interpreter,此變數會設定 ansible_python_interpreter 代表在 localhost 上執行的播放。環境會安裝 Oracle Cloud Infrastructure SDK for Python 的 RPM 套裝程式 (位於 python3.6 模組底下),因此需要此變數。

    預設部署資源配置使用 AMD CPU 和 Oracle Linux 8。若要使用 Intel CPU 或 Oracle Linux 9,請在部署命令中新增 -e instance_shape="VM.Standard3.Flex"-e os_version="9"

    重要事項:等待手冊順利執行並到達暫停工作。在此階段的手冊中,Oracle Linux 的安裝已完成,且執行處理已就緒。請注意先前的播放,其會列印部署節點的公用和專用 IP 位址,以及執行實驗室時所需的任何其他部署資訊。

撰寫初始安裝手冊

許多手冊都會運用包含索引鍵 - 值組的變數和變數檔案,讓實際的手冊工作在程式碼維持靜態時能夠動態。手冊包含執行階段的變數,在執行工作時,其值會變成播放的一部分。

Oracle Linux Automation Engine 允許在數個位置定義這些變數,每個變數都有優先順序。手冊層級變數是使用 varsvars_files 指令在手冊中定義。vars 指令將變數指定為播放的一部分,而 vars_files 指令包含一個包含變數的外部檔案。開發人員可以動態或靜態地從其他遊戲建立這些變數,因為我們將在此範例中定義系統組態,然後再執行手冊。

  1. 開啟新終端機,並透過 SSH 連線至 ol-control-node 系統。

    ssh oracle@<ip_address_of_instance>
    
  2. 檢查 Oracle Linux Automation Engine 命令是否可用。

    ansible --version
    
  3. 建立工作專案目錄。

    mkdir -p ~/ol-playbook
    
  4. 為專案建立變數目錄與檔案。

    mkdir ~/ol-playbook/vars
    
    touch ~/ol-playbook/vars/defaults.yml
    
  5. 將變數和值新增至檔案。

       
    cat << EOF | tee ~/ol-playbook/vars/defaults.yml > /dev/null
    ---
    username: oracle
    user_default_password: oracle
    ssh_key_file: id_rsa
    ssh_private_key_file: "{{ lookup('file', lookup('env','HOME') + '/.ssh/' + ssh_key_file + '.pub') }}"
    additional_packages: ['git']
    EOF
       
    

    此資訊說明每個變數,以及我們如何使用:

    • username:執行手冊時建立的 sudo 使用者名稱。在此範例中,使用者的名稱將是 oracle
    • user_default_passwordoracle 使用者建立時的預設密碼。執行 sudo 指令時需要密碼。
    • ssh_key_file:設定使用者之 SSH 金鑰組的名稱。
    • ssh_private_key_file:將使用者的 SSH 公開金鑰複製到指定路徑的遠端使用者 authorized_key 檔案。此範例使用 lookup 外掛程式在本機使用者 $HOME/.ssh/ 目錄中尋找公開金鑰 id_rsa.pub
    • additional_packages:新增要以陣列格式安裝之任何其他套裝軟體的名稱。陣列中的每個套裝軟體都應該以單引號括住,並以逗號分隔。如果安裝 Appstream 模組 (例如 container-tools),陣列看起來會像是 ['git',' @container-tools:ol8']
  6. 建立手冊檔 。

       
    cat << EOF | tee ~/ol-playbook/setup.yml > /dev/null
    ---
    - hosts: all
      become: yes
      vars_files:
        - vars/defaults.yml
    
      tasks:
    
      - name: Generate new ssh keypair
        community.crypto.openssh_keypair:
          path: "~/.ssh/{{ ssh_key_file }}"
          size: 2048
          comment: olam ssh keypair
        become: true
        become_user: "{{ username }}"
        delegate_to: localhost
    
      - name: Add a user account with access to sudo
        ansible.builtin.user:
          name: "{{ username }}"
          password: "{{ user_default_password | password_hash('sha512') }}"
          comment: Default Oracle user
          groups: wheel
          append: yes
          update_password: on_create
    
      - name: Set the authorized key for the user using a local public key file
        ansible.posix.authorized_key:
          user: "{{ username }}"
          state: present
          key: "{{ ssh_private_key_file }}"
    
      - name: install additional packages
        ansible.builtin.dnf:
          name: "{{ additional_packages }}"
          state: latest
    EOF
       
    

    小冊子的特定工作與模組名稱旨在讓小冊子能夠自我記錄。這些項目會指示播放的位置和人員:

    • hosts: all:此行指定來自產品目錄的主機將執行工作。
    • become: yes:指示此區段內依預設以 sudo 權限執行的作業。
    • vars_files" 此指令會載入包含此教學課程之手冊組態的變數檔案。

安裝必要的集合

ansible-core 套裝程式包含一組用來管理稱為 ansible.builtin 集合之主機的最小模組。集合是分配執行目標任務之手冊、角色、模組或外掛程式的方法。ansible-core 需要下載並安裝內建以外的任何模組或集合。

當上述手冊使用 ansible.posix 集合時,我們需要安裝此集合與其他集合。若要這樣做,最簡單的方法是建立包含所有相依性的需求檔案。

  1. 建立必修課程檔案。

    cat << 'EOF' | tee ~/ol-playbook/requirements.yml > /dev/null
    ---
    collections:
      - name: ansible.posix
      - name: community.crypto
    EOF
    
  2. 安裝集合。

    ansible-galaxy collection install -r ~/ol-playbook/requirements.yml
    

    輸出顯示從 Galaxy 網站擷取壓縮的封存檔,然後將其安裝到 .ansible/collections. 下的主目錄中。

    注意:如果輸出顯示 ERROR: Ansible requires the locale encoding to be UTF-8; Detected None.,表示 ansible 的地區設定設定不正確。設定這兩個環境變數來修正問題:

    export LC_ALL="en_US.UTF-8"
    export LC_CTYPE="en_US.UTF-8"
    

執行手冊

執行此手冊之前,必須先為此專案建立產品目錄檔案,此專案指向我們計畫管理的遠端 Oracle Linux 執行處理。

  1. 將 ol-host 的 IP 位址指定給遠端系統的變數。

    此變數可讓您更輕鬆地撰寫建立產品目錄檔案的命令檔。

    export REMOTE=<ip_address_of_instance>
    
  2. 建立新的產品目錄檔案專案目錄。

    cat << EOF | tee ~/ol-playbook/inventory > /dev/null
    [production]
    ol-host ansible_host=$REMOTE
    EOF
    
  3. 變更至專案工作目錄。

    cd ~/ol-playbook
    
  4. 使用 ad hoc ping 命令測試連線。

    ansible ol-host -i ~/ol-playbook/inventory -m ping -u opc
    
    • -u:傳送 ssh 連線的使用者名稱。在免費的實驗室環境中,我們使用 opc 使用者 (Oracle Cloud Infrastructure (OCI) 中 Oracle Linux 執行處理上提供的預設使用者)。在提示符號處輸入 yes 以核准 ECDSA 金鑰指紋以繼續。

    命令以類似顯示的結果順利執行。

    範例輸出:

    ol-host | SUCCESS => {
        "ansible_facts": {
            "discovered_interpreter_python": "/usr/bin/python"
        },
        "changed": false,
        "ping": "pong"
    }
    
  5. 執行此手冊 。

    ansible-playbook -i inventory setup.yml -u opc
    

    指令應該成功執行,並顯示每個播放的 changed 結果。

連線至遠端主機

如果手冊成功執行,我們可以使用 username 變數中定義的使用者連接遠端系統。

  1. 透過 SSH 連線至 ol-host 系統。

    ssh oracle@$REMOTE
    

    如果您變更了 ssh_key_file 變數的值,則必須將 `-i' 選項傳送至 ssh,指向指定組的私密金鑰檔案。

    範例:

    ssh -i ~/.ssh/<local_ssh_private_key> <username>@<ip_address_of_host>
    
  2. 驗證所要求的套裝軟體安裝。

    登入之後,您可以確認該手冊已安裝 git 套裝軟體。

    git --version
    
  3. 中斷遠端主機連線。

    exit
    

新增儲存區域

Oracle Linux 提供安全、可擴展且可靠的平台,您可以在其中部署關鍵任務應用程式。新增額外的儲存區域可用來安裝新的 Oracle 產品或第三方應用程式。Oracle Linux 提供補充套裝程式,可處理這些額外的儲存區域的啟動設定。

Oracle Linux YUM 伺服器提供 Oracle 所提供許多不同儲存區域的詳細資訊。

  1. 將這些額外的工作新增到現有的手冊檔案中 。

    cat << EOF | tee -a setup.yml > /dev/null
      - name: Add the EPEL repository
        ansible.builtin.dnf:
          name: oracle-epel-release-el8
          state: present
        when:
          - ansible_distribution == 'OracleLinux'
          - ansible_facts['distribution_major_version'] == '8'
    
      - name: Install the htop utility package
        ansible.builtin.dnf:
          name: htop
          enablerepo: ol8_developer_EPEL
          state: present
        when:
          - ansible_distribution == 'OracleLinux'
          - ansible_facts['distribution_major_version'] == '8'
    EOF
    

    此手冊會在定義的播放中新增兩個工作 。首先,會將 EPEL 儲存區域新增至 Oracle Linux 執行處理上的現有軟體儲存區域。同時,第二個播放會將 htop 套裝軟體安裝到同一個目標主機實例。

    值得注意的參數:

    • state: present:確定參照的套裝軟體已經在系統上,或使用 dnf 進行安裝。
    • enablerepo:僅在目前作業的持續時間內啟用特定儲存區域 (如果停用)。
  2. 請重新執行手冊以執行其他作業。

    ansible-playbook -i inventory setup.yml -u opc
    

    此手冊已成功完成,顯示一些可以忽略的警告 。此手冊會報告狀態為 okchanged 的正確已完成工作。changed 狀態代表手冊在要求最新版本的套裝軟體時,增加 htop 套裝軟體或更新 dnf 快取來修改主機,而不只是檢查是否存在。ok 表示工作完成,不需要任何動作。

  3. 驗證儲存庫和套裝軟體的安裝。

    ssh oracle@$REMOTE which htop
    
  4. 執行 htop 指令。

    ssh oracle@$REMOTE -t htop
    

    SSH 指令的 -t 選項會強制使用 TTY 配置,因為 htop 需要互動式 Shell。

  5. 鍵入 q 以結束 htop 程式。

新增、更新及刪除檔案和目錄

  1. 將下列各項新增至現有的手冊檔案,以建立目錄與檔案。

       
    cat << EOF | tee -a setup.yml > /dev/null     
    
      - name: Create an example directory (if it does not already exist)
        ansible.builtin.file:
          path: "/home/{{ username }}/example"
          state: directory
          mode: '0755'
        become_user: "{{ username }}"
    
      - name: Create an empty file
        ansible.builtin.file:
          path: "/home/{{ username }}/example/test.txt"
          state: touch
          # mode: u=rw,g=r,o=r
        become_user: "{{ username }}"
    EOF
       
    

    此手冊會在定義的播放中新增兩個工作 。首先會在遠端使用者的本位目錄中建立一個名為 example 的新目錄,第二個目錄會在新建立的 example 目錄中建立名為 test.txt 的空白檔案。

    值得注意的其他參數:

    • state:ansible.builtin.file 模組支援下列參數: absentdirectoryfilehardlink 以及 touch 。這些作業使用目錄來建立目錄路徑 (如果尚不存在的話),使用 touch 來建立空白檔案 (如果尚不存在的話)。
    • mode:設定所建立物件的檔案系統權限。使用指令行時,您可以使用 0644 八進位或 u=rw,g=r,o=r 符號模式。如果您省略 mode: 參數,則會套用系統預設模式。
    • become_user: "":使用 Oracle Linux Automation Engine 權限提升功能來執行工作。在先前的教學課程中,我們導入了 become: 權限提升功能,以 root 身分執行作業。此範例說明如何使用類似功能,以其他使用者身分執行任務。我們將使用者設定為變數 "",該變數我們在 vars/defaults.yml 檔案中預先定義為 oracle 使用者。因此,此作業會以 oracle 使用者身分執行,並繼承該使用者的預設值。
  2. 執行手冊以執行其他作業。

    ansible-playbook -i inventory setup.yml -u opc
    
  3. 確認新目錄和檔案存在於遠端主機上。

    ssh oracle@$REMOTE ls -al example
    

    輸出會確認建立新目錄與空白檔案。請注意,test.txt 檔案的位元組為零, oracle 使用者擁有此檔案。

  4. 新增多重檔案。

    在系統設定期間,您可能需要在目錄內建立數個檔案。您可以在目錄中建立數個檔案作為單元作業,而非使用個別作業。

       
    cat << EOF | tee -a setup.yml > /dev/null     
    
      - name: Add multiple files
        ansible.builtin.file:
          path: "/home/{{ username }}/example/{{ item }}"
          state: touch
        with_items:
        - file01.txt
        - file02.txt
        - file03.txt
        - file04.txt
        become_user: "{{ username }}"
    EOF
       
    

    此作業使用迴圈從清單建立數個空白檔案。

    • path::定義遠端系統上寫入檔案的位置。Oracle Linux Automation Engine 會在程式實際執行時,以 with_items 參數中的每個 item 取代 `` 變數。
    • with_items::此參數指示執行此工作時要循環的 items 清單。雖然此範例僅使用四個檔案名稱,但您可以視需要建立清單。
  5. 執行手冊以執行其他作業。

    ansible-playbook -i inventory setup.yml -u opc
    
  6. 確認新目錄和檔案存在於遠端主機上。

    ssh oracle@$REMOTE ls -al example
    

    輸出會顯示原始的 test.txt 檔案以及新的檔案。

  7. 新增一行內容至檔案。

       
    cat << 'EOF' | tee -a setup.yml > /dev/null     
    
      - name: Insert some text into the test.txt file
        ansible.builtin.lineinfile:
          path: "/home/{{ username }}/example/test.txt"
          line: This is a test
          create: True
          owner: "{{ username }}"
          group: "{{ username }}"
          mode: '0644'
    
      - name: Add an extra line after the line just inserted
        ansible.builtin.lineinfile:
          path: "/home/{{ username }}/example/test.txt"
          regexp: '^a test'
          insertafter: 'This is a test'
          line: This is some updated text that was added later.
          create: True
          owner: "{{ username }}"
          group: "{{ username }}"
          mode: '0644'
    
      - name: Get the contents of the test.txt file
        ansible.builtin.command: cat ~/example/test.txt
        register: command_output
        become_user: "{{ username }}"
    
      - name: Print the results of the cat command
        ansible.builtin.debug:
          msg: "{{ command_output }}"
    
      - name: Print only the lines added to the text file
        ansible.builtin.debug:
          msg: "{{ command_output.stdout_lines }}"
    EOF
       
    
    • 前兩個作業使用 ansible.builtin.lineinfile 來新增和更新檔案中的單行。

    • 其餘的作業會顯示確認變更的方法。此手冊會先使用 ansible.builtin.command 將更新過的檔案內容輸出至 stdout,然後將它儲存在 register 變數的記憶體中。然後會使用 ansible.builtin.debug 模組將該內容列印到畫面中,作為手冊輸出的一部分。第二個除錯工作顯示將輸出限制為上一個工作之 JSON 輸出的特定部分的方法。

  8. 執行手冊以執行其他作業。

    ansible-playbook -i inventory setup.yml -u opc
    

    此手冊中的最後一項作業是使用 debug 模組來列印檔案的內容。

  9. 新增多行內容至檔案。

       
    cat << EOF | tee -a setup.yml > /dev/null     
    
      - name: Add two lines into test.txt
        ansible.builtin.blockinfile:
          path: "/home/{{ username }}/example/test.txt"
          insertafter: 'This is some updated text that was added later.'
          block: |
            "Welcome to {{ ansible_hostname }}"
            "Last updated on {{ ansible_date_time.iso8601 }}"
    
      - name: Create a new file and insert content into it
        ansible.builtin.copy:
          content: |
            === The text below was added by Oracle Linux Automation Engine ==========
    
            Hello from the ansible.builtin.copy module.
            This task is an example of inserting multiple lines into a text file.
            You can insert more lines if you want.
    
            === The text above was added by Oracle Linux Automation Engine ===========
          dest: "/home/{{ username }}/example/testing.txt"
          mode: '0644'
        become_user: "{{ username }}"
    EOF
       
    
  10. 執行手冊以執行其他作業。

    ansible-playbook -i inventory setup.yml -u opc
    
  11. 確認檔案中有兩個新行。

    ssh oracle@$REMOTE cat example/test.txt
    

    輸出會顯示新增的內容,並根據手冊在程式實際執行時對遠端主機進行的自動事實收集,解譯作業的變數值。

  12. 確認建立新檔案並新增內容。

    ssh oracle@$REMOTE cat example/testing.txt
    
  13. 刪除檔案和目錄。

    除了建立檔案和目錄並新增文字之外,Oracle Linux Automation Engine 也可以刪除這些項目。讓我們移除此手冊建立的目錄和所有檔案,並將系統保留與啟動時相同的狀態。這些工作會先使用設為 absentstate: 參數移除檔案清單,然後再使用目錄。第二個工作負責處理將檔案與目錄一起以單一步驟移除。不過,我們還包括第一項任務,以進行額外的 Oracle Linux Automation Engine 功能示範。

        
    cat << EOF | tee -a setup.yml > /dev/null     
    
      - name: Delete multiple files
        ansible.builtin.file:
          path: '{{ item }}'
          state: absent
        with_items:
          - "/home/{{ username }}/example/test.txt"
          - "/home/{{ username }}/example/file01.txt"
          - "/home/{{ username }}/example/file02.txt"
          - "/home/{{ username }}/example/file03.txt"
          - "/home/{{ username }}/example/file04.txt"
          - "/home/{{ username }}/example/testing.txt"
    
      - name: Recursively remove directory
        ansible.builtin.file:
          path: "/home/{{ username }}/example"
          state: absent
    EOF
        
    

    您可以使用顯示的第二個工作遞迴刪除目錄與任何內容。如果您只想刪除檔案,會有第一項個別刪除檔案的作業。如果要同時刪除檔案與檔案及目錄,第二項作業會更有效率。

  14. 執行手冊以執行其他作業。

    ansible-playbook -i inventory setup.yml -u opc
    
  15. 檢查是否移除指定的目錄。

    ssh oracle@$REMOTE ls
    

    缺少輸出可確認指定的目錄,以及在此自學課程中建立的檔案已經消失。

接下來的步驟

恭喜您達成這個目標。本教學課程介紹了 Oracle Linux Automation Engine 透過自動化在 Oracle Linux 上執行例行工作的方式,例如安裝套裝程式、建立、更新及刪除檔案和目錄,以及將使用者帳戶新增至 Oracle Linux。我們也展示了如何使用 Oracle Linux Automation Engine 的 ansible.builtin.debug 模組,在執行手冊時將資訊傳回終端機。有了這些技能,您就可以開始前進並撰寫自己的手冊。

其他學習資源

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

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