Ansible facts详解

Ansible是一个系列文章,我会尽量以通俗易懂、诙谐幽默的总结方式给大家呈现这些枯燥的知识点,让学习变的有趣一些。
Ansible系列博文直达链接:Ansible入门系列

前言

如果你跟着前面的文章在自己的测试环境进行了操作的话,你会发现在Ansible执行完成后,在输出内容中都包含以下这么一项:

TASK [Gathering Facts] ****************************************
ok: [192.168.1.3]

从内容来看,这是执行了一个名为Gathering Facts的TASK,但是即使在我们的命令中或者YAML中没有定义这个TASK,也会执行这个任务,这是什么道理?下面我就带着大家对Ansible中的facts一探究竟。

Ansible facts简介

大家肯定疑问,这个facts是个啥?

facts组件是Ansible用于采集被管理机器设备信息的一个功能,采集的机器设备信息主要包含IP地址,操作系统,以太网设备,mac 地址,时间/日期相关数据,硬件信息等。

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

所以,在一些业务场景中,facts对我们是很有帮助的,省去了我们好多工作,大大提高了工作效率。

Ansible facts用法

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

ansible server1 -m setup

由于输出内容实在太多,这里只贴出部分内容:

192.168.1.3 | SUCCESS => {
    "ansible_facts": {
        "ansible_all_ipv4_addresses": [
            "192.168.1.3"
        ],
        "ansible_all_ipv6_addresses": [
            "2409:8a10:72:1c10:c59e:af39:7c72:6afb",
            "fe80::7107:62de:8cf8:db00"
        ],
        "ansible_apparmor": {
            "status": "disabled"
        },
        "ansible_architecture": "x86_64",
        "ansible_bios_date": "12/01/2006",
        "ansible_bios_version": "VirtualBox",
        "ansible_cmdline": {
            "BOOT_IMAGE": "/vmlinuz-3.10.0-957.el7.x86_64",
            "LANG": "en_US.UTF-8",
            "crashkernel": "auto",
            "quiet": true,
            "rd.lvm.lv": "centos/swap",
            "rhgb": true,
            "ro": true,
            "root": "/dev/mapper/centos-root"
        },
......

由于输出的内容实在是太多了,我们可以使用filter参数来查看指定的信息,比如这样:

ansible server1 -m setup -a 'filter=ansible_all_ipv4_addresses'

输出内容如下:

192.168.1.3 | SUCCESS => {
    "ansible_facts": {
        "ansible_all_ipv4_addresses": [
            "192.168.1.3"
        ]
    },
    "changed": false
}

到这里,话又说回来!我们没有配置Gathering Facts的TASK,但是依然自动的就执行了这个任务,这个默认是在哪里配置的呢?

Ansible facts配置

在Ansible的配置文件中,关于facts的重要配置项有以下几个:

  • gathering:facts的开关,默认是开启的;有以下三个取值:

    • smart:开启facts信息收集,但是会优先使用facts缓存信息,可以使用gather_facts: False禁用facts收集;
    • implicit:开启facts信息收集,要禁止收集,必须使用gather_facts: False
    • explicit:关闭facts信息收集,要显式收集,必须使用gather_facts: Ture
  • fact_caching:缓存facts信息的方式;可以配置成jsonfile或者redis

  • fact_caching_connection:缓存插件的配置,针对不同的fact_caching方式,取值含义则不同:

    • 如果fact_cachingjsonfile,则此处应配置存储缓存文件的目录;
    • 如果fact_cachingredis,则此处应按照host:port:database的格式配置redis的信息。
  • gather_timeout:收集超时时间,默认为86400;

  • fact_caching_timeout:设置facts缓存的过期时间,默认是86400秒。

总结

这篇文章对Ansible facts进行了一些简单的总结,在后面的文章中,还会涉及到facts的一些内容,希望通过这篇文章,大家能明白Ansible facts的一些简单用法和配置即可!希望对大家有帮助!

果冻想,认真玩技术的地方。

2019年10月5日,于内蒙古呼和浩特。

在这里插入图片描述

<think>我们正在讨论Ansible的架构和工作原理。根据引用内容,Ansible是一个自动化工具,用于配置管理、应用部署等。它基于模块工作,并且可以批量处理主机。首先,我们需要理解Ansible的架构。Ansible的架构主要由以下几个核心组件构成:1.控制节点(ControlNode):运行Ansible命令的机器,通常是管理员的机器。控制节点上需要安装Ansible。2.被管理节点(ManagedNode):被Ansible管理的机器,也称为主机(Host)。这些节点不需要安装Ansible,但需要支持SSH(或Windows下的PowerShell)并且有Python环境(Windows节点可以是PowerShell)。3.清单(Inventory):一个文件(通常是INI或YAML格式),用于定义被管理的主机和组。清单可以指定主机变量和组变量。4.模块(Modules):Ansible执行任务的基本单位。每个模块执行一个特定的任务,例如复制文件、安装软件包等。Ansible有大量内置模块,也支持自定义模块。5.任务(Task):Ansible中执行的一个操作,通常调用一个模块。多个任务组成一个剧本。6.剧本(Playbook):一个YAML文件,定义一系列任务和执行这些任务的主机。剧本可以包含变量、条件、循环等。7.插件(Plugins):用于扩展Ansible的功能。包括连接插件(用于连接被管理节点)、过滤器插件(用于模板中的变量处理)、回调插件(用于输出结果)等。工作原理:1.用户编写Playbook或直接使用Ad-Hoc命令(即单条命令,用于快速执行任务)。2.Ansible读取Inventory文件,确定要操作的主机。3.Ansible通过SSH协议(或其他连接方式)连接到被管理节点。注意,Ansible使用“无代理”架构,即被管理节点上不需要运行任何代理程序,而是通过SSH直接执行命令。4.在目标主机上,Ansible将模块(通常是Python脚本)传输到该主机上执行,并返回结果。执行完成后,临时文件会被清除。5.控制节点收集执行结果,并根据需要输出。这种无代理架构使得Ansible易于部署和管理,但也要求控制节点能够通过SSH连接到被管理节点,并且被管理节点上有Python环境(对于Linux/Unix系统)。关于Ansible的工作流程,可以总结为以下步骤:-解析命令或剧本:用户执行ansibleansible-playbook命令。-加载清单:确定目标主机。-生成任务列表:根据剧本或命令生成需要执行的任务。-按顺序执行任务:在目标主机上执行任务(通过SSH连接并执行模块)。-收集结果并报告。此外,Ansible还支持一些高级特性,如:-变量和事实(Facts):变量可以在多个地方定义(如清单、剧本、变量文件等);事实是目标主机的系统信息(如IP地址、操作系统等),由Ansible自动收集。-模板(Templates):使用Jinja2模板引擎,可以生成动态配置文件。-角色(Roles):一种组织剧本和文件的机制,便于复用。引用[1]提到了Ansible的七个指令,其中常用的有:-`ansible`:用于执行Ad-Hoc命令。-`ansible-playbook`:用于执行剧本。-`ansible-doc`:查看模块文档。引用[2]强调了Ansible的批量处理和基于模块工作的特性。综上所述,Ansible的架构设计使其成为一个强大而灵活的自动化工具,尤其适合大规模的环境配置和管理。现在,根据要求,我们需要在回答中自然地添加引用标识,并在最后生成相关问题。注意:引用[1]和引用[2]是用户提供的,我们已经在回答中引用了它们,因此在末尾添加引用标识[^1]和[^2]。</think>### Ansible 架构详解及工作原理 #### **一、核心架构组件** 1. **控制节点(Control Node)** - 运行 Ansible 命令的主机(需安装 Ansible) - 负责管理清单(Inventory)、剧本(Playbook)和模块(Modules) - 通过 SSH(Linux)或 WinRM(Windows)连接被管理节点[^1][^2] 2. **被管理节点(Managed Nodes)** - 无需安装 Ansible 代理(Agentless 架构) - 仅需支持 SSH/Python(Linux)或 PowerShell(Windows)环境 - 通过临时脚本接收并执行任务[^1] 3. **清单(Inventory)** - 定义目标主机的配置文件(INI/YAML 格式) - 支持主机分组和变量定义,例如: ```ini [webservers] web1 ansible_host=192.168.1.10 web2 ansible_host=192.168.1.11 ``` 4. **模块(Modules)** - 任务执行的最小单元(如 `copy`, `yum`, `service`) - 执行后自动删除临时脚本(幂等性设计) - 内置 3000+ 模块,支持自定义开发[^2] 5. **剧本(Playbook)** - YAML 格式的自动化流程定义 - 包含任务序列、变量和策略,例如: ```yaml - name: 部署 Web 服务 hosts: webservers tasks: - name: 安装 Nginx apt: name=nginx state=present ``` #### **二、工作原理流程** 1. **任务解析** - 用户执行 `ansible-playbook` 或 Ad-Hoc 命令(如 `ansible -m ping`) - 控制节点解析 Playbook 和 Inventory 2. **连接建立** - 通过 SSH/WinRM 建立到目标主机的连接 - 推送执行所需的 Python 模块(临时脚本)[^2] 3. **任务执行** - 在目标主机上运行模块代码 - 模块执行结果返回 JSON 格式数据 4. **结果处理** - 控制节点收集并解析返回数据 - 根据策略决定后续流程(如错误处理) 5. **资源清理** - 自动删除目标主机上的临时脚本 - 释放连接资源 #### **三、核心特性优势** 1. **无代理架构(Agentless)** - 无需在被管理节点安装客户端 - 降低维护成本,避免代理版本兼容问题[^1] 2. **幂等性设计** - 多次执行同一任务结果不变 - 例如重复运行 `file: state=absent` 仅第一次生效 3. **推送式执行(Push-based)** - 由控制节点主动发起任务 - 区别于 Puppet/Chef 的拉取模式 4. **声明式语法** - 通过 YAML 描述期望状态(而非具体步骤) - 例如 `package: name=httpd state=latest` > **关键技术点**:Ansible 通过模块化设计实现解耦,实际功能由模块在目标节点执行,控制节点仅协调流程[^2]。这种架构使其在大规模环境中保持高效,例如同时管理上千台服务器[^1]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值