文章目錄
- 1. 變量簡介
-
- 1.1 建立有效的變量名
- 1.2 變量範圍
- 1.3 變量的優先級
- 2. 變量設定
-
- 2.1 在playbook中直接設定
- 2.2 在檔案中設定
- 2.3 清單變量
- 2.4 字典變量
- 3. 主機清單變量
- 4. 目錄中的變量
- 5. 注冊變量
- 6. 引用嵌套事實變量
- 7. 魔術變量
變量詳解官方文檔
1. 變量簡介
1.1 建立有效的變量名
- 隻能包含字母,數字和下劃線
- 不能出現Python關鍵字或劇本關鍵字
- 不能以數字開頭
1.2 變量範圍
Global | 由配置,環境變量和指令行設定 |
Play | 每次播放并包含結構,vars條目(vars; vars_files; vars_prompt),角色預設值和vars |
Host | 直接與主機相關聯的變量,例如 inventory清單,include_vars,facts 或已注冊的任務輸出 |
- 優先級:Host>Play>Global
1.3 變量的優先級
通常,Ansible優先使用最近定義,更活躍且定義範圍更廣的變量。角色内預設檔案夾中的變量很容易被覆寫。角色的vars目錄中的所有内容都會覆寫名稱空間中該變量的先前版本。主機和/或庫存變量将覆寫角色預設值,但顯式包含(如vars目錄)或 include_vars
任務将覆寫inventory庫存變量
優先級從 低→高 | |
---|---|
1 | 指令行值不是變量: |
2 | role defaults(在role / defaults / main.yml中定義) |
3 | inventory file or script group vars |
4 | inventory group_vars/all |
5 | playbook group_vars/all |
6 | inventory group_vars/* |
7 | playbook group_vars/* |
8 | inventory file or script host vars |
9 | inventory host_vars/* |
10 | playbook host_vars/* |
11 | host facts / cached set_facts |
12 | play vars |
13 | play vars_prompt |
14 | play vars_files |
15 | role vars(在role / vars / main.yml中定義) |
16 | block變量(僅适用于block中的任務) |
17 | 任務變量(僅适用于任務) |
18 | include_vars |
19 | set_facts /已注冊的變量 |
20 | 角色(和include_role)參數 |
21 | 包含參數 |
22 | 額外的變量 (例如 )(始終優先) |
- 【在任何部分中,重新定義var都會覆寫前一個執行個體。如果多個子產品組具有相同的變量,則最後一個加載者獲勝。】
- 【在play的vars:部分中兩次定義變量,則第二個變量獲勝】
2. 變量設定
2.1 在playbook中直接設定
---
- hosts: test
vars:
http_port: 80 #通過修改變量值,控制tast組成員的Apache端口
tasks:
2.2 在檔案中設定
變量檔案:
---
web_pkg: httpd
playbook檔案:
---
- host: test
vars_files:
- 變量檔案的路徑
tasks:
- name: 安裝 apache
dnf:
name: "{{ web_pkg }}"
state: present
2.3 清單變量
定義清單變量
region:
- northeast
- southeast
也可以存儲在方括号中[],并用逗号分隔
引用清單變量
2.4 字典變量
定義字典變量
foo:
field1: one
field2: two
引用字典變量
兩種引用方式:
foo['field1'] #官方推薦
foo.field1
3. 主機清單變量
主機變量
[test]
server2 http_port=80 ansible_connection=ssh ansible_user=myotheruser
主機組變量
[test]
server2
[test:vars]
http_port=80
組的組的組變量
[test]
server2
[prod]
server3
[webserver:children]
test
prod
[webserver:vars]
http_port=80
4. 目錄中的變量
- group_vars目錄:清單變量(目錄中的檔案名稱與主機清單名稱一緻)
- host_vars目錄:主機變量(目錄中的檔案名稱與主機名稱一緻)(取決于清單裡是主機名還是ip)
示例:
#主機清單hosts
[test]
server1
則在檔案group_vars/test中定義變量
5. 注冊變量
- 使用task關鍵字從Ansible任務的輸出中建立變量
,可以在劇本的任何後續任務中使用注冊的變量register
- 注冊變量是主機級變量。在具有循環的任務中注冊變量時,注冊的變量包含循環中每個項目的值。在循環期間放置在變量中的資料結構将包含一個
屬性,該屬性是子產品中所有響應的清單results
---
- name: 測試Apache,傳回直
uri:
url: "http://172.25.17.2:{{http_port}}"
return_content: yes
status_code: 200
register: result
- debug:
msg: "{{ result['stdout'] }}"
6. 引用嵌套事實變量
許多注冊變量和事實變量是嵌套的YAML或JSON資料結構
Ansible事實是與遠端系統相關的資料,包括作業系統,IP位址,附加的檔案系統等
引用事實變量
{{ ansible_facts["網卡"]["ipv4"]["address"] }}
{{ ansible_facts.網卡.ipv4.address }}
檢視事實變量:
ansible <hostname> -m setup
緩存事實變量
與注冊變量一樣,事實預設情況下将事實存儲在記憶體中。但是,與注冊變量不同,事實可以獨立收集并緩存以供重複使用。使用緩存的事實,即使Ansible首先在第二個系統上執行目前播放,也可以在配置第二個系統時從一個系統引用事實
禁用事實變量
- hosts: whatever
gather_facts: no #禁用事實變量
7. 魔術變量
- 魔術變量是Special Variables。魔術變量名稱是保留的,請勿使用這些名稱設定變量。該變量環境也被保留
- 常用的魔術變量:
- hostvars
- groups
- group_names
- inventory_hostname
- 使用hostvars,可以在劇本的任何位置通路為劇本中的任何主機定義的變量。也可以使用hostvars變量來通路Ansible事實
使用groups清單中所有組(和主機)的清單,枚舉組中的所有主機
{% for host in groups['組名'] %}
# something that applies to all app servers.
{% endfor %}
使用groups和hostvars來查找組中的所有IP位址
{% for host in groups['組名'] %}
{{ hostvars[主機]['ansible_facts']['網卡名']['ipv4']['address'] }}
{% endfor %}
其他魔術變量 | |
---|---|
ansible_play_hosts | 是目前播放中仍處于活動狀态的所有主機的清單 |
ansible_play_batch | 是主機名的清單,該主機名屬于該劇的目前“批處理” |
serial | 批處理大小(如果未設定,則等于整個運作) |
ansible_playbook_python | 是用于調用Ansible指令行工具的python可執行檔案的路徑 |
inventory_dir | 是儲存Ansible的清單主機檔案的目錄的路徑名 |
inventory_file | 是指向Ansible的清單主機檔案的路徑名和檔案名 |
playbook_dir | 包含劇本的基本目錄 |
role_path | 包含目前角色的路徑名,并且僅在角色内部起作用 |
ansible_check_mode | 是一個布爾值,True如果使用來運作Ansible ,則設定為--check |
示例: