【自动化运维神器Ansible】playbook setup模块深度解析:自动收集系统信息与变量应用
目录
引言
1 Setup模块基础工作原理
1.1 自动调用机制
1.2 Setup模块配置
2 Setup模块收集的核心变量体系
2.1 变量分类与结构
2.1.1 系统基本信息
2.1.2 硬件信息
2.1.3 网络信息
2.1.4 软件信息
2.2 变量组织结构
3 在Playbook中使用Facts变量
3.1 基本调用示例
3.2 条件任务中的Facts应用
3.3 模板中的Facts应用
4 Setup模块高级用法
4.1 Facts过滤与处理
4.2 自定义Facts
4.3 Facts缓存机制
4.4 动态Facts
5 优化建议
5.1 Facts收集优化
5.2 Facts安全考虑
5.3 Facts文档化
6 总结
引言
在Ansible自动化运维体系中,Setup模块扮演着"系统侦探"的角色,它自动收集目标主机的硬件、操作系统、网络、软件等详细信息,并将这些信息以变量的形式提供给Playbook使用。作为Ansible的内置模块,Setup模块会在每个Playbook执行时自动运行,无需手动调用,是实现动态配置和智能部署的基础。
1 Setup模块基础工作原理
1.1 自动调用机制
特点:
- 无需手动调用,在每个Playbook执行时自动运行
- 在gather_facts: yes时默认执行(默认为yes)
- 可以通过gather_facts: no禁用以提升执行速度
- 执行流程:

- Ansible Controller连接到目标主机
- 检查Playbook中gather_facts的设置
- 若为yes,则执行setup模块收集系统信息
- 将收集的信息转换为JSON格式
- 存储在hostvars变量中
- 在Playbook的后续任务中可以直接调用
1.2 Setup模块配置
- 禁用facts收集:
---
- hosts: webserversgather_facts: no # 禁用facts收集tasks:- name: 仅执行特定任务debug: msg="Facts已禁用"
- 手动收集facts:
---
- hosts: webserversgather_facts: notasks:- name: 手动收集factssetup:
2 Setup模块收集的核心变量体系
2.1 变量分类与结构
2.1.1 系统基本信息
ansible_hostname # 主机名
ansible_fqdn # 完全限定域名
ansible_os_family # 操作系统家族(如RedHat、Debian)
ansible_distribution # 发行版名称(如CentOS、Ubuntu)
ansible_distribution_version # 发行版版本
ansible_machine # 机器架构(如x86_64、i386)
ansible_system # 系统类型(如Linux、Darwin)
ansible_kernel # 内核版本
2.1.2 硬件信息
ansible_processor_vcpus # CPU逻辑核心数
ansible_processor_cores # CPU物理核心数
ansible_processor # CPU型号列表
ansible_memtotal_mb # 总内存(MB)
ansible_memfree_mb # 空闲内存(MB)
ansible_swapfree_mb # 交换区空闲空间(MB)
ansible_devices # 磁盘设备信息
ansible_mounts # 挂载点信息
2.1.3 网络信息
ansible_default_ipv4.address # 默认IPv4地址
ansible_default_ipv4.gateway # 默认网关
ansible_default_ipv4.network # 网络地址
ansible_default_ipv4.netmask # 子网掩码
ansible_interfaces # 网络接口列表
ansible_eth0 # 特定接口信息(如eth0)
ansible_dns # DNS服务器信息
2.1.4 软件信息
ansible_pkg_mgr # 包管理器类型(yum、apt等)
ansible_python_version # Python版本
ansible_user_id # 当前用户ID
ansible_user_uid # 当前用户UID
ansible_user_gid # 当前用户GID
ansible_user_shell # 当前用户shell
2.2 变量组织结构

