facts变量是Ansible用于采集被控端硬件、系统、服务、资源信息等的一个功能,Playbook执行时第一步就是facts采集信息。
查询facts变量
## 查看web主机所有facts变量(太多,就不展示了) [root@Ansible project]# ansible web -m setup ## 用filter查看指定信息 [root@Ansible project]# ansible web -m setup -a 'filter=*eth0*' web1 | SUCCESS => { "ansible_facts": { "ansible_eth0": { "active": true, "device": "eth0", "features": { "busy_poll": "off [fixed]", "fcoe_mtu": "off [fixed]", "generic_receive_offload": "on", "generic_segmentation_offload": "on", "highdma": "off [fixed]", "hw_tc_offload": "off [fixed]", "l2_fwd_offload": "off [fixed]", "large_receive_offload": "off [fixed]", "loopback": "off [fixed]", "netns_local": "off [fixed]", "ntuple_filters": "off [fixed]", "receive_hashing": "off [fixed]", "rx_all": "off", "rx_checksumming": "off", "rx_fcs": "off", "rx_udp_tunnel_port_offload": "off [fixed]", "rx_vlan_filter": "on [fixed]", "rx_vlan_offload": "on", "rx_vlan_stag_filter": "off [fixed]", "rx_vlan_stag_hw_parse": "off [fixed]", "scatter_gather": "on", "tcp_segmentation_offload": "on", "tx_checksum_fcoe_crc": "off [fixed]", "tx_checksum_ip_generic": "on", "tx_checksum_ipv4": "off [fixed]", "tx_checksum_ipv6": "off [fixed]", "tx_checksum_sctp": "off [fixed]", "tx_checksumming": "on", "tx_fcoe_segmentation": "off [fixed]", "tx_gre_csum_segmentation": "off [fixed]", "tx_gre_segmentation": "off [fixed]", "tx_gso_partial": "off [fixed]", "tx_gso_robust": "off [fixed]", "tx_ipip_segmentation": "off [fixed]", "tx_lockless": "off [fixed]", "tx_nocache_copy": "off", "tx_scatter_gather": "on", "tx_scatter_gather_fraglist": "off [fixed]", "tx_sctp_segmentation": "off [fixed]", "tx_sit_segmentation": "off [fixed]", "tx_tcp6_segmentation": "off [fixed]", "tx_tcp_ecn_segmentation": "off [fixed]", "tx_tcp_mangleid_segmentation": "off", "tx_tcp_segmentation": "on", "tx_udp_tnl_csum_segmentation": "off [fixed]", "tx_udp_tnl_segmentation": "off [fixed]", "tx_vlan_offload": "on [fixed]", "tx_vlan_stag_hw_insert": "off [fixed]", "udp_fragmentation_offload": "off [fixed]", "vlan_challenged": "off [fixed]" }, "hw_timestamp_filters": [], "ipv4": { "address": "192.168.1.2", "broadcast": "192.168.1.255", "netmask": "255.255.255.0", "network": "192.168.1.0" }, "ipv6": [ { "address": "fe80::61a2:3896:f282:44e4", "prefix": "64", "scope": "link" } ], "macaddress": "00:0c:29:98:a3:d9", "module": "e1000", "mtu": 1500, "pciid": "0000:02:01.0", "promisc": false, "speed": 1000, "timestamping": [ "tx_software", "rx_software", "software" ], "type": "ether" } }, "changed": false }
使用和关闭facts变量
可以在Playbook直接使用这些facts变量
## 受控端的系统 '{{ ansible_distribution }}' ## 受控端eth0的ip '{{ ansible_eth0.ipv4.address }}' ## 受控端主机名 '{{ ansible_hostname }}' ## 受控端内存大小 '{{ ansible_memtotal_mb }}'
Playbook剧本每次执行facts采集都变量,这会耗费资源和时间。主机少的时候影响不大,当主机多的会严重耗费性能。所以不需要的时候可以关闭
- hosts: web gather_facts: no ## 关闭facts变量
受控端自定义facts变量
## 受控端创建目录 [root@web ~]# mkdir /etc/ansible/facts.d/ -p ## 目录里创建文件后缀为.fact [root@web ~]# vim /etc/ansible/facts.d/username.fact [user] name_one=dasha name_two=ersha ## 在控制端查看自定义facts变量 [root@Ansible project]# ansible web -m setup -a "filter=ansible_local" web1 | SUCCESS => { "ansible_facts": { "ansible_local": { "username": { "user": { "name_one": "dasha", "name_two": "ersha" } } } }, "changed": false } ## 调用这些变量 '{{ ansible_local.username.user.name_one }}' '{{ ansible_local.username.user.name_two }}'