Ansible變量
定義變量規則:由字母/數字/下劃線組成,變量需要以字母開頭,ansible內置的關鍵字不能作為變量。
ansible中,可以將變量簡化為三個范圍:
Global范圍(高):從命令行和ansible配置設置的變量。
play范圍(中):set_facts,register,在play和相關結構中設置的變量。
Host范圍(低):inventory的變量,在主機組和個別主機上設置的變量。
-e > set_facts > register > vars(vars_files) > 事實變量 > inventory
內置變量不參與排序
三個范圍的變量優先級由高到低,如果變量重復定義,則以優先級高的為準。
注冊和定義變量的各種方式
ansible中定義變量的方式有很多種,大致有:
將模塊的執行結果注冊為變量
直接定義字典類型的變量
role中文件內定義變量
命令行傳遞變量
借助with_items迭代將多個task的結果賦值給一個變量
inventory中的主機或主機組變量
內置變量
事實變量
vars定義變量
# eg---- name: testhosts: node1vars:- aa: 11- bb: 22- cc:cc1: 33cc2: 44?tasks:- name: create debug1debug:msg: aa is {{ aa }}?- name: debug2debug:var: bb?- name: debug3debug:msg: cc1 is {{ cc.cc1 }}- name: debug4debug: var: cc.cc2
Vars_files定義變量
vim var.yml
aa: 11bb: 22cc:cc1: 33cc2: 44
# eg---- name: testhosts: node1vars_files: /home/student/ansible/var.ymltasks:- name: create debug1debug:msg: aa is {{ aa }}?- name: debug2debug:var: bb?- name: debug3debug:msg: cc1 is {{ cc.cc1 }}- name: debug4debug: var: cc.cc2
register注冊變量
使用register選項,可以將當前task的輸出結果賦值給一個變量。
---- name: testhosts: node1tasks:- name: touchcopy:content: "hello world\n"dest: /tmp/aa?- name: cat /tmp/aashell:cmd: cat /tmp/aa?register: i?- name: debug idebug:var: i
# 得到變量i的結果為"i": {"changed": true,"cmd": "cat /tmp/aa","delta": "0:00:00.004095","end": "2025-09-01 16:07:27.999086","failed": false,"msg": "","rc": 0,"start": "2025-09-01 16:07:27.994991","stderr": "","stderr_lines": [],"stdout": "hello world","stdout_lines": ["hello world"]}}
當劇本運行錯誤時,變量仍然會被注冊
# 查看/tmp/bb文件,將查看結果賦值給變量i,/tmp/bb文件不存在---- name: testhosts: node1tasks:- name: cat /tmp/bbignore_errors: yesshell:cmd: cat /tmp/bb?register: i?- name: debug idebug:var: i
"i": {"changed": true,"cmd": "cat /tmp/bb","delta": "0:00:00.003762","end": "2025-09-01 16:16:04.346693","failed": true,"msg": "non-zero return code","rc": 1,"start": "2025-09-01 16:16:04.342931","stderr": "cat: /tmp/bb: No such file or directory","stderr_lines": ["cat: /tmp/bb: No such file or directory"],"stdout": "","stdout_lines": []}}
set_fact定義變量
set_fact與register的功能很相似,也是將值賦值給變量。它更像shell中變量的賦值方式,可以將某個變量的值賦值給另一個變量,也可以將字符串賦值給變量。
# 查看node1主機的所有事實變量 ansible node1 -m setup # ansible node1 -m setup > file 將結果保存在一個文件中方便查找
常用事實變量
# ipv4地址 ansible_default_ipv4.address # 或者 ansible_enp1s0.ipv4.address enp1s0是受控主機的網卡名稱# 完全合格域名(FQDN) ansible_fqdn# 主機名稱 ansible_hostname# 內存大小 ansible_memtotal_mb# bios版本 ansible_bios_version# vda硬盤大小 ansible_devices.vda.size# 邏輯卷中卷組 ansible_lvm.vgs
通過命令傳入變量
ansible-playbook 劇本名稱 -e 傳入的變量及其值
--- - name: testhosts: node1tasks:- name: debug1debug:var: xingming- name: debug2debug:var: age
[student@master ansible]$ ansible-playbook a.yml -e 'xingming=ldh age=23'
主機清單中的變量
# 直接在主機后面定義,只有該主機可以調用該變量 node1 a=6# 將變量寫入組里,該組的成員可以調用這些變量 [web:vars] a=1 b=2
除了可以在主機清單里定義變量外,還可以在/home/student/ansible目錄下創建host_vars和host_vars目錄下定義。
# host_vars中定義有兩種,以node1舉例 vim node1 # 這里node1是與主機清單inventory寫的保持一致,如果主機清單寫的是IP地址,這里也寫IP地址 a: 11# 或者 vim node1.yml a: 22 # node1的優先級大于node1.yml的優先級
內置變量
groups # 主機清單中的分組情況 groups_names # 顯示主機的主機組的名稱 groups.all # 所有清單主機 inventroy_dir # 主機清單inventory的路徑 inventory_hostname # 顯示主機清單主機名稱
with_items疊加變量
可以給一個變量賦予多個值
--- - name: testhosts: node1tasks: - name: echo itemshell:cmd: echo "{{ item }}"with_items:- a- b- cregister: i- name: echo adebug:var: i.results[0].stdout- name: echo bdebug:var: i.results[1].stdout- name: echo cdebug:var: i.results[2].stdout
管理機密
Ansible可能需要訪問密碼或者API密鑰等敏感數據,以便配置受控主機。通常,此信息可能以純文本形式存儲在清單變量或其他ansible文件中。但若如此,任何有權訪問ansible文件的用戶或者存儲這些ansible文件的版本控制系統都能夠訪問此數據敏感數據。這顯然存在安全風險。
使用ansible隨附的ansible vault可以加密和解密任何由ansible使用的結果化數據文件。若要使用ansible vault,可通過一個名為ansible-vault的命令行工具創建、編輯、加密、解密和查看文件。Ansible vault可以加密任何由ansible使用的結構化數據文件。這可能包括清單變量、playbook中含有的變量文件、在執行playbook時作為參數傳遞的變量文件,或者ansible角色中定義的變量。
ansible-vault --helpansible-vault create # 創建新的加密文件 ansible-vault encrypt # 對已有文件進行加密 ansible-vault decrypt # 解密加密文件,直接解密。加入 --output=新的名稱,解密文件并存放為其他名稱。此時新文件為解密狀態,原文件仍為加密狀態 ansible-vault view # 查看加密文件內容 ansible-vault edit # 編輯加密文件 ansible-vault rekey # 修改加密文件的密碼
加密過的文件無法使用cat查看、vim編輯以及ansible-playbook運行。
# 運行加密文件 ansible-playbook --ask-vault-pass