首先來看一個例子:假設我想得到主機IP為172.25.250.9的完全限定域名(FQDN),但是我無法登入該主機,那麼就可以用本機裡面的hostvars魔法變數(後面會分享我對魔法這個詞的理解)這個字典裡面的ansible_fact這個子字典(後面會補充解釋)來得到。
首先讓我們來看看hostvars裡面都是些啥,我們可以通過一下命令來檢視hostvars這個字典:
ansible locahost -m debug -a “var=hostvars"
localhost | SUCCESS => { "hostvars": { "172.25.250.10": { "ansible_check_mode": false, "ansible_diff_mode": false, "ansible_facts": {}, "ansible_forks": 5, "ansible_inventory_sources": [ "/home/greg/ansible/inventory" ], "ansible_password": "redhat", "ansible_playbook_python": "/usr/libexec/platform-python", "ansible_user": "root", "ansible_verbosity": 0, "ansible_version": { "full": "2.8.0", "major": 2, "minor": 8, "revision": 0, "string": "2.8.0" }, "group_names": [ "test" ], "groups": { "all": [ "172.25.250.9", "172.25.250.10", "172.25.250.13", "172.25.250.11", "172.25.250.12" ], "balancers": [ "172.25.250.13" ], "dev": [ "172.25.250.9" ], "prod": [ "172.25.250.11", "172.25.250.12" ], "test": [ "172.25.250.10" ], "ungrouped": [], "webservers": [ "172.25.250.11", "172.25.250.12" ] }, "inventory_dir": "/home/greg/ansible", "inventory_file": "/home/greg/ansible/inventory", "inventory_hostname": "172.25.250.10", "inventory_hostname_short": "172", "omit": "__omit_place_holder__24431a21232ab0a628ff5c537f472e6b49d1e14a", "playbook_dir": "/home/greg/ansible" }, "172.25.250.11": { "ansible_check_mode": false, "ansible_diff_mode": false, "ansible_facts": {}, .................... "172.25.250.12": { "ansible_check_mode": false, "ansible_diff_mode": false, "ansible_facts": {}, "ansible_forks": 5, "ansible_inventory_sources": [ "/home/greg/ansible/inventory" ], .......................... "172.25.250.13": { "ansible_check_mode": false, "ansible_diff_mode": false, "ansible_facts": {}, "ansible_forks": 5, "ansible_inventory_sources": [ "/home/greg/ansible/inventory" ], ............................ "172.25.250.9": { "ansible_check_mode": false, "ansible_diff_mode": false, "ansible_facts": {}, "ansible_forks": 5, "ansible_inventory_sources": [ "/home/greg/ansible/inventory" ], ...................... "inventory_dir": "/home/greg/ansible", "inventory_file": "/home/greg/ansible/inventory", "inventory_hostname": "172.25.250.9", "inventory_hostname_short": "172", "omit": "__omit_place_holder__24431a21232ab0a628ff5c537f472e6b49d1e14a", "playbook_dir": "/home/greg/ansible" } }
}
從輸出結果可以看到,在hostvars裡面一共有5個鍵值對(‘172.25.250.9’:值1,‘172.25.250.13:值2這樣的形式。因為我的環境裡一共有5個受控節點,所以有五個鍵值對),每個鍵值對的值裡面都有一個”ansible_facts“的鍵,這個鍵對應的值便是生成f的acts(有關遠端主機節點的資訊)。
Tip: hostvars裡面還有groups這個魔法變數(可以從最上面的輸出看到),裡面包含了5個節點的IP,也就是all這個組,(所有節點都會被自動劃分到all組裡面,相對應的,如果一個組沒有加入了除all組之外的組,那麼這個主機還會被自動劃分到ungrouped組裡面,也就是說,ungrouped組裡面的主機都是沒有加入別的組的(除了all組))
好了,現在可以說:fqdn可以通過ansible_facts裡面的某個元素來得到,既然我們知道hostvars裡面有ansible_facts,那麼現在讓我們再來看看ansible_facts裡面都有些啥。
ansible localhost -m setup -a "filter=*fqdn*"
# localhost: 執行節點為本機
# -m: module
# setup: 生成ansible_facts
# -a: append
# filter: 前面的引數組成的命令會一股腦的全部輸出,filter引數用於過濾這些輸出
# *fqdn*: 正規表示式,含有fqdn的項
Tip:可以直接執行“ansible localhost -m setup”來檢視所有的ansible_facts,由於太冗餘這裡不再顯示。
從上圖我們可以看到,ansible_facts裡面的ansible_fqdn儲存著localhost(左上角顯示的是localhost)的fqdn。
所以我們可以通過hostvars---->ansible_facts------->ansible_fqdn來得到fqdn,但是hostvars裡面有很多不同主機的ansible_facts,所以我們要指定是哪臺主機的ansible_facts,這樣才能得到正確的fqdn,所以可以通過以下方式得到:
hostvars["172.25.250.9"]["ansible_facts"]["ansible_fqdn"]
對“魔法”的理解:
If you want to configure your database server using the value of a ‘fact’ from another node, or the value of an inventory variable assigned to another node, you can use
hostvars
in a template or on an action line
如果我們想用來自別的節點的資訊,那麼就可以在jinja或命令列中用hostvars這個魔法變數,我個人的理解是:其“魔法”體現在明明是本機,卻可以得到別的主機的資訊,所以就很神奇。
With
hostvars
, you can access variables defined for any host in the play, at any point in a playbook. You can access Ansible facts using thehostvars
variable too, but only after you have gathered (or cached) facts.
我們還可以通過hostvars變數獲取ansible_facts。
文件連結:
Discovering variables: facts and magic variables — Ansible Documentation
在文件內搜尋:“Information about Ansible”即可定位到。
在這裡問廣大網友一個問題,本人剛接觸ansible,不理解jinja模板中呼叫這些魔法變數時為什麼可以不先定義的,就是說我想知道ansible是怎麼呼叫jinja檔案的,或者是jinja是怎麼獲取那些沒有實現定義在jinja檔案中的魔法變數(例如groups)的?懇請各位傳道授業,本人不勝感激。