能否简化Ansible microsoft.ad模块配置,无需指定domain_username和domain_password?
解决Microsoft.AD模块自动复用Ansible连接凭据的方案
核心思路
既然无法使用委托或CredSSP,也不能在域控制器上执行Playbook,我们可以通过模块默认参数绑定的方式,让microsoft.ad.group和microsoft.ad.ou自动复用Ansible连接目标主机时使用的ansible_user和ansible_password,无需手动重复指定凭据参数。
方法1:在Playbook内设置模块默认值
直接在Playbook开头定义模块的默认参数,将连接凭据映射到模块的域凭据参数上:
- name: 管理AD组与OU hosts: 非域控制器主机组 # 根据环境配置WinRM传输方式,示例为Kerberos vars: ansible_winrm_transport: kerberos # 绑定模块默认参数,自动复用连接凭据 module_defaults: microsoft.ad.group: domain_username: "{{ ansible_user }}" domain_password: "{{ ansible_password }}" microsoft.ad.ou: domain_username: "{{ ansible_user }}" domain_password: "{{ ansible_password }}" tasks: - name: 创建测试AD组 microsoft.ad.group: name: Test_Engineering_Group state: present description: 测试工程组 # 无需手动指定domain_username和domain_password - name: 创建测试OU microsoft.ad.ou: name: Test_OU path: "DC=corp,DC=com" state: present # 同样无需重复指定凭据参数
方法2:全局配置(所有Playbook生效)
如果所有涉及AD模块的Playbook都需要复用连接凭据,可以在ansible.cfg中配置全局模块默认值:
打开ansible.cfg,在[defaults]段添加以下内容:
module_defaults = microsoft.ad.group: domain_username = {{ ansible_user }} domain_password = {{ ansible_password }} microsoft.ad.ou: domain_username = {{ ansible_user }} domain_password = {{ ansible_password }}
关键注意事项
- 凭据格式要求:
ansible_user必须是有效的域账号格式,比如CORP\john_doe或john_doe@corp.com,且该账号拥有管理AD组/OU的权限。 - 密码安全:
ansible_password建议用Ansible Vault加密存储,避免明文泄露,示例命令:ansible-vault encrypt_string 'your_domain_password' --name 'ansible_password' - 目标主机要求:执行Playbook的非DC主机必须能正常解析域控制器的DNS,且网络上可访问AD的LDAP(389)或LDAPS(636)端口。
- 传输方式验证:确保WinRM连接使用的传输方式(如Kerberos)能正常验证
ansible_user的域身份,避免认证失败。
内容的提问来源于stack exchange,提问作者Abu Belal
相关产品推荐
相关产品推荐

