1. 變量來源
- inventoryfile中定義
- playbook中定義
- include文件和角色中定義變量
- 系統facts ansible hostname -m setup
- local facts
2. 變量的使用
{{ ansible_eth0["ipv4"]["address"] }} 或者 {{ ansible_eth0.ipv4.address }}. 復雜變量可以像字典或者熟悉一樣訪問. 效果一樣
3. 本地變量
ansible hostname -m setup 可以獲取固定的系統facts, 在playbook中設置gather_fact:yes, playbook會自動獲取遠程機器的facts. 但是ansible也支持用戶自定義facts
如果目標機器上有/etc/ansible/facts.d/目錄, 在該目錄下有.fact結尾的json ini 或者可執行並返回json過的腳本, 都可以作為本地便變量
例如
/etc/ansible/facts.d/preferences.fact: [general] asdf=1 bar=2
使用變量 {{ ansible_local.preferences.general.asdf }}
4. 魔法變量
- hostvars 可以讓你調用其他host的變量和facts, 即使你沒有在這個機器上執行過playbook, 你仍然可以訪問變量, 但是不能訪問facts. 例如: {{ hostvars['test.example.com']['ansible_distribution'] }}
- group_names 當前host所在的group的組名列表. 包括其父組
- groups 所有組包括組中的hosts
- inventory_hostname 配置在inventory文件中當前機器的hostname
play_hosts
執行當前playbook的所有機器的列表- inventory_dir inventory文件的路徑
- inventory_file inventory文件的路徑和文件名
- role_path 當前role的路徑
5. 變量作用域
- 全局作用域: 設置在config, 環境變量, 和命令行中的變量
- play: 作用於play和包含的structure, 變量, role中的default和vars
- host: inventory, facts和register產生的變量, 只作用於某個host
Note 1: 子組的變量會覆蓋父組的變量, host的變量會覆蓋其組的變量
Note 2: 變量優先級
roles/x/defaults/main.yml -> inventory file -> roles/x/vars/main.yml -> 調用role時的參數 -> role play 中的變量 -> 執行命令-e 傳入的變量.
6. fact緩存
如果想在一個host上訪問另一個host的fact 必須設置gathering
setting to smart
, 否則,如果你想訪問另一個機器的fact, 那你必須在另外一台機器上執行過gather_fact.
inventory 里面聲明的變量是否和上面有同樣的要求, 待驗證-???