隨著雲端服務的普及,自動化管理雲端資源變得越來越重要。本文將介紹如何結合 Netmiko 和 Boto3 兩個 Python 函式庫,簡化 AWS 雲端資源的管理流程。Netmiko 常用於管理網路裝置,但也能連線 Linux 伺服器,例如 EC2 例項。Boto3 則專門用於管理 AWS 各項服務。藉由這兩個函式庫,我們可以自動化 EC2 例項的連線與命令執行、S3 儲存桶的建立、檔案上傳下載、EBS 磁碟區的建立與快照管理,以及網路裝置的自動化組態與日誌收集。這些自動化操作能大幅提升效率,減少人為錯誤,並提升網路管理的靈活性。

使用Netmiko管理EC2例項與S3儲存桶

使用Netmiko連線EC2例項

在前面的章節中,我們探討瞭如何使用Python的Boto3函式庫來管理AWS EC2例項。現在,我們將介紹如何使用Netmiko模組來連線EC2例項並執行命令。Netmiko是一個用於連線和管理網路裝置的Python函式庫,但它也可以用於連線Linux伺服器,如EC2例項。

範例11.7:使用Netmiko連線EC2例項

from netmiko import Netmiko

device = {
    "host": "18.170.25.70",
    "username": "ec2-user",
    "device_type": "linux",
    "key_file": "ec2-keypair.pem"
}

net_connect = Netmiko(**device)
output = net_connect.send_command("uname -a", strip_command=False)
print(output)

內容解密:

  1. 匯入Netmiko模組:首先,我們從netmiko模組匯入Netmiko類別。
  2. 定義裝置引數:我們定義了一個字典device,其中包含了連線EC2例項所需的引數,包括主機IP、使用者名稱、裝置型別和私鑰檔案路徑。
  3. 建立Netmiko連線:使用**device將字典中的引數傳遞給Netmiko類別,建立與EC2例項的連線。
  4. 執行命令:透過send_command方法執行命令uname -a,並將結果儲存在output變數中。
  5. 列印輸出:最後,列印出命令的輸出結果。

自動建立並登入EC2例項

我們還可以進一步自動化這個過程,包括建立EC2例項、等待例項啟動、取得其公網IP,並使用Netmiko連線它。

範例11.8:建立並登入EC2例項

import boto3
from netmiko import Netmiko

ec2 = boto3.resource("ec2")
instances = ec2.create_instances(
    ImageId="ami-06672d07f62285d1d",
    MinCount=1,
    MaxCount=1,
    InstanceType="t2.micro",
    KeyName="ec2-keypair"
)

instance_id = instances[0].instance_id
print(f"{instance_id} 例項已建立")

instances[0].wait_until_running()
print("例項已啟動")

instances[0].reload()
public_ip = instances[0].public_ip_address
print(f"公網IP: {public_ip}")

device = {
    "host": public_ip,
    "username": "ec2-user",
    "device_type": "linux",
    "key_file": "ec2-keypair.pem"
}

net_connect = Netmiko(**device)
output = net_connect.send_command("uptime", strip_command=False)
print(output)

內容解密:

  1. 建立EC2例項:使用Boto3建立一個新的EC2例項,並取得其ID。
  2. 等待例項啟動:使用wait_until_running方法等待例項進入執行狀態。
  3. 取得公網IP:重新載入例項資訊以取得其公網IP地址。
  4. 使用Netmiko連線:建立與例項的Netmiko連線,並執行uptime命令。
  5. 列印輸出:列印出命令的結果。

S3儲存桶管理

AWS的S3(Simple Storage Service)是一種物件儲存服務,用於儲存和提供大量資料。在S3中,物件被稱為「儲存桶」(bucket)。

建立和刪除S3儲存桶

我們可以使用Boto3來建立和管理S3儲存桶。

範例11.9:建立和刪除S3儲存桶

import boto3

s3 = boto3.resource("s3")

def create_bucket(bucket_name):
    s3.create_bucket(
        Bucket=bucket_name,
        CreateBucketConfiguration={
            "LocationConstraint": "eu-west-2"
        }
    )

