我們在上一篇文章中討論的內容 Ansible 劇本 是一種通過劇本創建和運行任務的方法。在本文中,我們將更進一步,學習如何在 Ansible playbook 中使用變量。
內容
什麼是 Ansible 變量?
多變的 是所有編程語言的基本概念,用於存儲數據並在你的代碼中使用。另外,ansible還有一個變量,裡面存儲了一些值,後面會用到playbook的各種處理。
Ansible 支持在多個地方聲明變量,例如 playbook、host_vars、group_vars 文件、命令行參數等。
下一節將介紹如何在不同的地方定義變量並了解它們的優先級。
變量——鍵、值映射
變量可以在遊戲級別和任務級別使用。”vars
“關鍵字。關鍵字 vars 後面是帶有鍵和值的變量。這些變量可供所有正在運行的任務訪問。”
我使用調試模塊創建了一個打印帶有變量值的消息的任務。變量必須用雙花括號括起來 {{改變}}..
如何在 Ansible Playbooks 中使用調試模塊
- name: Print vars hosts: m1 gather_facts: false vars: os_name: "PoP!_OS Desktop" version: "21.10" tasks: - name: Task1 - Substitute variables debug: msg: "My current desktop OS is {{ os_name }} - {{ version }}" Key-value variable Mapping
要運行 playbook,請在終端中運行以下命令:
$ ansible-playbook playbook_name.yml
從下圖中,您可以看到兩個變量都已替換為它們的值 味精 打印到標準輸出。
變量 – 元素列表
您可以在變量中創建元素列表。查看下面的定義,我以兩種方式創建了列表變量。
- 用於定義項目/元素列表的標準 YAML 方法。在這裡,指定變量名稱如下: “Top_linux_desktops”..
- 用於創建項目/元素列表的 Python 語法。在這裡,指定變量名稱如下: “Top_desktops”..
vars: top_linux_desktops: - MXlinux - pop-os - Linux Mint - Manjaro - Fedora top_desktops: [MXLinux, pop-os, Linux Mint, Manjaro, Fedora]
您可以使用變量名來輸出列表中的所有元素。 我創建了兩個任務。第一個任務是從 top_linux_desktops 變量和第二個任務輸出元素 top_desktops 改變。
tasks: - name: Task1 - List of elements debug: msg: "My fav linux desktops are {{ top_linux_desktops }}" - name: Task2 - List of elements using Python syntax debug: msg: "My fav linux desktops are {{ top_desktops }}"
在列表中,您可以使用索引位置來訪問單個元素,就像訪問 Python 列表中的元素一樣。有兩種方法可以做到這一點。
- 使用點表示法(variable.index)
- Python 表示法(變量[index])。
我創建了兩個任務。第一個任務使用點表示法,第二個任務使用 Python 表示法從第一個和第二個位置輸出元素。
tasks: - name: Task3 - Accessing List element using dot notation debug: msg: "My fav linux desktops are {{ top_linux_desktops.1 }} and {{ top_desktops[2] }}" - name: Task4 - Accessing List element using python notation(list[i]) debug: msg: "My fav linux desktops are {{ top_linux_desktops[1] }} and {{ top_desktops[2] }}"

變量——字典
您可以創建一個字典對象並將其分配給一個變量。這類似於 Python 字典。可以通過兩種方式創建字典。
- 用於定義字典的標準 YAML 語法
- Python 字典符號
如果您可以看到下面的腳本片段,那麼您已經創建了兩個字典變量。第一個變量 《發布新聞》 遵循 YAML 語法方法和第二個變量 “新發布信息” 遵循 Python 字典的語法。
vars: release_info: name: PoP!_OS Desktop version: 22.04 release_month: April, 2022 new_release_info: { name: PoP!_OS Desktop, version: 22.04, release_month: "April, 2022"}
您可以使用鍵從變量或特定字典元素中獲取所有值。像列表一樣,字典根據點和 Python 表示法打印鍵值。
我創建了兩個任務。第一個任務是 點符號 從字典中獲取元素。 第二個任務是 蟒蛇符號 抓住元素。
tasks: - name: Task1 - Accessing dictionary values using its key with dot notation(dict.key) debug: msg: "{{ release_info.name }} version {{ release_info.version }} is released on {{ release_info.release_month }}" - name: Task2 - Accessing dictionary values using its key with python notation(dict['key']) debug: msg: "{{ new_release_info['name'] }} version {{ new_release_info['version'] }} is released on {{ new_release_info['release_month'] }}"

玩任務級別的優先級
可以在任務級別和遊戲級別定義變量,但在任務級別定義的變量優先於在遊戲級別定義的變量。
在下面的示例中,我們在播放級別和任務級別創建了一個具有相同變量名稱的變量。當您運行 playbook 時,將使用任務變量名稱。
vars: os_name: "PoP!_OS Desktop" version: "21.10" tasks: - name: Task1 - Substitute variables vars: os_name: "Linux Mint" version: "20.03" debug: msg: "My current desktop OS is {{ os_name }} - {{ version }}"

命令行參數優先的手冊
可用於覆蓋 playbook 中傳遞的變量 -e
橫幅。傳遞變量的更高優先級 -e
橫幅。
您正在運行與上一節中相同的劇本。 -e
橫幅。
$ ansible-playbook 4_var_precedence.yml -e "os_name=fedora" -e "version=35"

