Ansible Facts

簡單的說,Ansible facts 是 Ansible 連線到主機時所收集的資訊,這些資訊可以在後續 Playbook 裏面使用,資訊很多,像是主機名稱、IP等等的。

在單獨使用 ansible 執行 ad-hoc 命令時,可以用 setup 模組來收集。

ansible -i <your_inventory> -m setup <host>

執行以後,會輸出很多資訊,你可以先導向到特定檔案再來檢視,例如:

ansible -i 192.168.19.19, -m setup all >/tmp/my_file

在執行 Playbook 時,預設就會執行 setup 來收集資訊,若是想加快速度,可以不收集這些資訊

---
- name: Example 1
  hosts: all
  gather_facts: no

  tasks:
  - debug:
      msg: "Example"

那麼已經收集以後,該怎麼使用這些資訊呢?只要參考 ansible -m setup 的輸出,看有哪些變數,就可以直接使用,例如

---
- name: Example 2
  hosts: all
  gather_facts: yes

  tasks:
  - debug:
      msg: "IP 位址:{{ ansible_default_ipv4.address }}"

小技巧,因為變數眾多,有時會需要知道變數是哪種型態,這時候可以用 type_debug 來顯示出型態。

- name: Example 3
  hosts: all
  gather_facts: yes

  tasks:
  - debug:
      msg: "ansible_default_ipv4 的變數型態是 {{ ansible_default_ipv4 | type_debug }}"

執行以後,可以看到輸出結果如下

... 省略 ...
TASK [debug] *******************************************************************

ok: [localhost] => {
    "msg": "ansible_default_ipv4 的變數型態是 dict"
}
... 省略 ...

變數型態有 list, dict, AnsibleUnsafeText。

AnsibleUnsafeText 就是字串,list/dict 可以搭配 loop 來做使用。

透過 Facts,在 Playbook 撰寫上就可以省掉取得主機資訊的 tasks,直接就可以作使用,例如可以依據主機的 Linux 發行版來決定要執行什麼工作;或者是取得 IP 位址做設定。

在 Ansible automation platform 使用時,也可以使用這些資訊來做篩選。Ansible automation platform 的 Inventory 有分為兩種,一種是一般的 Inventory,另外一種則是 Smart Inventory 。

什麼是 Smart Inventory 呢?Smart Inventory 是基礎於已經設置好的主機,加上篩選條件,篩選出符合條件的主機,就不需要再另外新增 Inventory。

篩選條件就可以依據 facts 來做設置,所以可以篩選出所有 Linux 發行版是 RHEL8.6 的主機,或是 Linux 發行版是 Ubuntu 的主機。

所以,去了解並善用 ansible facts 已經收集的資訊可以讓你在撰寫 Ansible playbook 上更加輕鬆。

參考資料