如何配置Ansible实现Linux用become、Windows禁用become调用puppet-agent角色
问题说明
现有用于部署puppet-agent的基础Playbook代码如下:
--- - hosts: all become: yes roles: - puppet-agent
该配置在Linux环境下运行正常,但批量执行覆盖Windows目标主机时,会触发执行报错:
fatal: [winhost]: FAILED! => {"msg": "The powershell shell family is incompatible with the sudo become plugin"}
这个报错的核心原因是原配置一刀切给所有主机开了sudo类型的提权,而Windows主机默认用PowerShell shell执行任务,根本不兼容sudo提权插件,流程还没走到实际部署步骤就会直接中断。需要调整配置实现跨系统兼容:Linux主机执行时正常开启提权,Windows主机跳过该提权步骤,不影响两边的部署流程。
适配实现方案
方案1:基于系统内置fact的动态判断(零维护成本)
最省事的实现方式是利用Ansible自动收集的目标主机系统标识ansible_system做条件判断,替代硬编码的全局become配置,修改后的Playbook代码如下:
--- - hosts: all # 仅对Linux系统开启become提权,Windows系统自动关闭 become: "{{ ansible_system == 'Linux' }}" roles: - puppet-agent
执行逻辑非常直观:
- 目标为Linux主机时,判断表达式返回
True,自动启用sudo提权,和原配置的执行效果完全一致 - 目标为Windows主机时,判断表达式返回
False,直接跳过不兼容的sudo提权流程,从根源上消除报错
方案2:基于主机组的变量配置(高灵活性)
如果需要对不同主机的提权逻辑做更精细化的控制,可以在inventory中按系统类型划分主机组,通过组变量单独配置提权规则:
- inventory配置示例
[linux_servers] linux1 ansible_host=192.168.1.10 linux2 ansible_host=192.168.1.11 [windows_servers] win1 ansible_host=192.168.1.20 win2 ansible_host=192.168.1.21 - 对应组变量配置
- 在
group_vars/linux_servers.yml中配置become: yes - 在
group_vars/windows_servers.yml中配置become: no
- 在
- Playbook直接移除全局硬编码的become配置即可:
--- - hosts: all roles: - puppet-agent
注意事项
- 不要直接全局将
become设为no,否则Linux主机执行安装puppet-agent这类需要系统级权限的任务时,会因权限不足报错 - 不要逐台给Windows主机单独加
become: no的配置,后续新增Windows主机时容易遗漏,反而增加维护成本 - 如果后续Windows主机需要用到系统级权限,可以单独为Windows目标指定兼容的become插件(如
runas),不需要调整Linux侧的提权配置
内容的提问来源于stack exchange,提问作者sfgroups
相关产品推荐
相关产品推荐