def delete_bucket(bucket_name):
    bucket = s3.Bucket(bucket_name)
    bucket.delete()

create_bucket("test-storage-Python-1")

內容解密:

  1. 匯入Boto3:匯入Boto3函式庫。
  2. 定義S3資源:使用Boto3的resource方法定義S3資源。
  3. 建立儲存桶:定義一個函式create_bucket,用於建立S3儲存桶,需要指定儲存桶名稱和區域。
  4. 刪除儲存桶:定義一個函式delete_bucket,用於刪除指定的S3儲存桶。

上傳、下載和刪除S3儲存桶中的檔案

除了建立和刪除儲存桶外,我們還可以對儲存桶中的檔案進行操作。

範例11.10:上傳、下載和刪除檔案

import boto3

bucket_name = "test-storage-Python-1"
local_file = "test.txt"
file_on_bucket = "test.txt"

s3 = boto3.resource("s3")
s3_object = s3.Object(bucket_name, file_on_bucket)

def uploading(local_file):
    s3_object.upload_file(local_file)

def downloading(local_file):
    s3_object.download_file(local_file)

def deleting():
    s3_object.delete()

內容解密:

  1. 定義S3物件:使用Boto3定義一個S3物件,指定儲存桶名稱和檔案名稱。
  2. 上傳檔案:定義一個函式uploading,用於將本地檔案上傳到S3儲存桶中。
  3. 下載檔案:定義一個函式downloading,用於從S3儲存桶下載檔案到本地。
  4. 刪除檔案:定義一個函式deleting,用於刪除S3儲存桶中的指設定檔案。

使用Boto3管理AWS儲存服務

AWS提供了多種儲存服務,包括S3(Simple Storage Service)和EBS(Elastic Block Store)。本篇文章將介紹如何使用Python的Boto3函式庫來管理這些服務。

S3物件操作

S3是一種物件儲存服務,可以用來儲存和檢索大量的資料。我們可以使用Boto3來執行各種S3操作,例如上傳、下載、複製和刪除物件。

上傳檔案到S3

import boto3

def uploading(local_file):
    s3 = boto3.resource("s3")
    s3.meta.client.upload_file(local_file, "test-storage-Python-1", local_file)

uploading("local_file.txt")
print("File uploaded successfully")

內容解密:

上述程式碼首先匯入Boto3函式庫,然後定義了一個名為uploading的函式,該函式使用S3的upload_file方法將本地檔案上傳到指定的S3儲存桶中。s3.meta.client.upload_file方法需要三個引數:本地檔案路徑、S3儲存桶名稱和S3物件的鍵(即檔案名稱)。

複製S3物件

import boto3

s3 = boto3.resource("s3")
source = {"Bucket": "test-storage-Python-1", "Key": "test.txt"}
destination = s3.Bucket("test-storage-Python-2")
destination.copy(source, "test.txt")
print("Object copied successfully")

內容解密:

此範例展示瞭如何使用Boto3將S3物件從一個儲存桶複製到另一個儲存桶。首先,我們建立了一個source字典,包含了來源儲存桶的名稱和物件的鍵。然後,我們建立了一個destination物件,代表目標儲存桶。最後,我們呼叫destination.copy方法,將來源物件複製到目標儲存桶中,並指定新的物件鍵為test.txt

列出S3儲存桶和物件

我們可以使用Boto3列出所有的S3儲存桶和特定儲存桶中的物件。

列出所有S3儲存桶

import boto3

s3 = boto3.resource("s3")
print("所有儲存桶列表:")
for bucket in s3.buckets.all():
    print(f"- {bucket.name}")

內容解密:

上述程式碼使用s3.buckets.all()方法取得所有的S3儲存桶,然後遍歷每個儲存桶並列印其名稱。

列出特定S3儲存桶中的物件

import boto3

bucket_name = "test-storage-Python-1"
s3 = boto3.resource("s3")
s3_bucket = s3.Bucket(bucket_name)
for item in s3_bucket.objects.all():
    print(f"{item.key} - 大小:{item.size} 位元組")

