如何使用 Ansible 變數和事實?
Ansible 是一款廣泛使用的開源工具,可幫助自動化軟體配置、配置管理和應用程式部署。其強大的功能之一是能夠使用變數和事實,這可以簡化您的劇本和任務,並允許您設計更動態、靈活和可重用的自動化指令碼。
在本文中,我們將深入探討如何使用 Ansible 變數和事實,並展示幾個示例及其相應的輸出。
瞭解 Ansible 變數
Ansible 中的變數允許儲存和操作值,這些值可以在多個任務甚至不同的劇本中使用。變數可以在多個位置定義,其作用域主要由其定義位置決定。
定義變數
在 Ansible 中定義變數有很多方法 -
在劇本中 - 以下是如何在劇本中定義變數的示例 -
--- - hosts: webservers vars: http_port: 80 max_clients: 200 tasks: - name: Ensure Apache is at the latest version yum: name: httpd state: latest
在這個劇本中,變數 http_port 和 max_clients 被定義,並且可以在此劇本中的任何任務中使用。
在清單檔案中 - 變數也可以在清單檔案中定義 -
[webservers] server1 ansible_host=192.168.1.10 http_port=80 max_clients=200
在此清單檔案中,http_port 和 max_clients 為 server1 定義。
使用變數
您可以在任務或模板中使用這些變數,方法是用雙花括號括起來。以下是一個示例 -
--- - hosts: webservers vars: http_port: 80 max_clients: 200 tasks: - name: Ensure Apache is configured with vars template: src: /etc/httpd/conf/httpd.conf.j2 dest: /etc/httpd/conf/httpd.conf
在模板檔案中,您將這樣引用這些變數 -
Listen {{ http_port }} MaxClients {{ max_clients }}
瞭解 Ansible 事實
Ansible 事實是從目標系統獲取的資訊片段,例如網路介面、作業系統詳細資訊、IP 地址等。這些事實儲存在變數中,可以在劇本中使用。
Ansible 使用名為 setup 的模組來收集事實。如果您想檢視 Ansible 收集到的關於某個系統的事實,請執行以下命令 -
ansible −m setup hostname
將 hostname 替換為您要定位的主機的名稱或 IP。輸出將是一個 JSON 文件,其中列出了為該主機收集的所有事實。
以下是如何在任務中使用事實的示例 -
--- - hosts: webservers tasks: - name: Display OS family debug: msg: "The operating system family is {{ ansible_os_family }}"
在此示例中,ansible_os_family 是一個提供目標系統作業系統系列的事實。
組織變數
隨著您 Ansible 使用規模的擴大,您可能會發現自己正在處理大量變數。在這種情況下,建議您在專用檔案甚至目錄中管理變數。
在單獨的變數檔案中 - 您可以在單獨的檔案中定義變數,然後像這樣將這些檔案包含在您的劇本中
--- - hosts: webservers vars_files: - vars/apache.yml tasks: - name: Ensure Apache is at the latest version yum: name: httpd state: latest
在 vars/apache.yml 中,您可以這樣定義變數 -
--- http_port: 80 max_clients: 200
在目錄中 - 對於更大的專案,尤其是在組織方面,您可以將變數儲存在目錄結構中。
--- - hosts: webservers vars_files: - vars/apache.yml - vars/directory/extra_vars.yml tasks: - name: Ensure Apache is at the latest version yum: name: httpd state: latest
在 vars/directory/extra_vars.yml 中,您可以定義其他變數。
高階變數用法:事實快取
Ansible 的強大功能之一是能夠快取事實。當您使用大型清單或希望在多個劇本中使用收集的事實而無需每次都重新收集時,這尤其有用。
要啟用事實快取,您需要在 ansible.cfg 檔案中設定以下引數 -
[defaults] gathering = smart fact_caching = jsonfile fact_caching_connection = /tmp/ansible_facts fact_caching_timeout = 7200
透過此配置,Ansible 將在 /tmp/ansible_facts 目錄中快取收集的事實,並且不會在 7200 秒(2 小時)內重新收集它們。
此示例演示瞭如何訪問快取的事實 -
--- - hosts: webservers tasks: - name: Display cached OS family debug: msg: "The cached operating system family is {{ ansible_os_family }}"
在此劇本中,ansible_os_family 將使用快取中的值(如果可用且不超過 2 小時)。
變數優先順序
在 Ansible 中,有許多方法可以設定變數,並且瞭解評估變數的順序至關重要。此順序稱為變數優先順序,允許您控制變數的最終值。
以下是從最低到最高的簡化優先順序順序 -
角色預設值
清單檔案或指令碼組變數
清單 group_vars/all
劇本 group_vars/all
清單 group_vars/*
劇本 group_vars/*
清單檔案或指令碼主機變數
清單 host_vars/*
劇本 host_vars/*
主機事實/快取的 set_facts
劇本變數
劇本 vars_prompt
劇本 vars_files
角色變數(在 role/vars/main.yml 中定義)
塊變數(僅適用於塊中的任務)
任務變數(僅適用於任務)
額外變數(始終優先)
變數型別
除了標準變數之外,Ansible 還提供了幾種特殊的變數型別,這些型別非常有用。這些包括 -
列表變數 - 此型別允許您建立值列表(陣列)。
fruits: - Apple - Banana - Orange
字典變數 - 此型別能夠儲存更復雜的資料結構。
user: name: John Doe job: Developer
布林變數 - 用於儲存 True/False 值。
debug_mode: True
訪問複雜變數
對於列表和字典變數,您可以透過其索引或鍵訪問各個元素。例如 -
--- - hosts: localhost gather_facts: no vars: fruits: - Apple - Banana - Orange user: name: John Doe job: Developer tasks: - debug: msg: "The first fruit in the list is {{ fruits[0] }}" - debug: msg: "The user's job is {{ user['job'] }}"
上述劇本將輸出 -
PLAY [localhost] *************************************************************** TASK [debug] ******************************************************************* ok: [localhost] => { "msg": "The first fruit in the list is Apple" } TASK [debug] ******************************************************************* ok: [localhost] => { "msg": "The user's job is Developer" } PLAY RECAP ********************************************************************* localhost : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
使用過濾器與變數
Ansible 中的過濾器可以操作變數。它們與 | 字元一起使用。例如,'default' 過濾器可用於在未定義變數時為其分配預設值 -
--- - hosts: localhost gather_facts: no vars: var1: "Hello" tasks: - debug: msg: "{{ var1 | default('Hi') }}" - debug: msg: "{{ var2 | default('Hi') }}"
上述劇本將輸出 -
PLAY [localhost] *************************************************************** TASK [debug] ******************************************************************* ok: [localhost] => { "msg": "Hello" } TASK [debug] ******************************************************************* ok: [localhost] => { "msg": "Hi" } PLAY RECAP ********************************************************************* localhost : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
在第一個 debug 任務中,var1 已定義,因此 default 過濾器不會更改其值。在第二個任務中,var2 未定義,因此 default 過濾器將其分配值為 'Hi'。
瞭解如何在 Ansible 中利用變數和事實是編寫高效、可重用自動化指令碼的關鍵。始終保持學習和探索這些概念,以充分利用 Ansible。
結論
Ansible 變數和事實如果使用得當,可以透過使您的任務更具動態性、減少重複以及實現更有效的資源利用來極大地增強您的自動化工作流程。從定義和使用基本變數到採用事實快取等高階策略,可能性多種多樣。
通過了解這些概念,您可以編寫更靈活、高效和強大的 Ansible 劇本。與往常一樣,請務必查閱 Ansible 官方文件以獲取最準確和最新的資訊。