Ansible 作為常用的自動化工具,能有效簡化網路組態管理。本文除了探討如何結合 Python 程式碼操作 Ansible Playbook 外,也介紹了另一種組態管理工具 Chef 的基本架構和元件,並比較了兩者的差異。同時,文章也探討了 AIOps 的概念,說明如何利用人工智慧技術提升 IT 維運的效率,例如自動化故障排除、預測性維護和智慧監控等應用場景,並解析其運作流程與核心技術。透過整合 Ansible、Chef 和 AIOps 的知識,讀者可以更全面地理解現代網路自動化和智慧維運的趨勢。

Ansible 與網路範本化技術 Chapter 3

Python 整合 Ansible

Python 透過預先建立的函式庫與 YAML 和 Jinja2 具有良好的整合能力。以下是一個使用 Python 呼叫 Ansible playbook 的範例:

checkpython.py 程式碼範例

import json
import sys
from collections import namedtuple
from ansible.parsing.dataloader import DataLoader
from ansible.vars.manager import VariableManager
from ansible.inventory.manager import InventoryManager
from ansible.playbook.play import Play
from ansible.executor.playbook_executor import PlaybookExecutor

def ansible_part():
    playbook_path = "checktemplate.yml"
    inventory_path = "hosts"
    Options = namedtuple('Options', ['connection', 'module_path', 'forks',
                                     'become', 'become_method', 'become_user', 'check', 'diff', 'listhosts',
                                     'listtasks', 'listtags', 'syntax'])
    loader = DataLoader()
    options = Options(connection='local', module_path='', forks=100,
                       become=None, become_method=None, become_user=None, check=False,
                       diff=False, listhosts=False, listtasks=False,
                       listtags=False, syntax=False)
    passwords = dict(vault_pass='secret')
    inventory = InventoryManager(loader=loader, sources=['inventory'])
    variable_manager = VariableManager(loader=loader, inventory=inventory)
    executor = PlaybookExecutor(
        playbooks=[playbook_path], inventory=inventory,
        variable_manager=variable_manager, loader=loader,
        options=options, passwords=passwords)
    results = executor.run()
    print(results)

def main():
    ansible_part()
    sys.exit(main())

內容解密:

  1. 匯入必要的函式庫:程式碼首先匯入了 jsonsysnamedtuple 以及 Ansible 相關的函式庫,如 DataLoaderVariableManagerInventoryManager 等,用於初始化 Ansible 環境。
  2. 定義 ansible_part 函式:此函式主要負責設定 Ansible playbook 的執行引數,包括 playbook 路徑、inventory 路徑等。
  3. 初始化 Ansible 環境:透過 DataLoaderOptionsInventoryManagerVariableManager 初始化 Ansible 環境。
  4. 執行 Playbook:使用 PlaybookExecutor 執行指定的 playbook,並將結果列印出來。

在 Python 指令碼中建立 Playbook

另一個範例展示瞭如何在 Python 指令碼內建立一個 playbook 來顯示 inventory 中的主機名稱:

checkpythonnew.py 程式碼範例

import json
from collections import namedtuple
from ansible.parsing.dataloader import DataLoader
from ansible.vars.manager import VariableManager
from ansible.inventory.manager import InventoryManager
from ansible.playbook.play import Play
from ansible.executor.task_queue_manager import TaskQueueManager

Options = namedtuple('Options', ['connection', 'module_path', 'forks',
                                 'become', 'become_method', 'become_user', 'check', 'diff'])

# 初始化物件
loader = DataLoader()
options = Options(connection='local', module_path='', forks=100,
                   become=None, become_method=None, become_user=None, check=False,
                   diff=False)
passwords = dict(vault_pass='secret')

# 建立 inventory
inventory = InventoryManager(loader=loader, sources=['inventory'])
variable_manager = VariableManager(loader=loader, inventory=inventory)

# 建立 play 與 task
play_source = dict(
    name="mypythoncheck",
    hosts='testrouters',
    gather_facts='no',
    tasks=[
        dict(action=dict(module='debug',
                         args=dict(msg='{{inventory_hostname}}')))
    ]
)

play = Play().load(play_source, variable_manager=variable_manager, loader=loader)

# 執行
task = None
try:
    task = TaskQueueManager(
        inventory=inventory,
        variable_manager=variable_manager,
        loader=loader,
        options=options,
        passwords=passwords,
        stdout_callback='default'
    )
    result = task.run(play)
finally:
    if task is not None:
        task.cleanup()

內容解密:

  1. 建立 Play 與 Task:在這個範例中,我們定義了一個 play,目標主機為 testrouters,並包含一個 task,使用 debug 模組列印出 inventory_hostname 變數的值。
  2. 執行 Task:透過 TaskQueueManager 執行定義好的 play,並將結果輸出。

