Ansible 的 Facts

什麼是 Ansible facts 呢?

可以把他想像成auto_discover, 它能夠幫你蒐集一些機器的基本訊息, 如硬盤,IP, 主機名稱 等等的, 並且註冊到playbook變數, 讓之後可以繼續使用.有一些文章提到, 如果你已經有架構內所有機器的資訊, 不需要他來幫你gather_facts 那就可以把他關掉哦. 不過這個功能其實滿好用的,下面來介紹一下吧~

首先我們編寫一個playbook, 內容就是基本的ping就好了

執行效果如下:


可以看到, 他在真正執行tasks之前, 做了一個動作Gathering Facts, 那就是他在蒐集資訊哦. 這是他預設的行為, 不過這項任務其實很單純, 並不需要這些資訊,那我們可以把他關掉. 有兩個地方可以關掉, 第一個就是ansible.cfg, 另外也可以在playbook裡面各別關掉哦. 首先看看ansible.cfg.

有三個選項: 預設是 implicit
smart: 預設蒐集資訊, 但是不重複蒐集
implicit: 預設一律蒐集, 指定 gather_facts: False來關閉
explicit: 預設一律不蒐集, 指定 gather_facts: True來開啟


那我們這邊把他改成 explicit, 讓他一律不蒐集吧!

這時候再次執行剛剛的playbook, 可以看到他不再蒐集囉. 在簡單的任務中, 這樣可以省不少時間呢.


欸..上面才說要介紹,怎麼就關掉了哪.. 別急阿~ 這就把他打開


怎麼使用他?

下面示範如何各別開啟, 然後這個facts又能給我們帶來什麼好處吧!
比如你需要在你的任務中, 呼叫那台機器的host name 或是 IP, 那就可以像這樣使用哦.

這邊示範取得主機 IP

運行結果:



Wait!!

ansible_default_ipv4['address'] 這是打哪來的?
這就是他蒐集到的facts啦~
使用 ansible <host> -m setup 可以看到全部的參數哦


這樣一來, 機器的很多資訊不用再定義一次啦~ 不過...拿到自己的資訊可能不太稀奇, 我能不能讓LAB_PROXY10的任務, 自動去抓取LAB_WEB1的 IP 呢?


共享facts

獨樂(ㄩㄝ↘)樂不若與眾樂(ㄩㄝ↘)樂, 在你那邊蒐集到的資訊, 我借來用可以吧?當然可以, 請看下面示範
請注意這邊只有 LAB_WEB1 有蒐集事實 (gather_facts); LAB_PROXY10 則沒有

運行結果如下

這邊的 inventory_hostname 指的就是自己, 因為 LAB_PROXY10 自己沒有蒐集事實, 所以他第一個會輸出 VARIABLE IS NOT DEFINED

但是 LAB_WEB有蒐集事實, 所以就可以去輸出他的 IP 哦; 這邊就成功讓 LAB_PROXY10 去輸出 LAB_WEB1的 IP 資訊啦~

好像有什麼沒說清楚..



Wait x2

第一次我們不用共享facts的時候, 我們這樣配置 var=ansible_default_ipv4['address']
第二次要facts的時候變成 var=hostvars[inventory_hostname]['ansible_default_ipv4']['address']

還記得我們可以在inventory裡面定義變數嗎? 然後 facts 這也視為變數, 這兩個會參在一起做成撒尿牛丸變成hostvars; 所以可以想像 hostvars 就是全局的變數, 看下面的範例吧

LAB_WEB1 什麼都不做, 就是蒐集事實
LAB_PROXY10 負責把全局變數打印出來

然後把打印的結果, 丟到這裡

可以看到
LAB_PROXY10 下面只有24個選項可以用; LAB_WEB 有110個選項, 那就是gather facts帶來的哦



尾聲

關於 facts 就介紹到這邊啦~
複習一下重點

  • 如果要取自己的變數, 參照 ansible setup 模塊 提供的就可以了
  • 如果還要取別人的變數, 就要從全局變數 hostvars 一路寫下來
  • gather facts只要做一次, 就可以在 playbook 裡面沿用下去

我們下次見~