您可以將變量傳遞給 -e
登錄 Json
, YAML
還 ini
格式。
# INI FORMAT $ ansible-playbook 4_var_precedence.yml -e "os_name=fedora" -e "version=35" # JSON FORMAT $ ansible-playbook 4_var_precedence.yml -e '{"os_name": "fedora"}' -e '{"version": 35}' # YAML FORMAT $ ansible-playbook 4_var_precedence.yml -e "{os_name: fedora}" -e "{version: 35}"
您還可以為變量創建並傳遞另一個文件 -e
橫幅。語法如下:在這裡,我創建了一個名為 vars.yml
對所有變量進行分組。當一個文件被傳遞到 -e
標記要導入劇本的所有變量。
$ ansible-playbook 4_var_precedence.yml -e @vars.yml
變量文件
您可以創建一個文件並在文件中聲明所有變量,而不是在 playbook 中定義變量。我創建了一個名為 vars.yml
然後將上一節中描述的所有變量分組到這個文件中。

而不是使用關鍵字 多變的必須使用 vars_files 在 playbook 中傳遞文件名。現在,當您運行 playbook 時,ansible 將從文件中獲取變量。該文件可以放置在任何路徑中。


主變量和組變量
您可以在清單文件中定義主機級和組級變量。以下文章簡要說明瞭如何創建主機級和組級變量。
Ansible 庫存和配置文件
作為最佳實踐,您可以:而不是在清單文件中定義變量: host_vars
什麼時候 group_vars
ansible 自動選擇目錄中的文件。創造 host_vars
..
$ mkdir host_vars
的 host_vars
目錄允許您定義主機級變量。也就是說,您可以創建 INI、YAML 或 JSON 格式的文件並存儲特定主機的變量。查看下面的清單文件,有兩個名為“ubuntu”和“rocky”的主機,為每個主機創建一個變量文件。
當心: 文件名必須與清單文件的主機名/別名相同。
# Inventory file [m1] ubuntu ansible_host=ubuntu.anslab.com [m2] rocky ansible_host=rocky.anslab.com
$ mkdir host_vars/ubuntu.yml $ echo "message: This variable is read from host_vars/ubuntu.yml file" > host_vars/ubuntu.yml" $ mkdir host_vars/rocky.yml $ echo "message: This variable is read from host_vars/rocky.yml file" > host_vars/rocky.yml
我添加了一個名為 “”message
“” 帶有兩個變量文件。現在,當您運行 playbook 時,將從兩個文件中檢索變量。

同樣,您可以為組創建一個變量文件。創建目錄 “”group_vars
“” 根據清單文件創建具有組名的文件。
[m1] ubuntu ansible_host=ubuntu.anslab.com [m2] rocky ansible_host=rocky.anslab.com [servers:children] m1 m2
我創建了一個名為 “服務器”創建文件名如下 servers.yml
..
$ mkdir group_vars $ mkdir group_vars/servers.yml $ echo "message: This variable is read from group_vars/servers.yml file" > group_vars/servers.yml
當我運行劇本時,它看起來像這樣: servers.yml
從 group_vars..

當心: 在這兩種情況下 host_vars
什麼時候 group_vars
ansible 搜索優先 host_vars
定義。如果沒有找到 group_vars
..
魔術變量
Ansible 提供了一些內部變量,其狀態在 playbook 運行時定義。這些變量在整個劇本中都可用。有關可用特殊變量的列表,請參閱以下鏈接。
Ansible 特殊變量
例如,有一個變量叫做 inventory_dir
保存 playbook 中使用的清單文件的絕對路徑。
- name: Magic Variables - Get inventory directory path debug: msg: "{{ inventory_dir }}"

重要的魔法變量 hostvars
..此變量以 json 格式輸出一些魔術變量的集合。
- name: Magic Variables - hostvars debug: msg: "{{ hostvars }}"

輸出包含 str、list 和字典格式的信息。如果要查看我的ubuntu主機屬於哪個組,可以通過以下方式獲取。我們在這裡使用 Python 語法符號。
- name: Magic Variables debug: msg: "{{ hostvars['ubuntu']['group_names'] }}"

並非所有魔法變量都對日常操作有用。檢查所有魔法變量,看看哪一個適合您的用例。
可變事實
當您運行 playbook 時,ansible 使用 setup 模塊從目標主機收集事實並將輸出保存在內存中以供 playbook 使用。事實也稱為腳本變量。
首先,了解事實輸出以獲取特定屬性。運行以下命令:這將收集事實輸出並將其保存到文件中。
$ ansible all -m setup --tree /tmp/facts_result
為每個主機創建一個單獨的輸出文件。查看輸出,它只是 JSON 格式的輸出。

事實輸出的屬性採用列表、字典和 AnsibleUnsafeText 格式。下面是一些不同類型的例子。
- name: Facts output - AnsibleUnsafeText debug: msg: "{{ discovered_interpreter_python }}" - name: Facts output - List debug: msg: "{{ ansible_all_ipv4_addresses }}" - name: Facts output - Dictionary debug: msg: "{{ ansible_python }}"

Facts 收集了大量信息,因此請檢查輸出以查看符合您要求的內容。
結論是
在這篇文章中,我解釋了什麼是 ansible 變量以及如何在不同的地方聲明它們。聲明變量時,變量的優先級非常重要,本文將討論。我們還解釋了魔法變量及其使用示例。最後,我們將討論什麼是事實以及如何使用事實輸出作為變量。
AnsibleAnsible 命令 AnsiblePlaybooksAnsible 系列Ansible 教程Ansible 變量DevOpsLinuxLinux 管理開源系統管理員