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 上更加輕鬆。