主機變量
[atlanta]
host1 http_port=80 maxRequestsPerChild=808
host2 http_port=303 maxRequestsPerChild=909
組變量
[atlanta]
host1
host2
[atlanta:vars]
ntp_server=ntp.atlanta.example.com
proxy=proxy.atlanta.example.com
# 把一個組作為另一個組的子成員
[atlanta]
host1
host2
[raleigh]
host2
host3
[southeast:children]
atlanta
raleigh
[southeast:vars]
some_server=foo.southeast.example.com
halon_system_timeout=30
self_destruct_countdown=60
escape_pods=2
[usa:children]
southeast
northeast
southwest
northwest
分文件定義 Host 和 Group 變量
在 inventory 主文件中保存所有的變量並不是最佳的方式.還可以保存在獨立的文件中,這些獨立文件與 inventory 文件保持關聯. 不同於 inventory 文件(INI 格式),這些獨立文件的格式為 YAML.詳見 YAML 語法 .
假設 inventory 文件的路徑為:
/etc/ansible/hosts
假設有一個主機名為 ‘foosball’, 主機同時屬於兩個組,一個是 ‘raleigh’, 另一個是 ‘webservers’. 那么以下配置文件(YAML 格式)中的變量可以為 ‘foosball’ 主機所用.依次為 ‘raleigh’ 的組變量,’webservers’ 的組變量,’foosball’ 的主機變量:
/etc/ansible/group_vars/raleigh
/etc/ansible/group_vars/webservers
/etc/ansible/host_vars/foosball
舉例來說,假設你有一些主機,屬於不同的數據中心,並依次進行划分.每一個數據中心使用一些不同的服務器.比如 ntp 服務器, database 服務器等等. 那么 ‘raleigh’ 這個組的組變量定義在文件 ‘/etc/ansible/group_vars/raleigh’ 之中,可能類似這樣:
---
ntp_server: acme.example.org
database_server: storage.example.org
這些定義變量的文件不是一定要存在,因為這是可選的特性.
還有更進一步的運用,你可以為一個主機,或一個組,創建一個目錄,目錄名就是主機名或組名.目錄中的可以創建多個文件, 文件中的變量都會被讀取為主機或組的變量.如下 ‘raleigh’ 組對應於 /etc/ansible/group_vars/raleigh/ 目錄,其下有兩個文件 db_settings 和 cluster_settings, 其中分別設置不同的變量:
/etc/ansible/group_vars/raleigh/db_settings
/etc/ansible/group_vars/raleigh/cluster_settings
‘raleigh’ 組下的所有主機,都可以使用 ‘raleigh’ 組的變量.當變量變得太多時,分文件定義變量更方便我們進行管理和組織. 還有一個方式也可參考,詳見 Ansible Vault 關於組變量的部分. 注意,分文件定義變量的方式只適用於 Ansible 1.4 及以上版本.
Tip: Ansible 1.2 及以上的版本中,group_vars/ 和 host_vars/ 目錄可放在 inventory 目錄下,或是 playbook 目錄下. 如果兩個目錄下都存在,那么 playbook 目錄下的配置會覆蓋 inventory 目錄的配置.
Tip: 把你的 inventory 文件 和 變量 放入 git repo 中,以便跟蹤他們的更新,這是一種非常推薦的方式.
變量優先級
- extra vars (在命令行中使用 -e)優先級最高
- 然后是在inventory中定義的連接變量(比如ansible_ssh_user)
- 接着是大多數的其它變量(命令行轉換,play中的變量,included的變量,role中的變量等)
- 然后是在inventory定義的其它變量
- 然后是由系統發現的facts
- 然后是 "role默認變量", 這個是最默認的值,很容易喪失優先權