內容解密:

此範例展示瞭如何列出特定S3儲存桶中的所有物件。首先,我們取得指定名稱的S3儲存桶物件,然後使用s3_bucket.objects.all()方法取得該儲存桶中的所有物件。最後,我們遍歷每個物件並列印其鍵(即檔案名稱)和大小。

EBS磁碟區管理

EBS是一種區塊層級的儲存服務,用於EC2例項。我們可以使用Boto3來管理EBS磁碟區,包括建立、快照和附加到EC2例項。

建立EBS磁碟區

import boto3

ec2 = boto3.resource("ec2")
new_volume = ec2.create_volume(AvailabilityZone="eu-west-2a", Size=20)
print(f"建立的磁碟區ID:{new_volume.id}")

內容解密:

上述程式碼使用ec2.create_volume方法建立一個新的EBS磁碟區,需要指定可用區和大小。建立成功後,會列印出新磁碟區的ID。

建立EBS磁碟區快照

import boto3

ec2 = boto3.resource("ec2")
volume_id = "vol-0ae620def39c1c379"
snapshot_volume = ec2.create_snapshot(VolumeId=volume_id)
print(f"原始磁碟區:{volume_id} \n快照磁碟區:{snapshot_volume.id}")

內容解密:

此範例展示瞭如何為現有的EBS磁碟區建立快照。使用ec2.create_snapshot方法,並指定要建立快照的磁碟區ID。建立成功後,會列印出原始磁碟區的ID和快照磁碟區的ID。

使用 Python 在 AWS 上自動化管理資源

AWS 提供多項服務來幫助使用者管理雲端資源。Python 是一種流行的程式語言,可用於編寫指令碼以自動化管理 AWS 資源。本章節將介紹如何使用 Python 和 boto3 函式庫來自動化管理 EC2 例項、S3 儲存桶、EBS 磁碟區和 IAM 使用者。

管理 EC2 例項

EC2(Elastic Compute Cloud)是一種虛擬伺服器服務,可讓使用者在雲端執行應用程式。我們可以使用 boto3 函式庫來建立、啟動和停止 EC2 例項。

建立 EC2 例項

import boto3

ec2_resource = boto3.resource("ec2")
instances = ec2_resource.create_instances(
    ImageId="ami-abcd1234",
    MinCount=1,
    MaxCount=1,
    InstanceType="t2.micro"
)
print(instances[0].id)

連線到 EC2 例項

import boto3

ec2_resource = boto3.resource("ec2")
instance = ec2_resource.Instance("i-0123456789abcdef0")
print(instance.public_dns_name)

管理 EBS 磁碟區

EBS(Elastic Block Store)是一種永續性儲存服務,可讓使用者在雲端儲存資料。我們可以使用 boto3 函式庫來建立、附加和分離 EBS 磁碟區。

建立 EBS 磁碟區

import boto3

ec2_resource = boto3.resource("ec2")
volume = ec2_resource.create_volume(
    AvailabilityZone="us-west-2a",
    Size=5
)
print(volume.id)

附加 EBS 磁碟區到 EC2 例項

import boto3

ec2_resource = boto3.resource("ec2")
volume = ec2_resource.Volume("vol-0123456789abcdef0")
instance = ec2_resource.Instance("i-0123456789abcdef0")
volume.attach_to_instance(
    Device="/dev/sdh",
    InstanceId=instance.id
)
print(volume.state)

內容解密:

  1. 建立 EBS 磁碟區:使用 create_volume 方法建立一個新的 EBS 磁碟區。
    • AvailabilityZone:指定 EBS 磁碟區的可用區域。
    • Size:指定 EBS 磁碟區的大小(以 GB 為單位)。
  2. 附加 EBS 磁碟區:使用 attach_to_instance 方法將 EBS 磁碟區附加到 EC2 例項。
    • Device:指定要附加的裝置名稱(例如 /dev/sdhxvdh)。
    • InstanceId:指定要附加 EBS 磁碟區的 EC2 例項 ID。

