現今,虛擬化和雲端技術的普及使得網路環境日趨複雜,手動管理網路組態不僅效率低下,更容易出錯。自動化網路管理已成為現代網路維運的關鍵。本文將以 Ansible 為例,探討如何利用自動化工具簡化網路管理流程,提升效率並降低人為錯誤的風險。

為何擁抱網路自動化?

虛擬化技術的興起讓工作負載與實體主機分離,伺服器得以在主機間快速佈建和遷移。然而,這也為網路組態管理帶來了挑戰,需要系統自動更新網路組態以適應變動。同時,VLAN 的廣泛應用提升了網路裝置利用率,但也增加了管理複雜度。在大型網路環境中,手動管理網路組態幾乎是不可能的任務。

我認為,網路自動化的最大優勢在於減少人為錯誤。試想在數百台裝置上手動組態 VLAN,出錯的機率非常高。自動化則能確保組態的一致性和準確性,並簡化故障排除和裝置更換流程。

Ansible 的網路管理之道

Ansible 支援管理多種網路裝置,包括 Cisco、Arista、Juniper 等主流廠商的產品,以及支援 NETCONF 的作業系統。Ansible 的網路模組在控制器主機上執行,並透過不同的連線機制與目標裝置通訊。

Ansible 主要支援以下五種連線型別:

  • ansible.netcommon.network_cli:透過 SSH 使用 CLI,適用於大多數模組。
  • ansible.netcommon.netconf:透過 SSH 使用 XML,用於根據 XML 的組態。
  • ansible.netcommon.httpapi:使用裝置的 HTTP API。
  • local:已棄用的連線模式,與供應商相關,需要在 Ansible 執行主機上安裝特定軟體包。
  • ssh:適用於原生執行 Linux 的白盒交換器,例如 Cumulus Networks。

選擇連線機制時,需要考慮裝置支援的協定和自身需求。network_clinetconfhttpapi 建立持續性連線,而 local 則需要為每個任務提供憑證。

  graph LR
    httpapi[httpapi]
    local[local]
    ssh[ssh]
    A[Ansible Controller] -- network_cli/netconf/httpapi --> B(Network Device)
    A -- local/ssh --> B

此圖表展示了 Ansible Controller 與 Network Device 的連線方式。network_clinetconfhttpapi 建立持續性連線,而 localssh 則可能需要每次任務重新驗證。

啟用 Ansible 網路自動化

使用 Ansible 進行網路自動化,首先需確認 Ansible 版本 (2.5 以上) 並驗證與網路裝置的連線。以 network_cli 連線 Cisco IOS 裝置為例:

  1. 檢查 Ansible 版本:
ansible --version
  1. 測試連線並收集裝置資訊:
ansible all -i n1.example.org, -c network_cli -u my_user -k -m cisco.ios.ios_facts -e ansible_network_os=cisco.ios.ios all

-k 引數提示 Ansible 要求輸入 SSH 密碼。cisco.ios.ios_facts 模組用於收集裝置資訊,確認連線成功。

白盒交換器與 Cumulus Linux:開發你的網路實驗室

缺乏真實網路裝置?白盒交換器和 NVIDIA Cumulus Linux 提供了理想的測試環境。Cumulus VX 是一個免費的虛擬交換器,可以像其他 Linux 虛擬機器一樣執行。

透過 SSH 連線到 Cumulus VX:

ansible -i vx01.example.org, -u cumulus -m ansible.builtin.setup -a 'filter=ansible_swp*' all --ask-pass

此指令收集交換器埠介面資訊。

探索 Ansible 網路模組寶函式庫

Ansible Galaxy 和 Collections 提供了豐富的網路自動化模組。以下列出一些 Cisco IOS 模組示例:

  • cisco.ios.ios_banner:修改登入橫幅。
  • cisco.ios.ios_bgp:設定 BGP 路由。
  • cisco.ios.ios_command:執行任意指令。
  • cisco.ios.ios_config:修改設定檔。
  • cisco.ios.ios_vlan:設定 VLAN。

如果找不到合適的模組,可以使用 cisco.ios.ios_commandcisco.ios.ios_config 執行任何操作。