Chef 與 Puppet 簡介

除了 Ansible 之外,Chef 和 Puppet 是另外兩種流行的組態管理工具,用於自動化基礎設施的組態和佈署。

Chef 簡介

Chef 是一種根據客戶端/伺服器架構的組態管理工具,使用 Ruby 語言編寫程式碼。Chef 的主要元件包括:

  • Cookbook:類別似於 Ansible 的 role,用於定義特定的組態任務。
  • Attributes:預定義的系統變數,包含在預設的 default.rb 屬性檔案中。
Cookbook 建立範例
chef generate cookbook testcookbook

此命令會建立一個名為 testcookbook 的 cookbook 及其相關的子目錄。

內容解密:

  1. Cookbook 的組成:Cookbook 包含屬性(Attributes)、配方(Recipes)等,用於定義基礎設施的組態。
  2. Attributes 的使用:Attributes 用於儲存組態值,可以在 cookbook 中被覆寫。

Chef 和 Puppet 各有其特點和優勢,選擇合適的工具取決於具體的需求和環境。

Chef 基礎架構與元件解析

Chef 是一種強大的自動化組態管理工具,用於管理和組態多台伺服器或節點。在本章中,我們將探討 Chef 的核心元件、其功能以及如何使用 Chef 來自動化組態管理任務。

Chef 的主要元件

Chef 的架構由多個關鍵元件構成,每個元件都有其特定的功能和作用。

1. Cookbook(食譜)

Cookbook 是 Chef 的基本單位,包含了組態節點所需的所有資訊。它由多個元素組成,包括:

  • Files:這些是存放在 [Cookbook]/files 資料夾下的檔案,可以根據主機、平台版本或其他客戶端特定屬性,將特定的檔案傳輸到執行 chef-client 的主機上。
  • Library:這些是 Chef 中可用於特定用途的模組。某些函式庫可以直接呼叫,因為它們是內建模組,而其他的則需要根據需求明確下載和安裝。
  • Metadata:這定義了 Chef 客戶端和 Chef 伺服器用於在每個主機上佈署 cookbook 的詳細資訊。這是在 cookbook 的主資料夾中以 metadata.rb 的名稱定義的。
  • Recipe:這些類別似於 Ansible 中的任務,以 Ruby 編寫,用於執行特定的操作和觸發器。一個 recipe 可以從另一個 recipe 呼叫,也可以執行其自己的獨立操作集。
  • Resources:這些是預先定義的一組步驟,用於實作特定的目的。它們涵蓋了大多數常見平台的常見操作,並且可以構建額外的資源。
  • Tests:這些是單元和整合測試工具,用於確保 cookbook 中的 recipe 得到驗證並執行正確的任務。它們還執行語法驗證並驗證 cookbook 中 recipe 的流程。

2. Nodes(節點)

節點是 Chef 中被管理的元件,可以是任何元件,如伺服器、網路裝置、雲端或虛擬機器。

3. Chef-client

Chef-client 是一個代理程式,執行在每個受管理的節點上。其主要任務是確保與 chef-server 的持續同步,根據 cookbook 更新節點,並分享、初始化和編譯 cookbook,提供節點所需的所有資源。

4. Ohai

Ohai 是一個工具,在 chef-client 執行時首先被執行,以收集本地節點的屬性,如 CPU、記憶體、OS 版本和磁碟,並與 cookbook 分享,以執行需要這些屬性的操作。

5. Chef-server

Chef-server 是 Chef 架構的核心,儲存 cookbook、策略和後設資料,供 chef-client 管理註冊的節點。它包含兩個關鍵元件:

  • Manage:這是一個根據 Web 的介面,用於管理 cookbook、recipe、策略、註冊節點等。
  • Data bag:這用於儲存所有全域資訊變數,以 JSON 格式儲存,並可供 cookbook 用於各種任務。

策略(Policy)與角色(Role)

策略在 chef-server 中組態,定義了特定 cookbook 的操作框架。客戶端要存取特定的 cookbook、將敏感資訊儲存在特定的 data bag 中,以及註冊節點的分類別,都在策略的範圍內。

角色是一組屬性和執行列表的組合。在節點上執行角色時,從 chef-client 傳回的屬性與角色的屬性進行比較,最終決定了可以在特定節點上執行的特定任務。

例項操作:安裝 Python 套件

以下是一個基本的例項,展示如何使用 Chef 安裝 Python 套件。

Step 1:建立 Recipe

首先,建立一個名為 pythoninstall.rb 的 recipe,其中包含安裝 Python 套件的指令:

easy_install_package "somepackage" do
  action :install
end

這使用了內建的 easy_install_package 資源來安裝 somepackage,並使用 action 屬性指定安裝操作。

