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 裡面沿用下去
我們下次見~