善用 Ansible 的豐富模組和靈活的連線機制,可以大幅簡化網路管理任務,提升效率並降低風險。從基礎組態到複雜的網路自動化,Ansible 都能助你一臂之力。

透過 Ansible,網路管理不再是一項繁瑣與容易出錯的工作,而是可以自動化、標準化和最佳化的流程。從本文提供的實戰技巧出發,開始你的網路自動化之旅吧!

現代網路環境日趨複雜,自動化管理已成為提升效率和可靠性的關鍵。Ansible 作為一款功能強大的自動化工具,不僅能管理各種網路裝置,還能與容器技術無縫整合。本文將分享玄貓在 Ansible 自動化網路裝置管理和容器協調方面的實戰經驗,涵蓋連線 Cisco 和 Cumulus Linux 裝置、管理 Docker 和 Podman 容器,以及與 Kubernetes 的整合。

跨平台連線網路裝置:Ansible 技巧大公開

管理不同廠牌的網路裝置常常是一大挑戰。Ansible 提供了跨平台的解決方案,讓網路自動化更加簡便。以下將以 Cisco IOS 和 Cumulus VX 為例,分享玄貓的實務技巧。

連線 Cisco IOS 裝置

使用 Ansible 連線 Cisco IOS 裝置需要進行一些設定。以下是一個 ios_facts.yaml 的 playbook 範例:

- name: 收集 Cisco IOS 路由器資訊
  hosts: routers
  gather_facts: no
  tasks:
  - name: 收集資訊
    ansible.builtin.setup:
      gather_subset: all

這個 playbook 用於收集 Cisco IOS 路由器的資訊。gather_facts: no 停用自動收集 facts,ansible.builtin.setup 模組則用於收集指定的資訊。

執行 playbook 的指令如下:

ansible-playbook -i hosts ios_facts.yaml --ask-pass

連線 Cumulus VX 交換器

以下是一個收集 Cumulus VX 交換器資訊的 playbook 範例:

- name: 收集 Cumulus VX 交換器資訊
  hosts: cumulusvx
  gather_facts: no
  tasks:
  - name: 收集資訊
    ansible.builtin.setup:
      gather_subset: all

這個 playbook 與連線 Cisco IOS 的 playbook 類別似,只是目標主機改為 cumulusvx

執行 playbook 的指令如下:

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

設定環境變數與跳板機連線

在複雜的網路環境中,透過跳板機連線裝置是常見的需求。以下是一個設定跳板機連線的 group_vars/bastion_routers.yaml 範例:

---
ansible_connection: network_cli
ansible_network_os: cisco.ios.ios
ansible_become: true
ansible_become_method: enable
ansible_ssh_common_args: '-o ProxyCommand="ssh -W %h:%p -q bastion.example.org"'
proxy_env:
  http_proxy: http://proxy.example.org:8080

ansible_ssh_common_args 設定了 SSH 跳板機連線,proxy_env 設定了 HTTP 代理。

  graph LR
    A[Ansible 主機] --> B[跳板機 bastion.example.org] --> C[目標裝置];

此圖展示了透過跳板機連線目標裝置的流程。

客製化條件式陳述句

Ansible 支援條件式陳述句,讓你可以根據裝置狀態執行不同的任務。以下是在 Cumulus VX 上使用條件式陳述句的 playbook 範例:

---
- name: 在 Cumulus Linux 上示範條件式陳述句
  hosts: cumulusvx
  tasks:
    - name: 如果 swp2 停用則啟用
      community.network.nclu:
        commands:
          - add int swp2
        commit: true
      when: not ansible_swp2.active

when 子句指定了只有在 ansible_swp2.active 為 false 時才執行 nclu 模組。

  flowchart LR
    A[條件判斷 ansible_swp2.active] -- False --> B[啟用 swp2]
    A -- True --> C[跳過任務]

此圖展示了條件式陳述句的執行邏輯。

Ansible 自動化容器管理:Docker 與 Podman

容器化技術已成為現代軟體開發的根本。Ansible 可以有效地自動化 Docker 和 Podman 容器的管理。