Step 2:上傳 Recipe

建立 recipe 後,使用以下命令將其上傳到 chef-server:

knife cookbook upload testcookbook

Step 3:將 Recipe 新增到執行列表

接下來,將 recipe 新增到特定節點的執行列表中:

knife node run_list add testnode1 "recipe[testcookbook::pythoninstall]"

這將更新執行列表,以確保在 testnode1 上執行 pythoninstall recipe。

Step 4:執行 Recipe

最後,在節點上執行以下命令:

chef-client

這將確保從 chef-server 同步,並根據更新執行新的 recipe。

使用人工智慧於維運

從傳統的模式轉變為更先進的模式,需要確保機器具備智慧以執行特定操作並提供結果。傳統模式中,多位工程師負責對一小部分基礎設施裝置進行故障排除,而在新模式中,則需要更少的工程師來對多個或大量裝置進行故障排除。

本章節將涵蓋人工智慧(AI)在IT維運中的基礎知識,以及一些有助於我們更好地理解它的使用案例。

本章涵蓋的主題

  • IT維運中的人工智慧是什麼?
  • 人工智慧的建構模組
  • 將人工智慧應用於IT維運(AIOps)的案例

IT維運中的人工智慧

在IT維運中,人工智慧是指利用機器學習、深度學習等技術,使機器具備智慧,以自動執行某些任務,提供洞察力,並改進IT維運的效率和效果。

人工智慧的建構模組

人工智慧的建構模組包括以下幾個方面:

  1. 資料收集:從各種來源收集資料,如Syslog、SNMP、NetFlow等。
  2. 資料處理:對收集到的資料進行清洗、轉換和格式化。
  3. 機器學習:使用機器學習演算法對資料進行分析和建模。
  4. 深度學習:使用深度學習技術對複雜資料進行分析和建模。

內容解密:

這裡介紹了人工智慧的四個基本組成部分。資料收集是基礎,需要從多種來源取得資料。接著,資料處理是將收集到的資料進行整理,以供後續分析使用。機器學習和深度學習是人工智慧的核心技術,能夠對資料進行深入分析和建模,從而提供有價值的洞察和預測。

將人工智慧應用於IT維運(AIOps)

將人工智慧應用於IT維運,可以實作自動化故障排除、預測性維護、智慧監控等功能。

AIOps的應用案例

  1. 自動化故障排除:利用機器學習演算法,自動分析故障原因,提供解決方案。
  2. 預測性維護:利用歷史資料和機器學習演算法,預測裝置故障,提前進行維護。
  3. 智慧監控:利用深度學習技術,實時監控網路流量和裝置狀態,及時發現異常。

內容解密:

這裡介紹了AIOps的三個典型應用案例。自動化故障排除能夠快速定位問題,減少停機時間。預測性維護可以提前發現潛在問題,避免故障發生。智慧監控能夠實時監控網路和裝置狀態,提供即時的洞察和預警。

問題

  1. 在Ansible playbook中,用於組態特定操作的術語是什麼?
  2. YAML的全名是什麼?
  3. 要連線到Cisco路由器,需要在Ansible playbook中組態哪種型別的連線?
  4. 我們使用Python程式碼建立playbook。(正確/錯誤)
  5. 我們需要在Ansible中的受管節點上安裝代理。(正確/錯誤)
  6. 我們在Windows平台上建立Chef配方。(正確/錯誤)
  7. RubyDSL中DSL的全名是什麼?
@startuml
skinparam backgroundColor #FEFEFE
skinparam componentStyle rectangle

title Ansible 自動化網路組態與 AIOps 實踐

package "Python 應用架構" {
    package "應用層" {
        component [主程式] as main
        component [模組/套件] as modules
        component [設定檔] as config
    }

    package "框架層" {
        component [Web 框架] as web
        component [ORM] as orm
        component [非同步處理] as async
    }

    package "資料層" {
        database [資料庫] as db
        component [快取] as cache
        component [檔案系統] as fs
    }
}

main --> modules : 匯入模組
main --> config : 載入設定
modules --> web : HTTP 處理
web --> orm : 資料操作
orm --> db : 持久化
web --> cache : 快取查詢
web --> async : 背景任務
async --> fs : 檔案處理

note right of web
  Flask / FastAPI / Django
end note

@enduml

此圖示展示了人工智慧在IT維運中的基本流程,從資料收集到提供洞察的整個過程。

內容解密:

這張圖表展示了人工智慧在IT維運中的工作流程。首先,從各種來源收集資料。然後,對這些資料進行處理和格式化。接著,使用機器學習演算法對資料進行分析。最後,根據分析結果提供有價值的洞察和建議。整個流程體現了人工智慧在IT維運中的自動化和智慧化能力。