如何在 Ansible Playbook 中使用變量


我們在上一篇文章中討論的內容 Ansible 劇本 是一種通過劇本創建和運行任務的方法。在本文中,我們將更進一步,學習如何在 Ansible playbook 中使用變量。

內容

  1. 什麼是 Ansible 變量?
  2. 變量——鍵、值映射
  3. 變量 – 元素列表
  4. 變量——字典
  5. 玩任務級別的優先級
  6. 命令行參數優先的手冊
  7. 變量文件
  8. 主變量和組變量
  9. 魔術變量
  10. 可變事實
  11. 結論是

什麼是 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, YAMLini 格式。

# 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 將從文件中獲取變量。該文件可以放置在任何路徑中。

劇本 Var_files 關鍵字劇本 Var_files 關鍵字
文件中定義的變量文件中定義的變量

主變量和組變量

您可以在清單文件中定義主機級和組級變量。以下文章簡要說明瞭如何創建主機級和組級變量。

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 時,將從兩個文件中檢索變量。

host_vars-變量的定義Host_vars – 變量的定義

同樣,您可以為組創建一個變量文件。創建目錄 “”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.ymlgroup_vars..

組變量組變量

當心: 在這兩種情況下 host_vars 什麼時候 group_varsansible 搜索優先 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 }}"
HostVars 輸出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 }}"
事實輸出 1事實輸出

Facts 收集了大量信息,因此請檢查輸出以查看符合您要求的內容。

結論是

在這篇文章中,我解釋了什麼是 ansible 變量以及如何在不同的地方聲明它們。聲明變量時,變量的優先級非常重要,本文將討論。我們還解釋了魔法變量及其使用示例。最後,我們將討論什麼是事實以及如何使用事實輸出作為變量。

AnsibleAnsible 命令 AnsiblePlaybooksAnsible 系列Ansible 教程Ansible 變量DevOpsLinuxLinux 管理開源系統管理員