管理 Docker 容器

以下是一個使用 Ansible 啟動 Docker 容器的 playbook 範例:

---
- hosts: localhost
  tasks:
  - name: 啟動一個帶有指令的容器
    community.docker.docker_container:
      name: test-container
      image: alpine
      command:
      - echo
      - "Hello, World!"

這個 playbook 使用 community.docker.docker_container 模組啟動一個名為 test-container 的 alpine 容器,並執行 echo "Hello, World!" 命令。

管理 Podman 容器

以下是一個使用 Ansible 啟動 Podman 容器的 playbook 範例:

- hosts: localhost
  tasks:
  - name: 使用 Podman 啟動一個容器並執行命令
    containers.podman.podman_container:
      name: test-container
      image: alpine
      command:
        - echo
        - "Hello, World!"

這個 playbook 使用 containers.podman.podman_container 模組啟動一個名為 test-container 的 alpine 容器,並執行 echo "Hello, World!" 命令。

Ansible 與 Kubernetes 的整合

Kubernetes 是目前最流行的容器協調平台。Ansible 提供了便捷的方式來管理 Kubernetes 叢集。

以下是一個使用 Ansible 顯示 Kubernetes 名稱空間的 playbook 範例:

---
- hosts: localhost
  tasks:
  - name: 從 Kubernetes 取得資訊
    kubernetes.core.k8s_info:
      api_version: v1
      kind: Namespace
      register: ns
  - name: 顯示資訊
    ansible.builtin.debug:
      var: ns

這個 playbook 使用 kubernetes.core.k8s_info 模組取得 Kubernetes 名稱空間資訊,並使用 ansible.builtin.debug 模組顯示這些資訊。

以下是一個使用 Ansible 建立 Kubernetes 名稱空間的 playbook 範例:

---
- hosts: localhost
  tasks:
  - name: 確保 myns 名稱空間存在
    kubernetes.core.k8s:
      api_version: v1
      kind: Namespace
      name: myns
      state: present

這個 playbook 使用 kubernetes.core.k8s 模組建立名為 myns 的 Kubernetes 名稱空間。

- hosts: localhost
  tasks:
    - name: 建立 EC2 執行個體
      amazon.aws.ec2_instance:
        # ... (其他設定)
        network_interfaces:
          - device_index: 0
            associate_public_ip_address: yes
            subnet_id: "{{ subnets.subnets.0.id }}"
            groups: "{{ security_group.group_id }}"

這段程式碼片段展示瞭如何在 Ansible Playbook 中使用 amazon.aws.ec2_instance 模組建立 EC2 執行個體,並設定網路介面卡關聯公有 IP、子網路和安全群組。

GCP 自動化

---
- hosts: localhost
  tasks:
    - name: 建立 GCP 執行個體
      google.cloud.gcp_compute_instance:
        # ... (其他設定)
        network_interfaces:
        - network: global/networks/default
          subnetwork: regions/asia-east1/subnetworks/default
          access_configs:
          - name: External NAT
            type: ONE_TO_ONE_NAT

這段程式碼片段展示瞭如何在 Ansible Playbook 中使用 google.cloud.gcp_compute_instance 模組建立 GCP 虛擬機器執行個體,並設定網路介面卡、子網路和外部 IP。

Azure 自動化

---
- hosts: localhost
  connection: local
  tasks:
    - name: 建立 Azure 虛擬機器
      azure.azcollection.azure_rm_virtualmachine:
        # ... (其他設定)
        network_interface_names:
          - my_nic
        os_profile:
          computer_name: myvm
          admin_username: azureuser
          admin_password: MyPassword123!

這段程式碼片段展示瞭如何在 Ansible Playbook 中使用 azure.azcollection.azure_rm_virtualmachine 模組建立 Azure 虛擬機器,並設定網路介面卡名稱、電腦名稱、管理員使用者名稱和密碼。

透過 Ansible 的雲端模組,可以輕鬆管理不同雲端平台的資源,實作跨雲環境的自動化管理,簡化佈署流程並提高效率。

  graph LR
    A[Ansible] --> B(AWS);
    A --> C(GCP);
    A --> D(Azure);

