Ansible如何针对Windows/Unix系统选择对应版本的模块?
Ansible如何根据目标系统选择对应模块?
Ansible Core为Unix类系统提供了setup.py模块,负责事实收集工作;Ansible Windows则为Windows系统提供了setup.ps1模块,行为上与前者一致。当执行如下任务时:
- name: Setup setup:
Ansible能够自动识别目标系统并运行对应的模块版本,背后的逻辑主要基于以下几点:
1. 连接插件与系统类型的匹配
Ansible会通过目标主机的连接插件类型(ansible_connection变量)快速判断系统类型:
- 若使用
ssh连接(默认的Unix类系统连接方式),会优先寻找.py后缀的模块文件; - 若使用
winrm连接(Windows系统专属连接方式),则自动匹配.ps1后缀的模块文件。
2. 集合的平台过滤机制
Ansible的集合(Collection)体系内置了平台过滤规则:
- 官方的
ansible.windows集合专门存放Windows相关模块,当目标主机为Windows时,Ansible会优先从该集合中查找模块; - 核心模块(如Unix版本的
setup.py)属于ansible.builtin集合,仅对非Windows目标生效。
3. 模块元数据的平台声明
模块本身的元数据(DOCUMENTATION字段)会明确标注支持的平台,Ansible会根据这些信息过滤掉不兼容的模块版本。比如:
- Unix模块的元数据中会指定
platforms: ['Linux', 'BSD', 'macOS']; - Windows模块则会标注
platforms: ['Windows']。
自定义模块的问题解决
你遇到的Unix系统上调用.ps1模块的问题,通常是因为模块的存放路径或元数据配置不符合规范,可通过以下方式修复:
- 按平台分类存放模块:Unix模块(
.py)放在自定义集合的modules目录,Windows模块(.ps1)放在专属的Windows子集合或对应Windows集合的目录; - 在模块的
DOCUMENTATION中明确platforms字段,指定支持的操作系统; - 避免在同一集合下存放同名的跨平台模块,若必须共存,需通过集合的
plugin_filter配置指定不同平台的模块优先级。
内容的提问来源于stack exchange,提问作者ben brunyee
相关产品推荐
相关产品推荐

