Ansible Facts要这样玩才让人心服

Ansible体系文章,IT民工金鱼哥希望能以通俗易懂、诙谐幽默的方式给大家呈现这些枯燥的知识点,让繁重的学习变的有趣一些。

1. 前言描述

在Ansible执行时,默认总有一个任务会先运行,那就是Gathering Fact:

TASK [Gathering Facts] ****************************************
ok: [192.168.xxx.xxx] 

从输出内容来看,这是执行了一个名为Gathering Facts的TASK,但其实我们并没有在命令中或者剧本中定义这个任务,这个是Ansible设计的初衷,默认情况自动执行。

2. Ansible Facts简介

Ansible Facts(事实)是Ansible在受管主机上自动检测到的变量。而Facts组件是Ansible用于采集被管理机器设备信息的一个功能,采集的机器设备信息主要包含IP地址,操作系统,以太网设备,mac 地址,时间/日期相关数据,硬件信息等。

那么,采集这些信息有什么用呢?有的时候我们需要根据远程主机的信息作为执行条件操作,例如,根据远程服务器使用的操作系统版本,可以安装不同版本的软件包;或者也可以显示与每台远程计算机相关的一些信息,例如每台设备上有多少RAM可用。

所以在一些业务场景中, Ansible Facts对我们使用是很有帮助的,直接调用以大大提高了工作效率。

22

3. Ansible facts示例

可以使用setup模块获取被管理机器的所有facts信息,可以使用filter来查看指定的信息。setup模块获取的整个facts信息被包装在一个JSON格式的数据结构中,ansible_facts是最外层的值。我们可以通过以下Ansible Ad-Hoc命令查看facts信息:

[root@servera ~]# ansible localhost -m setup
localhost | SUCCESS => { "ansible_facts": { "ansible_all_ipv4_addresses": [ "192.168.159.111" ], "ansible_all_ipv6_addresses": [ "fe80::2a9:fbb5:c93:84f8" ], "ansible_apparmor": { "status": "disabled" }, "ansible_architecture": "x86_64", "ansible_bios_date": "07/29/2019", "ansible_bios_version": "6.00", "ansible_cmdline": { ............ 

4. 过滤Facts变量

收集到的事实太多而不方便查找的时候,我们可以进行过滤刷选想要的信息:

ansible localhost -m setup -a 'filter=ansible_fqdn'

5. 新旧语法对比

前面也提及到,Ansible Facts是Ansible在受管主机上自动检测到的变量,所以当需要调用这些变量的值,就涉及到如何书写的问题,在2.5版本前,是以下表旧的形式来进行调用,虽然官方建议使用新的形式进行编写,但其实两种形式写法都可以(官方未提及是否颓弃旧的写法)。

ANSIBLE_FACTS 形式 旧事实变量
ansible_facts['hostname'] ansible_hostname
ansible_facts['fqdn'] ansible_fqdn
ansible_facts['default_ipv4']\['address'] ansible_default_ipv4['address']
ansible_facts['interfaces'] ansible_interfaces
ansible_facts['devices']\['vda']\['partitions]\['size'] ansible_devices['vda']\['partitions]\['size']
ansible_facts['dns']\['nameservers'] ansible_dns['nameservers']
ansible_facts['kernel'] ansible_kernel

如果变量的值为散列/字典,则可使用两种语法来检索该值。从上表中举两个例子:

ansible_facts['default_ipv4']['address'] 可以写成 ansible_facts.default_ipv4.address ansible_facts['dns']['nameservers'] 可以写成 ansible_facts.dns.nameservers 

6. 关闭Facts收集

收集托管主机上的 Facts 比较耗费时间,所以可以在不需要的时候关闭 setup 模块。

关闭facts收集以后,playbook启动的时间会变快

- hosts: dev
  gather_facts: no
  tasks:	
  - debug:
     msg: "closeed facts"

7. 魔法变量

有些特殊变量,名为:魔法变量(magic variables)

官网地址:https://docs.ansible.com/ansible/latest/user_guide/playbooks_vars_facts.html#information-about-ansible-magic-variables

常见魔法变量:

  • hostvars

包含受管主机的变量,可以用于获取某台受管主机的变量的值。如果有一台web服务器的配置文件中需要指定db服务器的ip地址,我们假定这台db服务器的hostname为 db.example.com ,ip地址绑定在eth0网卡上,我们可以通过如下方法在web服务器上调用db服务器的ip地址:

{{ hostvars['db.example.com'].ansible_eth0.ipv4.address }} 
  • group_names

列出当前受管主机所属的所有组 (用于标识当前正在执行task的目标主机位于的组) 。

  • groups

列出清单中的所有组和主机。

  • inventory_hostname

列出inventory主机清单文件中的主机名称。

其余魔法变量:

77


一眼看上去,完全不明所以,还是通过练习来辅助理解才行:

[student@servera example]$ cat hosts
servera
serverb
serverc
serverd

[dev] serverb [test] serverc [pro] serverd [student@servera example]$ cat ansible.cfg [defaults] inventory = hosts 
[student@servera example]$ cat magic.yml 
---
- name: magic vars
  hosts: serverc
  gather_facts: no
  tasks:
    - name: show magic fact inventory_hostname
      debug:
        var: inventory_hostname
# 调用魔法变量inventory_hostname,演示主机清单文件中的主机名称。

    - name: show magic fact groups
      debug:
#        var: groups.test
        var: groups.dev
# 调用魔法变量groups,此处还为散列字典,对应清单中所属的主机组。

    - name: show magic fact group_names
      debug:
        var: group_names
# 调用魔法变量group_names,列出当前受管主机所属的所有组 。

    - name: show magic fact hostvars
      debug:
        var: hostvars.serverb.ansible_forks
# 调用魔法变量hostvars,也为散列字典,需要编写对应主机的相关变量信息。
[student@servera example]$ ansible-playbook magic.yml 

PLAY [magic vars] ***********************************************************************

TASK [show magic fact inventory_hostname] *********************************************** ok: [serverc] => { "inventory_hostname": "serverc" } TASK [show magic fact groups] *********************************************************** ok: [serverc] => { "groups.dev": [ "serverb" ] } TASK [show magic fact group_names] ****************************************************** ok: [serverc] => { "group_names": [ "test" ] } TASK [show magic fact hostvars] ********************************************************* ok: [serverc] => { "hostvars.serverb.ansible_forks": "5" } PLAY RECAP ***************************************************************************************** serverc : ok=4 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 

通过上面输出应该比较清晰的了解到魔法变量究竟是怎样的,在日后的使用中,若忘记,也可以直接编写debug模块来进行测试输出。有时候学习需要运用各种方式来辅助自己。

image-20211208170619717

💡总结

  • 理解Ansible Facts的概念和使用场景。
  • 常运用filter选项进行Facts输出的刷选。
  • 新旧语法的对比与运用。
  • 不需要收集事实时,进行关闭。
  • 特殊变量:魔法变量。理解和运用常用的魔法变量。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区),文章链接:https://bbs.huaweicloud.com/blogs/345403

ansible官方文档说明参考:https://docs.ansible.com/ansible/latest/user_guide/playbooks_vars_facts.html#package-requirements-for-fact-gathering

原文地址:http://www.cnblogs.com/sword0077/p/16838102.html

1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长! 2. 分享目的仅供大家学习和交流,请务用于商业用途! 3. 如果你也有好源码或者教程,可以到用户中心发布,分享有积分奖励和额外收入! 4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解! 5. 如有链接无法下载、失效或广告,请联系管理员处理! 6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需! 7. 如遇到加密压缩包,默认解压密码为"gltf",如遇到无法解压的请联系管理员! 8. 因为资源和程序源码均为可复制品,所以不支持任何理由的退款兑现,请斟酌后支付下载 声明:如果标题没有注明"已测试"或者"测试可用"等字样的资源源码均未经过站长测试.特别注意没有标注的源码不保证任何可用性