這個圖表展示了 Ansible 如何與 AWS、GCP 和 Azure 整合,實作跨雲平台的自動化管理。

透過 Ansible,可以有效地自動化管理各種容器技術和雲端平台,簡化佈署流程,提高效率,並降低人為錯誤的風險。 Ansible 的靈活性使其成為管理現代化基礎設施的理想工具。

在現代軟體開發中,自動化佈署已成為不可或缺的一環。Ansible 作為一款功能強大的自動化工具,能簡化雲端佈署流程,提高效率。本文將以 Azure 和 OpenStack 為例,示範如何使用 Ansible Playbook 自動化佈署虛擬機器。

Azure 虛擬機器佈署

以下 Ansible Playbook 範例示範如何在 Azure 上建立虛擬機器:

- hosts: localhost
  connection: local
  tasks:
    - name: 建立 Azure 虛擬機器
      azure_rm_virtualmachine:
        resource_group: myResourceGroup
        name: myVM
        vm_size: Standard_B1s
        location: eastus
        admin_username: azureuser
        # ... 其他設定 ...

這段程式碼定義了一個 Ansible Playbook,用於在 Azure 上建立虛擬機器。hosts: localhost 表示 Playbook 將在本地執行,connection: local 指定使用本地連線。tasks 區塊定義了要執行的任務,其中 azure_rm_virtualmachine 模組用於建立 Azure 虛擬機器。程式碼指定了資源群組 (resource_group)、虛擬機器名稱 (name)、大小 (vm_size)、位置 (location) 和管理員使用者名稱 (admin_username) 等設定。其他設定,例如映像、網路和安全性設定,需要根據實際需求進行調整。

  graph LR
    C[C]
    D[D]
    E[E]
    F[F]
    G[G]
    H[H]
    A[Ansible Playbook] --> B(azure_rm_virtualmachine 模組)
    B --> C{設定資源群組}
    B --> D{設定虛擬機器名稱}
    B --> E{設定虛擬機器大小}
    B --> F{設定位置}
    B --> G{設定管理員使用者名稱}
    B --> H{...其他設定}

上圖展示了 Ansible Playbook 如何透過 azure_rm_virtualmachine 模組設定 Azure 虛擬機器的各項引數。

OpenStack 虛擬機器佈署

以下 Ansible Playbook 範例示範如何在 OpenStack 上建立虛擬機器:

- hosts: openstack
  tasks:
    - name: 建立 OpenStack 虛擬機器
      os_server:
        state: present
        name: myOpenStackVM
        image: Ubuntu 20.04
        flavor: m1.small
        # ... 其他設定 ...

這段程式碼定義了一個用於在 OpenStack 上建立虛擬機器的 Ansible Playbook。hosts: openstack 表示 Playbook 將針對 OpenStack 環境執行。os_server 模組用於建立 OpenStack 虛擬機器。程式碼指定了虛擬機器名稱 (name)、映像 (image)、規格 (flavor) 等設定。其他設定,例如網路、金鑰對和安全性群組,需要根據實際需求進行調整。

  graph LR
    C[C]
    D[D]
    E[E]
    F[F]
    A[Ansible Playbook] --> B(os_server 模組)
    B --> C{設定虛擬機器名稱}
    B --> D{設定映像}
    B --> E{設定規格}
    B --> F{...其他設定}

上圖展示了 Ansible Playbook 如何透過 os_server 模組設定 OpenStack 虛擬機器的各項引數。

透過 Ansible,我們可以有效地自動化 AWS、GCP 和 Azure 等雲端環境的佈署,提升效率並減少錯誤。

透過以上步驟,我們可以利用 Ansible 的強大功能,簡化在不同雲端平台上的佈署流程,實作基礎設施即程式碼的目標,並提升整體效率。

藉由 Ansible Playbook,我們可以標準化佈署流程,減少人為錯誤,並快速建立和管理雲端虛擬機器。這對於現代軟體開發至關重要,尤其在持續整合和持續交付 (CI/CD) 的流程中,Ansible 能夠扮演關鍵角色,實作自動化佈署和基礎設施管理。