ansible_hostname 與 inventory_hostname 之差異

目前工作很常使用到 Ansible 管理伺服器。尤其是在大量安裝套件,或修改設定時的情況。

Ansible 基本上已經可以解決掉多數我覺得麻煩的事情,如果搭配變數或 tag 功能,讓我可以更有彈性地針對不同伺服器,執行不同的 task 或設定……等。雖然可以更有彈性,但隨著時間一久,這些變數或者是 tag 反而會造成另一種不便,因為人的記憶是有限的。

我們的服務器還算不錯,至少會根據其主要功能,進行分類以及命名,所以辨視度其實很高。近期我重新整頓 Netdata 的設定以達到正規化,我又不想利用變數或是 tag 的方式,依不同類型的伺服器,去做部署,而是想自動判斷伺服器類型進行部署,也因此我就從伺服器名稱這部份下手。

自動判斷基本是要在 task 裡用 when 做條件判斷,當時找到的一段條件大概是這樣寫的

when: "keyword" in ansible_hostname

也就是在 ansible_hostname 這變數裡,搜尋特定關鍵字。但有時我真的搞不清楚 ansible_hostname 和 inventory_hostname 到底有什麼差別。

簡單來說,ansible_hostname 就如同在主機裡使用 hostname 這指令所看到的名稱一樣,在 Windows 裡就是電腦名稱。而 inventory_hostname,就只是指 inventory 檔案裡,我們為某一主機所給的名稱。

我公司的主機,如果 inventory 檔案裡寫著某名為 ABC 的主機,那麼這主機的電腦名稱或是 hostname 也就會叫 ABC。ansible_hostname 和 inventory_hostname,兩者會是一致的,都叫 ABC。

但我自己在寫 Ansible,通常會是在我的 LAB 環境做測試,確定沒問題才會推到我們的 git repo 裡供同事使用,或更進一步地部署到主機。但我自己的 LAB 主機通常 inventory 檔案裡記載的主機名,不會和主機的電腦名稱或 hostname 一致。也因此 ansible_hostname 和 inventory_hostname 就不會一致。

就我們的主機的命名情況來說,不管使用哪一個變數去做判斷,其實沒什麼差別,因為兩個變數的內容都是一樣的。不過,在使用 ansible_hostname 時,因為它是屬於 ansible facts 裡的變數,所以說 gather_facts 若是被設為 no 的情況,就會抓不到 ansible_hostname 的內容,也就可能會造成判斷上出現問題。

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

這個網站採用 Google reCAPTCHA 保護機制,這項服務遵循 Google 隱私權政策服務條款