Ansible 在自動化佈署和組態管理中扮演著重要角色,而有效運用標籤和 Vault 更能提升其效能和安全性。標籤機制讓維運人員能精細控制 Playbook 的執行流程,例如在大型專案中只執行特定任務,而無需逐行修改 Playbook 內容。這對於複雜的佈署流程或需要頻繁更新特定模組的場景尤其實用,大幅提升維護效率。此外,Vault 的加密功能則確保敏感資料,例如密碼、金鑰等,在 Playbook 中的安全,避免資訊洩露的風險,強化整體系統的安全性。在現代 CI/CD 流程中,結合標籤和 Vault 的 Ansible Playbook 更能展現其靈活性及安全性,成為自動化管理不可或缺的工具。
使用 Ansible 標籤最佳化 Playbook 執行
在管理複雜的 Ansible Playbook 時,標籤(tags)提供了一種靈活的方式來控制哪些任務應該被執行。透過使用 --tags 或 --skip-tags 選項,使用者可以精確地指定要執行的任務,從而提升 Playbook 的執行效率和可維護性。
標籤的基本用法
在 Ansible 中,每個任務都可以被賦予一個或多個標籤,這些標籤可以在 Playbook 執行時用來篩選任務。例如:
- name: Install nginx
apt:
name: nginx
state: present
tags: [install]
- name: Install nginx configuration from template
template:
src: templates/nginx.conf.j2
dest: /etc/nginx/nginx.conf
tags: [customize]
在上述範例中,第一個任務被標記為 install,而第二個任務被標記為 customize。當執行 Playbook 時,可以使用 --tags 或 --skip-tags 來指定要執行的任務。
內容解密:
- 任務標籤:每個任務可以擁有多個標籤,這些標籤以 YAML 列表格式指定。
--tags選項:執行 Playbook 時,使用--tags選項可以指定要執行的任務。如果任務的任何一個標籤與指定的標籤相符,該任務就會被執行。--skip-tags選項:相反地,使用--skip-tags可以跳過特定標籤的任務。--list-tasks選項:在實際執行 Playbook 之前,可以使用--list-tasks來預覽哪些任務將會被執行,以及它們所對應的標籤。
使用範例
以下是一些使用標籤的範例命令:
# 跳過標記為 customize 的任務並列出將要執行的任務
$ ansible-playbook -i hosts tags.yml --skip-tags customize --list-tasks
# 執行標記為 install 或 customize 的任務並列出將要執行的任務
$ ansible-playbook -i hosts tags.yml --tags install,customize --list-tasks
# 列出所有將要執行的任務及其對應的標籤
$ ansible-playbook -i hosts tags.yml --list-tasks
內容解密:
--list-tasks的作用:此選項讓使用者能夠預覽 Playbook 將要執行的任務,而無需實際執行。- 多重標籤支援:使用者可以在
--tags後指定多個標籤,Playbook 將執行任何匹配這些標籤的任務。 - 標籤的重用性:相同的標籤可以在多個任務中使用,從而簡化 Playbook 的管理和維護。
使用 Ansible Vault 保護敏感資料
Ansible Vault 提供了一種加密敏感資料的方法,使其能夠安全地儲存在 Playbook 中。對於需要儲存登入憑證或其他敏感資訊的變數,Ansible Vault 能夠提供 AES-256 加密保護。
建立和使用 Ansible Vault
建立新的 Vault 檔案:
$ ansible-vault create secret.yml系統會提示輸入並確認密碼。完成後,Vault 檔案將以加密形式儲存敏感資料。
編輯 Vault 檔案: 在建立 Vault 檔案時,Ansible 會開啟預設的編輯器(由
EDITOR環境變數指定)。使用者可以在此編輯器中輸入需要加密的變數,例如:
secretdata: “Ansible is cool!”
儲存並離開後,檔案內容將被加密。
3. **檢視加密後的 Vault 檔案**:
```bash
$ cat secret.yml
$ANSIBLE_VAULT;1.1;AES256
...
檔案內容已被加密,無法直接讀取。
內容解密:
- AES-256 加密:Ansible Vault 使用高強度的 AES-256 加密演算法來保護資料。
- 密碼管理:使用者需要妥善保管 Vault 的密碼,以確保能夠存取加密的資料。
- 安全儲存敏感資訊:透過使用 Ansible Vault,可以安全地在 Playbook 中儲存敏感資訊,避免資料洩露風險。
高階 Ansible 主題:使用 Ansible Vault 保護敏感資料
在前面的章節中,我們已經學習了 Ansible 的基本用法和一些進階功能。在本章中,我們將介紹如何使用 Ansible Vault 來保護敏感資料。Ansible Vault 是一種用於加密敏感資料的工具,可以讓您在 playbook 中安全地使用這些資料。
什麼是 Ansible Vault?
Ansible Vault 是一種用於加密敏感資料的工具,可以讓您在 playbook 中安全地使用這些資料。它使用 AES256 加密演算法來加密資料,並且可以與 Ansible 的其他功能無縫整合。
使用 Ansible Vault 加密檔案
要使用 Ansible Vault,您需要先建立一個加密的檔案。可以使用 ansible-vault 命令來建立一個新的加密檔案。例如:
$ ansible-vault create secret.yml
這將建立一個新的加密檔案 secret.yml,並提示您輸入密碼。請注意,這個密碼將用於加密和解密檔案。
在 Playbook 中使用加密檔案
一旦您建立了一個加密的檔案,就可以在 playbook 中使用它。要做到這一點,您需要在 playbook 中指定 vars_files 指令,並指向您的加密檔案。例如:
---
- name: 使用 Ansible Vault 的 Playbook
hosts: frontends
vars_files:
- secret.yml
tasks:
- name: 顯示秘密資料
debug:
msg: "您的秘密資料是:{{ secretdata }}"
在這個例子中,secret.yml 是一個加密的檔案,包含了一個名為 secretdata 的變數。Playbook 將使用這個變數來顯示秘密資料。
執行 Playbook
要執行這個 playbook,您需要提供 Ansible Vault 的密碼。可以使用 --ask-vault-pass 選項來提示輸入密碼。例如:
$ ansible-playbook -i hosts vaultplaybook.yml --ask-vault-pass
這將執行 playbook,並提示您輸入 Ansible Vault 的密碼。
內容解密:
vars_files指令:用於指定包含變數的檔案,可以是加密或未加密的檔案。ansible-vault命令:用於建立、編輯和解密加密檔案。--ask-vault-pass選項:用於在執行 playbook 時提示輸入 Ansible Vault 的密碼。
將敏感資料內嵌在 Playbook 中
除了將敏感資料儲存在單獨的加密檔案中外,您還可以將其內嵌在 playbook 中。要做到這一點,您可以使用 ansible-vault encrypt_string 命令來加密字串。例如:
$ ansible-vault encrypt_string 'Ansible is cool!' --name secretdata
這將輸出一個加密的字串,您可以將其複製並貼上到 playbook 中。例如:
---
- name: 使用 Ansible Vault 的 Playbook
hosts: frontends
vars:
secretdata: !vault |
$ANSIBLE_VAULT;1.1;AES256
...
tasks:
- name: 顯示秘密資料
debug:
msg: "您的秘密資料是:{{ secretdata }}"
在這個例子中,secretdata 是一個加密的變數,包含了一個名為 Ansible is cool! 的字串。
內容解密:
encrypt_string命令:用於加密一個字串,並輸出一個可以內嵌在 playbook 中的加密字串。!vault標記:用於標記一個加密的字串。
網路自動化與Ansible
在過去,網路裝置的組態主要依靠人工手動完成。這種做法在當時是可行的,因為路由器和交換機主要負責物理伺服器的流量轉發,對網路裝置的組態需求不大,且變更頻率較低。此外,人類管理員擁有足夠的資訊來設定網路裝置。然而,這種手動的規劃和執行方式已經無法滿足現代虛擬化環境的需求。
虛擬化帶來的挑戰
虛擬化的出現使得數千台機器連線到同一個交換機或路由器,每台機器都有不同的網路需求。網路變更變得更加頻繁,且虛擬基礎設施的定義已經轉向以程式碼為基礎。這使得人類管理員難以跟上基礎設施的變更。因此,虛擬化協調平台因其對機器位置的深入瞭解,甚至可以自動生成庫存檔案,如我們在前幾章中所見的那樣,成為瞭解決方案的一部分。實際上,人類已經無法記憶或管理現代大規模的虛擬化基礎設施。
網路自動化的必要性
因此,在組態網路基礎設施時,自動化成為了一項必要條件。Ansible作為一款強大的自動化工具,可以有效地幫助管理員實作網路自動化。
Ansible在網路自動化中的應用
Ansible提供了一系列功能,可以幫助管理員實作網路自動化的目標。透過Ansible,管理員可以輕鬆地組態和管理網路裝置,例如路由器、交換機等。此外,Ansible還提供了豐富的模組和外掛,可以與各種網路裝置進行互動。
使用Ansible管理網路裝置
使用Ansible管理網路裝置,可以實作以下幾個方面的自動化:
- 組態管理:Ansible可以幫助管理員實作網路裝置的組態管理,包括組態檔案的備份、更新和還原等。
- 裝置監控:Ansible可以幫助管理員實作網路裝置的監控,包括裝置狀態的檢查、日誌的收集和分析等。
- 故障排除:Ansible可以幫助管理員實作網路裝置的故障排除,包括故障檢測、診斷和修復等。
Ansible Vault與敏感資料處理
在進行網路自動化的過程中,經常需要處理一些敏感資料,例如密碼、API金鑰等。Ansible Vault提供了一種安全的方式來儲存和管理這些敏感資料。透過Ansible Vault,管理員可以將敏感資料加密儲存在檔案中,並在執行Playbook時自動解密。
網路自動化的未來
隨著虛擬化和雲端運算技術的發展,網路自動化的需求將會越來越大。Ansible作為一款領先的自動化工具,將會在網路自動化領域發揮越來越重要的作用。
問題與討論
最大失敗百分比引數:哪個引數允許您組態一批主機中最大失敗百分比,以決定是否終止Play? A) percentage B) max_fail C) max_fail_percentage D) max_percentage E) fail_percentage
本地執行Playbook:是否可以使用
--connect=local引數在本地執行Playbook,而不使用SSH? A) True B) False非同步執行任務:是否需要使用
async關鍵字來非同步執行任務? A) True B) False
進一步閱讀
- 如果安裝Passlib(Python 2和3的密碼雜湊函式庫),vars_prompt可以使用任何加密方案(如descrypt、md5crypt、sha56_crypt等)進行加密:https://passlib.readthedocs.io/en/stable/
網路自動化管理:為何重要以及如何實作
在過去的三十年中,資料中心設計發生了翻天覆地的變化。90年代的典型資料中心充滿了物理機器,每台機器都有特定的用途。隨著社會和公司在科技世界的進步,企業開始重視縮短基礎設施佈署時間和降低成本。虛擬化技術的出現使得企業可以建立虛擬化叢集,不需要具備正確大小的物理主機,從而能夠快速組態機器。
為何自動化網路管理?
虛擬化的另一個重大優勢是工作負載與物理主機的解耦。歷史上,由於工作負載與物理主機繫結,如果主機宕機,工作負載本身也會宕機,除非在不同硬體上進行正確的複製。虛擬化解決了這個問題,因為工作負載現在與一台或多台虛擬主機繫結,但這些虛擬主機可以自由地從一個物理主機移動到另一個。
內容解密:
- 虛擬化技術使企業能夠快速組態機器,並且使機器能夠在不同主機之間移動。
- 網路組態管理成為了一個問題,因為機器可以在沒有人工干預的情況下從一個主機移動到另一個主機。
- 虛擬區域網路(VLAN)的出現使得網路裝置的利用率大大提高,從而最佳化了成本。
在這種環境下,自動化網路管理成為成功的關鍵。如今,一些公司(著名的「雲端供應商」)的工作規模使得手動網路管理不僅不切實際,而且是不可能的。即使在技術上可以手動管理網路組態的環境中,這仍然是不切實際的。
內容解密:
- 自動化網路管理的主要優勢是大幅減少人為錯誤。
- 如果需要手動組態100台裝置上的VLAN,人為錯誤的可能性很高。
- 自動化網路管理可以確保組態的一致性和準確性。
Ansible 如何管理網路裝置
Ansible 允許您管理許多不同的網路裝置,包括 Arista EOS、Cisco ASA、Cisco IOS、Cisco IOS XR、Cisco NX-OS、Dell OS 6、Dell OS 9、Dell OS 10、Extreme EXOS、Extreme IronWare、Extreme NOS、Extreme SLX-OS、Extreme VOSS、F5 BIG-IP、F5 BIG-IQ、Junos OS、Lenovo CNOS、Lenovo ENOS、MikroTik RouterOS、Nokia SR OS、Pluribus Netvisor、VyOS 等。Ansible 可以透過多種方式與這些裝置進行通訊。
內容解密:
- Ansible 支援多種網路裝置和平台。
- Ansible 可以透過不同的協定(如 NETCONF)與網路裝置進行通訊。
- Ansible 的網路模組提供了豐富的功能,用於管理和組態網路裝置。
---
- name: Configure VLANs on Cisco IOS devices
hosts: ios_devices
gather_facts: no
tasks:
- name: Configure VLAN 100
ios_vlan:
vlan_id: 100
name: "VLAN 100"
state: present
#### 內容解密:
- 此 Playbook 使用 `ios_vlan` 模組在 Cisco IOS 裝置上組態 VLAN 100。
- `vlan_id` 指定 VLAN 的 ID,`name` 指定 VLAN 的名稱,`state` 指定 VLAN 的狀態。
- `gather_facts: no` 表示在執行 Playbook 時不收集裝置的事實資訊。
### 自動化網路管理的未來
隨著資料中心規模的不斷擴大和虛擬化技術的普及,自動化網路管理變得越來越重要。Ansible 提供了一種簡單而強大的方式來管理和組態網路裝置,從而減少人為錯誤並提高效率。
#### 內容解密:
- 自動化網路管理是未來資料中心管理的趨勢。
- Ansible 將繼續在網路自動化中發揮重要作用。
- 網路管理員需要掌握 Ansible 等自動化工具,以提高工作效率和減少錯誤。
## 網路自動化與 Ansible:連線與通訊協定
在網路自動化領域,Ansible 提供了一種高效的方式來管理和組態網路裝置。不同於一般的 Ansible 模組執行在目標主機上,網路模組是在控制主機(發出 `ansible` 命令的主機)上執行。瞭解 Ansible 如何連線和與網路硬體通訊至關重要,因為這決定了如何建立 Ansible Playbook 以及在出現問題時如何除錯。
### 網路裝置的連線型別
Ansible 支援多種連線型別來管理網路裝置,主要包括:
1. **network_cli**:大多數模組支援此模式,透過 SSH 連線裝置的 CLI,建立持久連線,避免每次任務都需要提供憑證。
2. **netconf**:部分模組支援,如支援 NETCONF 的 OS 和 Junos OS,透過 SSH 使用 XML 組態裝置,同樣建立持久連線。
3. **httpapi**:適用於 Arista EOS、Cisco NX-OS 和 Extreme EXOS 等,透過裝置發布的 HTTP API 進行組態,建立持久連線。
4. **local**:大多數裝置支援,但已棄用,需要廠商特定的套件,不建立持久連線,每次任務都需要憑證,盡量避免使用。
5. **ssh**:適用於原生執行 Linux 的白牌交換機,如 Cumulus Networks,可以像管理其他 Linux 伺服器一樣透過 SSH 組態。
### 啟用網路自動化
在開始使用 Ansible 進行網路自動化之前,需要確保滿足必要條件。以 Cisco IOS 裝置使用 `network_cli` 連線為例,主要需求如下:
1. **Ansible 2.5 或更高版本**。
2. **與網路裝置的正確連線**。
首先,檢查 Ansible 版本:
```bash
$ ansible --version
確保版本符合要求後,使用以下命令檢查與網路裝置的連線(需替換適當的選項):
$ ansible all -i n1.example.com, -c network_cli -u my_user -k -m ios_facts -e ansible_network_os=ios all
此命令會傳回裝置的事實(facts),證明 Ansible 能夠連線到裝置。如果沒有實際的 Cisco IOS 裝置,可以考慮使用 Cumulus VX(一款免費的 Cumulus Linux 測試版本)進行測試。
下載 Cumulus VX 後,可以像執行其他 Linux 虛擬機器一樣啟動它,並透過 SSH 連線。以下命令可用於收集所有交換機埠介面的事實:
$ ansible -i vx01.example.com, -u cumulus -m setup -a 'filter=ansible_swp*' all --ask-pass
程式碼解析:
上述命令中的 -m setup 表示使用 setup 模組來收集事實,-a 'filter=ansible_swp*' 指定了只收集與 ansible_swp 相關的事實。
內容解密:
ansible:Ansible 的命令列工具,用於執行 Ad-Hoc 命令或 Playbook。-i vx01.example.com,:指定 inventory,主機名稱後面的逗號表示這是一個 inline inventory。-u cumulus:指定用於 SSH 連線的使用者名稱。-m setup:指定要執行的模組,這裡是setup模組,用於收集主機的事實。-a 'filter=ansible_swp*':傳遞給setup模組的引數,用於過濾事實,只收集與ansible_swp相匹配的事實。all:表示對 inventory 中的所有主機執行命令。--ask-pass:提示輸入 SSH 連線的密碼。