金鱼哥说Ansible:第四章 管理变量和事实----管理事实和魔法变量

举报
金鱼哥 发表于 2022/04/09 14:08:17 2022/04/09
【摘要】 Ansible Facts要这样玩才让人心服

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输出的刷选。
  • 新旧语法的对比与运用。
  • 不需要收集事实时,进行关闭。
  • 特殊变量:魔法变量。理解和运用常用的魔法变量。

以上就是【金鱼哥】对 第四章 管理变量和事实----管理事实和魔法变量 的简述和讲解。希望能对看到此文章的小伙伴有所帮助。

如果这篇【文章】有帮助到你,希望可以给【金鱼哥】点个赞👍,创作不易,相比官方的陈述,我更喜欢用【通俗易懂】的文笔去讲解每一个知识点,如果有对【运维技术】感兴趣,也欢迎关注❤️❤️❤️ 【金鱼哥】❤️❤️❤️,我将会给你带来巨大的【收获与惊喜】💕💕!

image-20211208170750632

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。