主机的系统变量(facts)

ansible会通过module setup来收集主机的系统信息,这些收集到的系统信息叫做facts,这些facts信息可以直接以变量的形式使用。

哪些facts变量可以引用呢?在命令行上通过调用setup module命令可以查看

  1. $ ansible all -m setup -u root

怎样在playbook中使用facts变量呢,答案是直接使用:

  1. ---
  2. - hosts: all
  3. user: root
  4. tasks:
  5. - name: echo system
  6. shell: echo {{ ansible_os_family }}
  7. - name install ntp on Debian linux
  8. apt: name=git state=installed
  9. when: ansible_os_family == "Debian"
  10. - name install ntp on redhat linux
  11. yum: name=git state=present
  12. when: ansible_os_family == "RedHat"

使用复杂facts变量

一般在系统中收集到如下的信息,复杂的、多层级的facts变量如何使用呢?

  1. ...
  2. "ansible_ens3": {
  3. "active": true,
  4. "device": "ens3",
  5. "ipv4": {
  6. "address": "10.66.192.234",
  7. "netmask": "255.255.254.0",
  8. "network": "10.66.192.0"
  9. },
  10. "ipv6": [
  11. {
  12. "address": "2620:52:0:42c0:5054:ff:fef2:e2a3",
  13. "prefix": "64",
  14. "scope": "global"
  15. },
  16. {
  17. "address": "fe80::5054:ff:fef2:e2a3",
  18. "prefix": "64",
  19. "scope": "link"
  20. }
  21. ],
  22. "macaddress": "52:54:00:f2:e2:a3",
  23. "module": "8139cp",
  24. "mtu": 1500,
  25. "promisc": false,
  26. "type": "ether"
  27. },
  28. ...

那么可以通过下面的两种方式访问复杂的变量中的子属性:

中括号:

  1. {{ ansible_ens3["ipv4"]["address"] }}

点号:

  1. {{ ansible_ens3.ipv4.address }}

关闭facts

在Playbook中,如果写gather_facts来控制是否收集远程系统的信息.如果不收集系统信息,那么上面的变量就不能在该playybook中使用了.

  1. - hosts: whatever
  2. gather_facts: no