管理 IAM 使用者

IAM(Identity and Access Management)是一種身份和存取管理服務,可讓使用者管理 AWS 資源的存取許可權。我們可以使用 boto3 函式庫來建立和管理 IAM 使用者。

建立 IAM 使用者

import boto3

iam = boto3.resource("iam")
user = iam.create_user(UserName="abcd")
print(user.name)

新增角色給 IAM 使用者

import boto3

def add_role(username, role_name):
    policy_arn = f"arn:aws:iam::aws:policy/{role_name}"
    iam = boto3.resource("iam")
    iam.User(username).attach_policy(PolicyArn=policy_arn)

add_role("abcd", "AmazonEC2FullAccess")

內容解密:

  1. 建立 IAM 使用者:使用 create_user 方法建立一個新的 IAM 使用者。
    • UserName:指定要建立的 IAM 使用者名稱。
  2. 新增角色:使用 attach_policy 方法將指定的角色新增給 IAM 使用者。
    • PolicyArn:指定要新增的角色 ARN。

網路自動化的未來與實務應用

網路自動化是現代IT基礎設施中的重要環節,其能夠大幅提升網路管理的效率和可靠性。本篇文章將探討網路自動化的概念、工具、以及在不同場景下的實務應用。

網路自動化的基本概念

網路自動化是指利用程式設計和軟體工具自動執行網路相關任務的過程。這些任務包括網路裝置組態、監控、故障排除等。透過自動化,可以減少人為錯誤,提高工作效率,並使網路管理更加靈活和可擴充套件。

網路自動化的工具和技術

  1. Python程式語言:Python是網路自動化中最常用的程式語言之一。它具有豐富的函式庫和框架,如NetmikoNornirScapy,能夠簡化網路裝置的組態和管理。

  2. 網路自動化框架:如Nornir,它提供了一種簡潔的方式來管理和自動化網路裝置。

  3. 組態管理工具:如Jinja2範本,用於生成網路裝置的組態檔案。

網路自動化的實務應用

網路裝置組態

網路裝置的組態是網路管理中的一個重要方面。透過使用Python和相關的函式庫,可以實作對路由器、交換機等裝置的自動組態。

from nornir import InitNornir
from nornir_netmiko.tasks import netmiko_send_config

# 初始化Nornir
nr = InitNornir(config_file="config.yaml")

# 定義組態任務
def config_devices(task):
    config_commands = ["interface eth0", "ip address 192.168.1.1 255.255.255.0"]
    task.run(netmiko_send_config, config_commands=config_commands)

# 執行任務
nr.run(config_devices)

內容解密:

  1. 初始化Nornir:使用InitNornir函式並指定組態檔案,初始化Nornir物件,用於管理和操作網路裝置。
  2. 定義組態任務:建立一個函式config_devices,該函式定義了需要下發到網路裝置的組態命令。
  3. 執行任務:呼叫nr.run()方法執行定義好的組態任務,將組態命令下發到所有目標裝置。

網路監控與日誌收集

網路監控是確保網路穩定執行的關鍵。利用Python,可以實作對網路裝置的監控和日誌收集。

from nornir import InitNornir
from nornir_napalm.tasks import napalm_get

# 初始化Nornir
nr = InitNornir(config_file="config.yaml")

# 定義取得日誌任務
def get_logs(task):
    result = task.run(napalm_get, getters=["facts", "interfaces"])
    print(result.result)

# 執行任務
nr.run(get_logs)

內容解密:

  1. 初始化Nornir:同樣使用InitNornir初始化Nornir。
  2. 定義取得日誌任務:使用napalm_get取得網路裝置的資訊,如裝置事實和介面資訊。
  3. 執行任務:呼叫nr.run()執行取得日誌的任務,並列印結果。

網路安全與自動化

在網路安全方面,自動化同樣發揮著重要作用。例如,利用Python可以實作對網路流量的監控和分析,以及自動化的安全掃描。