3 在Playbook中使用Facts变量
3.1 基本调用示例
---
- hosts: webserversgather_facts: yestasks:- name: 显示主机基本信息debug: msg: - "主机名: {{ ansible_hostname }}"- "操作系统: {{ ansible_distribution }} {{ ansible_distribution_version }}"- "内核版本: {{ ansible_kernel }}"- "CPU核心数: {{ ansible_processor_vcpus }}"- "总内存: {{ ansible_memtotal_mb }}MB"- name: 显示网络信息debug: msg: - "默认IP: {{ ansible_default_ipv4.address }}"- "网关: {{ ansible_default_ipv4.gateway }}"- "网络接口: {{ ansible_interfaces | join(', ') }}"
3.2 条件任务中的Facts应用
---
- hosts: alltasks:- name: 为RedHat系系统安装软件yum: name: "{{ item }}" state=presentloop:- epel-release- htopwhen: ansible_os_family == "RedHat"- name: 为Debian系系统安装软件apt: name: "{{ item }}" state=presentloop:- apt-transport-https- htopwhen: ansible_os_family == "Debian"- name: 配置系统参数(内存大于4GB)sysctl: name: vm.swappinessvalue: 10sysctl_set: yeswhen: ansible_memtotal_mb > 4096
3.3 模板中的Facts应用
- 模板示例(nginx.conf.j2):
user {{ ansible_user_id }};
worker_processes {{ ansible_processor_vcpus }};
error_log /var/log/nginx/error.log;
pid /var/run/nginx.pid;events {worker_connections 1024;
}http {log_format main '$remote_addr - $remote_user [$time_local] "$request" ''$status $body_bytes_sent "$http_referer" ''"$http_user_agent" "$http_x_forwarded_for"';access_log /var/log/nginx/access.log main;server {listen 80;server_name {{ ansible_fqdn }};location / {root /usr/share/nginx/html;index index.html;}}
}
- 调用模板的任务:
- name: 部署Nginx配置template: src: nginx.conf.j2 dest: /etc/nginx/nginx.conf
4 Setup模块高级用法
4.1 Facts过滤与处理
- 使用过滤器处理facts:
- name: 显示格式化的系统信息debug: msg: - "主机名(大写): {{ ansible_hostname | upper }}"- "操作系统(小写): {{ ansible_distribution | lower }}"- "内存(GB): {{ ansible_memtotal_mb / 1024 | round(2) }}"- "CPU型号: {{ ansible_processor | first }}"
- 过滤特定接口信息:
- name: 显示活跃网络接口debug: msg: "接口 {{ item }}: {{ ansible_eth0.ipv4.address }}"loop: "{{ ansible_interfaces }}"when: ansible_eth0 is defined and ansible_eth0.ipv4.address is defined
4.2 自定义Facts
- 创建自定义facts文件:
# 在目标主机上创建
sudo mkdir -p /etc/ansible/facts.d
sudo cat <<EOF > /etc/ansible/facts.d/app.fact
{"app_version": "1.2.3","app_env": "production","app_nodes": 3
}
EOF
- 在Playbook中调用自定义facts:
- name: 显示自定义factsdebug: msg: - "应用版本: {{ ansible_local.app.app_version }}"- "运行环境: {{ ansible_local.app.app_env }}"- "节点数量: {{ ansible_local.app.app_nodes }}"
4.3 Facts缓存机制
- 启用facts缓存:
---
- hosts: webserversgather_facts: yesfact_path: /etc/ansible/facts.d # 指定facts缓存路径tasks:- name: 使用缓存的factsdebug: msg="使用缓存中的facts"
缓存的优势:
- 减少重复收集facts的时间
- 在离线环境中使用已收集的facts
- 提高Playbook执行效率
4.4 动态Facts
- 使用动态facts源:
---
- hosts: webserverstasks:- name: 从API获取动态factsuri: url: "https://api.example.com/facts/{{ inventory_hostname }}"method: GETregister: api_facts- name: 使用动态factsdebug: msg: "动态信息: {{ api_facts.json }}"
5 优化建议
5.1 Facts收集优化
- 选择性收集facts:
- hosts: webserversgather_subset:- "network"- "virtual"tasks:- name: 仅使用网络和虚拟化factsdebug: msg="IP: {{ ansible_default_ipv4.address }}"
- 禁用不必要的facts:
- hosts: webserversgather_timeout: 10 # 设置facts收集超时时间tasks:- name: 快速执行任务debug: msg="快速任务"
5.2 Facts安全考虑
- 敏感信息处理:
- 避免在facts中存储敏感信息
- 使用Ansible Vault加密敏感变量
- 在Playbook中过滤敏感facts
- facts验证:
- name: 验证关键facts存在assert: that:- ansible_fqdn is defined- ansible_default_ipv4.address is defined- ansible_memtotal_mb is defined
5.3 Facts文档化
- 创建facts字典:
- name: 创建系统信息文档copy: content: |主机信息:主机名: {{ ansible_hostname }}FQDN: {{ ansible_fqdn }}系统信息:发行版: {{ ansible_distribution }} {{ ansible_distribution_version }}内核: {{ ansible_kernel }}硬件信息:CPU: {{ ansible_processor_vcpus }}核心内存: {{ ansible_memtotal_mb }}MBdest: /tmp/system_info.txt
6 总结
Setup模块是Ansible实现自动化运维的基石,掌握其使用方法能够显著提升自动化部署的智能化水平和可靠性。在实际应用中,应充分结合业务需求,合理利用收集的系统信息,构建环境感知的自动化部署体系。