現今,虛擬化和雲端技術的普及使得網路環境日趨複雜,手動管理網路組態不僅效率低下,更容易出錯。自動化網路管理已成為現代網路維運的關鍵。本文將以 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_cli
、netconf
和 httpapi
建立持續性連線,而 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_cli
、netconf
和 httpapi
建立持續性連線,而 local
和 ssh
則可能需要每次任務重新驗證。
啟用 Ansible 網路自動化
使用 Ansible 進行網路自動化,首先需確認 Ansible 版本 (2.5 以上) 並驗證與網路裝置的連線。以 network_cli
連線 Cisco IOS 裝置為例:
- 檢查 Ansible 版本:
ansible --version
- 測試連線並收集裝置資訊:
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_command
和 cisco.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 能夠扮演關鍵角色,實作自動化佈署和基礎設施管理。