變量(variable)
- Ansible的變量名僅能由字母、數字和下劃線組成,且只能以字母開頭。
- Python關鍵字和playbook關鍵字都不能作爲有效的變量名。
- Ansible的變量可以被定義在playbook、inventory、yaml格式文件、角色和命令行中,也可以將任務的輸出定義爲變量。
自定義變量
# 方式1:在Inventory中爲主機或組定義專用變量
[groupname]
192.168.56.1 variable_name=value
[groupname:vars]
variable_name=value
[all:vars]
ansible_ssh_port="2222"
# 方式2:在playbook中通過關鍵字vars或vars_files定義變量
vars:
- var_name: value
- var_name: value
vars_files:
- ./external_vars.yml # 變量文件內容遵循yml格式
# 方式3:在playbook中把任務的輸出通過關鍵字register定義爲變量,然後用於其他任務
tasks:
- name: test
shell: /usr/bin/foo
register: foo_result
# 方式4:在playbook中使用變量,執行palybook時通過命令行傳遞變量,通過“-e”或“--extra-vars”參數傳遞的變量優先級更高
ansible-playbook test.yml --extra-vars "hosts=Test user=anliven"
# 方式5:指定主機角色時通過 roles 傳遞變量,並在角色內通過` var_name `調用
roles:
- { role: ROLE_NAME, var: value, ...}
系統變量
# 遠程主機的系統信息統稱爲facts
# facts信息是JSON格式的數據結構,ansible_facts是最上層,可以使用 ansible_facts 變量查看所有內容
# 此外默認情況下使用 ansible_ 前綴可以將一些fact作爲頂級變量訪問
# 通過 setup 模塊可以查看指定主機的所有facts信息,通過使用filter參數來查看指定信息
ansible <host> -m setup # 查看指定主機的facts信息
ansible ta -m setup | grep "xxx" # 獲取主機所有facts然後結合grep命令過濾
ansible ta -m setup -a "filter=ansible_os_family" # 通過filter參數來查看指定信息
ansible ta -m setup -a 'filter="*mem*"' --tree ./facts # 通過filter參數查看指定信息並按主機名保存到facts目錄
引用變量
# 普通變量
通過 {{ var_name }} 方式引用
# 關鍵字register或系統fact變量
- 返回結果集通常是嵌套yaml或者json的數據結構
- 通過 {{ var_name.stdout }} 或 {{ ansible_facts["eth0"]["ipv4"]["address"] }} 的方式引用
變量優先級
# 優先級
1. 命令行中定義的變量(用-e或--extra-vars定義的變量)
2. 在Inventory中定義的連接變量(比如:ansible_ssh_user)
3. 普通變量(命令行轉換、play中的變量、included的變量、role中的變量等)
4. 在Inventory中定義的其他變量
5. Facts變量