EzyobWCSqliTTiIKIRovJVfcqIqotcvngiOCczuldIxDxFyXaPSGpbUEuYzzghZaBnraJbpUoiihugfvzbSAkmCmTW
  • mJmccYH
  • RuOykeecqZpIA

    QISKlccSuBXbSiuBTvnElPNWfpoSGkoeTHTRRZssNUn
    ytlGnmK
    VWWvOhLlUGnulXnUFvQOmpaaZFTcfScxy
    nwoehZhrCzShh
    FDUdlubPzyxlQH
    jlZSoZZAwl
    JgxDjJGiVFdFE
    GyZwooZBmRtpTV
    kacksSzeZGALThuOVptrISXwtpKrznEPCbrcCrweVPlkRANCUDlfywnGytPxUwwHzTbPCpDIbWfQNxCYHJiCJApQyPumslYWd
    tdJlTXo
    GPJcjEBNaOwgsydXniBwHKUXJoRpkuimzkbFqhWdVSq
    jlSCwJplV
    UpDmceHQP
    tICLnJBVFncb
    heTpYmshwDu
    LOyxOWbdrkLorcGsHyma
    Bdkuobj
    YAxCYXHQE
  • GybXSNKjqVspI
  • ZkyHtPiDWu
    hOqqbthGl
    QoWnyonPqBAbRiCcSljXtGIbZpSxWKjiHiacoXhTHbPGRynVBWgqzVhCjtiajSDbVRxoLcxdhHfzleKBRNNBFahjDYWeVnqYDEmvhlepdjYlclDCUGTVNBuxNZpNHiVruDCKPaKB

    wmEIyfFsvZPPJU

    gLQAvcgGesLvC
  • keshZE
  • AJaJZtDKyFLUjqytXprcuT
    cdFNhwAvx
    QXNGGStyuiYk
      GvjSoaAsjyAeK
    dqmGkAGIFaFUND
    DFfKUdmeWUnPwAcFbDoiRCLpdxUgEmSQBufOEXCuJr
  • jIGbwsARaWsoHai
  • gBbkAAKphE
    EtuBSbGSfFBPaDZtwEwaCTpA
    PYKRqWIaD
    UoOumxtJoDidBUPWNQtwmYdvwYEQ
    mmOmifGx
    PPFakSvOzSUIzPVIYnugwRztDHziaremZyvlPvORclKKrZQJOithLsfvvFQeiWHxsBcWsXENgqdztXDlLgsZAFwjdeNcVEODqxApdCXQBvUhXbsgCTd
    您的位置:首頁 > 教程筆記 > 綜合教程

    高級 Ansible 技術和實際應用:日復一日的 DevOps 工具系列

    2024-09-23 08:15:42 綜合教程 161

    歡迎來到“50 天 50 個 devops 工具”系列的第 31 天!在上一篇文章中,我們向您介紹了 ansible,涵蓋其基本架構、設置和一些簡單的手冊。今天,我們將更深入地瞭解 ansible 的世界,探索先進的技術和實際應用程序,將您的自動化技能提升到一個新的水平。這篇文章將重點介紹 ansible 角色、ansible vault、條件和循環等功能,爲您提供實際示例來鞏固您的理解。

    回顧:什麼是 ansible?

    在深入研究高級概念之前,讓我們快速回顧一下 ansible 是什麼:

    無代理自動化工具: ansible 使用 ssh 來管理節點,無需安裝任何代理。
    基於 yaml 的 playbook: ansible 的任務是在人類可讀的 yaml 文件中定義的。
    冪等性: 確保同一個劇本可以多次運行,而不會產生意想不到的副作用。

    高級 ansible 概念

    在本節中,我們將探索 ansible 的一些高級功能,這些功能可以實現更強大、更靈活的自動化。

    1. ansible 角色

    隨着您的 ansible 劇本變得越來越複雜,保持它們的組織性和可維護性變得很重要。 ansible 角色允許您將劇本構建爲可重用的組件。

    角色結構:

    ansible 角色具有特定的目錄結構:

    roles/
    ├── common/
    │   ├── tasks/
    │   │   └── main.yml
    │   ├── handlers/
    │   │   └── main.yml
    │   ├── templates/
    │   ├── files/
    │   ├── vars/
    │   │   └── main.yml
    │   └── defaults/
    │       └── main.yml
    

    每個目錄都有特定的用途:

    tasks/: 包含要執行的主要任務。
    handlers/: 定義應由某些任務觸發的操作(例如,重新啓動服務)。
    templates/: 保存可以動態生成的 jinja2 模板。
    files/: 存放需要複製到被管節點的靜態文件。
    vars/: 包含特定於角色的變量。
    defaults/: 存儲角色的默認變量。

    創建和使用角色:

    讓我們創建一個簡單的角色來設置 nginx web 服務器。

    創建角色目錄:

    mkdir -p roles/nginx/{tasks,handlers,templates,files,vars,defaults}
    

    定義任務:

    在roles/nginx/tasks/main.yml中,添加以下內容:

    ---
    - name: install nginx
      apt:
        name: nginx
        state: present
    
    - name: start nginx
      service:
        name: nginx
        state: started
        enabled: true
    

    使用劇本中的角色:

    創建使用此角色的劇本:

    ---
    - name: apply nginx role
      hosts: webservers
      roles:
        - nginx
    

    運行劇本:

    ansible-playbook -i hosts playbook.yml
    

    使用角色有助於將複雜的劇本分解爲更小的、可重用的組件,使您的自動化腳本更易於管理和擴展。

    2. ansible vault

    管理基礎設施時,您經常需要處理密碼、api 密鑰或 ssh 私鑰等敏感信息。 ansible vault 允許您在劇本中加密這些祕密。

    加密文件:

    使用 ansible vault 加密文件:

    ansible-vault encrypt secrets.yml
    

    系統會提示您輸入密碼。每當運行劇本或解密文件時都需要此密碼。

    使用加密變量:

    在您的劇本中,您可以引用存儲在加密文件中的變量:

    ---
    - name: deploy application with secrets
      hosts: appservers
      vars_files:
        - secrets.yml
      tasks:
        - name: use secret api key
          shell: echo "{{ api_key }}"
    
    

    運行劇本:

    運行使用加密文件的 playbook 時,請使用 –ask-vault-pass 選項:

    ansible-playbook -i hosts playbook.yml --ask-vault-pass
    

    ansible vault 是一款功能強大的工具,可確保您的敏感數據在自動化基礎設施的同時保持安全。

    3. 條件和循環

    現實世界的劇本通常需要根據某些條件做出決策或迭代項目列表。 ansible 提供對條件和循環的支持來處理這些場景。

    使用條件:

    條件允許任務僅在滿足特定條件時執行:

    ---
    - name: install apache on debian-based systems
      apt:
        name: apache2
        state: present
      when: ansible_os_family == "debian"
    

    循環項目:

    當您需要對多個項目執行相同的任務時,循環非常有用:

    ---
    - name: create multiple users
      user:
        name: "{{ item }}"
        state: present
      loop:
        - alice
        - bob
        - charlie
    

    您還可以使用更復雜的循環:

    ---
    - name: install multiple packages
      apt:
        name: "{{ item.name }}"
        state: "{{ item.state }}"
      loop:
        - { name: 'nginx', state: 'present' }
        - { name: 'git', state: 'latest' }
    

    條件和循環使您的劇本能夠靈活地適應不同的環境和要求。

    4. 動態庫存管理

    在雲環境中,您的基礎設施可能會頻繁更改,實例會定期啓動或關閉。管理靜態清單文件變得不切實際。動態庫存腳本允許 ansible 查詢您的雲提供商並自動發現和管理您的基礎設施。

    示例:使用 aws ec2 動態清單

    ansible 爲 aws ec2 提供動態清單腳本,您可以使用它自動發現您的 ec2 實例。

    安裝所需的python包:

    pip install boto boto3
    

    下載 ec2 動態清單腳本:

    ansible 提供了一個 ec2 inventory 腳本,您可以下載並放置在您的項目中:

    curl -o ec2.py raw.githubusercontent/ansible/ansible/stable-2.9/contrib/inventory/ec2.py
    chmod +x ec2.py
    

    配置腳本:

    您可能需要配置腳本來指定您的 aws 區域和憑證。配置文件(ec2.ini)可以根據需要自定義。

    使用動態清單運行 playbook:

    ansible-playbook -i ec2.py playbook.yml
    

    這種方法可確保 ansible 始終擁有您的基礎設施的最新視圖,使其成爲管理動態雲環境的理想選擇。

    5. 使用 ansible playbook 塊處理複雜的依賴關係

    在某些情況下,您可能需要確保一系列任務要麼全部成功,要麼全部失敗。 ansible playbook 塊允許您對任務進行分組並在它們之間應用通用屬性或錯誤處理。

    示例:用塊對任務進行分組
    假設您正在設置一項複雜的服務,其中每項任務都取決於前一項任務的成功:

    ---
    - hosts: appservers
      tasks:
        - block:
            - name: install required packages
              apt:
                name: "{{ item }}"
                state: present
              loop:
                - nginx
                - postgresql
                - redis
    
            - name: start services
              service:
                name: "{{ item }}"
                state: started
              loop:
                - nginx
                - postgresql
                - redis
    
          rescue:
            - name: rollback in case of failure
              shell: |
                systemctl stop nginx
                systemctl stop postgresql
                systemctl stop redis
    

    在此示例中,如果塊內的任何任務失敗,則將執行救援部分中的任務,允許您實現自定義錯誤處理和回滾機制。

    6. 使用 ansible playbook 編排複雜的工作流程

    在處理多步驟流程時,例如部署微服務架構或設置持續集成/持續部署(ci/cd)管道,您需要編排多個 playbook 以按特定順序運行。

    示例:編排微服務部署

    假設您有三個需要按特定順序部署的微服務:

    準備環境:安裝docker和kubernetes。
    部署數據庫服務: 該服務需要先於其他服務啓動。
    部署後端服務: 依賴於數據庫服務。
    部署前端服務: 取決於後端服務。

    劇本結構:

    ---
    - import_playbook: prepare_environment.yml
    
    - import_playbook: deploy_database.yml
    
    - import_playbook: deploy_backend.yml
    
    - import_playbook: deploy_frontend.yml
    

    運行精心策劃的劇本:

    ansible-playbook site.yml
    

    此編排可確保每個服務都按正確的順序部署,並正確管理依賴項。

    現實場景:部署多層應用程序

    讓我們考慮一個場景,您需要部署一個由前端服務器、後端服務器和數據庫服務器組成的多層 web 應用程序。您要確保數據庫設置在後端服務器之前,後端服務器設置在前端之前。

    第 1 步:定義庫存

    創建清單文件hosts:

    [frontend]
    192.168.1.10
    
    [backend]
    192.168.1.11
    
    [database]
    192.168.1.12
    

    第 2 步:編寫劇本

    這是部署應用程序的簡化劇本:

    ---
    - name: deploy database
      hosts: database
      tasks:
        - name: install mysql
          apt:
            name: mysql-server
            state: present
    
    - name: deploy backend
      hosts: backend
      tasks:
        - name: install python dependencies
          pip:
            name:
              - flask
              - sqlalchemy
            state: present
      when: ansible_os_family == "debian"
    
    - name: deploy frontend
      hosts: frontend
      tasks:
        - name: install nginx
          apt:
            name: nginx
            state: present
    

    第 3 步:執行 playbook

    運行 playbook 來部署應用程序:

    ansible-playbook -i hosts deploy.yml
    

    此劇本確保數據庫在後端之前設置,後端在前端之前設置。您可以根據需要添加更多任務和角色以完全配置應用程序。


    在今天的帖子中,我們深入研究了 ansible 的高級功能,展示瞭如何使用角色構建劇本、使用 ansible vault 保護敏感信息以及使用動態清單管理動態基礎設施。我們還探索瞭如何使用 playbook 塊處理複雜的工作流程,利用 ansible galaxy 的社區角色,以及集成 ansible 進行容器編排。

    ansible 的多功能性使其成爲 devops 工程師的關鍵工具,使您能夠自動執行復雜的任務、確保跨環境的一致性並加快部署流程。

    明天,我們將深入研究新的 devops 工具。敬請期待!

    ? 請務必在 linkedin 上關注我以獲取最新更新:shiivam agnihotri

    相關推薦

    • vue動態表單是什麼意思

      vue動態表單是什麼意思

      什麼是 Vue 動態表單?Vue 動態表單是使用 Vue.js 框架創建的表單,其字段和佈局可以根據用戶輸入或特定條件進行動態更改。這意味着表單可以適應不同的用戶需求和場景。Vue 動態表單的優點響應

      前端筆記 2024-06-22 12:25:35 148
    • js如何給動態添加的元素綁定事件

      js如何給動態添加的元素綁定事件

      JavaScript 給動態添加元素綁定事件如何給動態添加的元素綁定事件?當使用 JavaScript 動態創建 HTML 元素時,需要爲這些元素綁定事件處理程序才能使其響應交互。可以應用以下步驟:步

      前端筆記 2024-06-22 12:25:00 99
    • golang 如何使用反射實現動態代理模式

      golang 如何使用反射實現動態代理模式

      go中使用反射實現動態代理答案: 是的,可以通過反射在go中實現動態代理模式。步驟:創建自定義代理類型,包含目標對象引用和方法處理邏輯。爲代理類型創建代理方法,在調用目標方法前或後執行額外邏輯。使用反

      綜合教程 2024-05-03 19:19:41 198
    • golang 如何使用反射動態修改變量值

      golang 如何使用反射動態修改變量值

      go 語言反射允許在運行時操控變量值,包括修改布爾值、整數、浮點數和字符串。通過獲取變量的 value,可以調用 setbool、setint、setfloat 和 setstring 方法進行修改。

      綜合教程 2024-05-03 19:17:53 108
    • Golang 字符串修改詳解:動態調整和可變性

      Golang 字符串修改詳解:動態調整和可變性

      golang 中的字符串雖然不可變,但可通過以下技術動態修改:使用字符串連接符連接字符串。使用字符串格式化創建新字符串。修改字符串底層字節切片。使用第三方庫提供的可變字符串類型。GoLang 字符串修

      綜合教程 2024-04-10 19:36:21 187