如何实现Ansible创建AD反向DNS主区域的幂等性?
问题
我通过Ansible执行以下任务为Active Directory域创建主反向DNS区域:
- name: Create reverse DNS zone ansible.windows.win_shell: Add-DnsServerPrimaryZone -NetworkID {{ reverse_dns_zone }} -ReplicationScope Forest retries: 30 delay: 60 tags: debug until: result is succeeded
希望实现幂等性,但第二次执行时总会报错:
Add-DnsServerPrimaryZone : Fehler beim Erstellen der Zone "0.3.10.in-addr.arpa" auf dem Server "DC01". In Zeile:1 Zeichen:1 + Add-DnsServerPrimaryZone -NetworkID 10.3.0.0/20 -ReplicationScope For ... + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : ResourceExists: (0.3.10.in-addr.arpa:root/Microsoft/...rverPrimaryZone) [Add-DnsServerPrimaryZone], CimException + FullyQualifiedErrorId : WIN32 9609,Add-DnsServerPrimaryZone
看到CategoryInfo里的ResourceExists,我认为这应该算作成功状态,但使用以下条件时任务仍会失败:
until: result.stderr.find('ResourceExists') != -1
请问这种场景下的正确处理方案是什么?
解决方案
方案1:改用专用Ansible模块(推荐)
直接使用Ansible官方维护的community.windows.win_dns_zone模块,该模块原生支持幂等性,无需手动处理重复创建的报错:
- name: Create reverse DNS zone community.windows.win_dns_zone: name: "{{ reverse_dns_zone | reverse_dns_zone_name }}" type: primary replication_scope: forest state: present retries: 30 delay: 60 tags: debug
注:
reverse_dns_zone_name是Ansible内置过滤器,可自动将CIDR格式(如10.3.0.0/20)转换为对应的反向区域名称(如0.3.10.in-addr.arpa)。
方案2:修改现有win_shell任务的错误处理逻辑
如果必须保留win_shell执行方式,可通过failed_when和until组合条件,忽略"资源已存在"的错误,同时保留对真实故障的检测:
- name: Create reverse DNS zone ansible.windows.win_shell: Add-DnsServerPrimaryZone -NetworkID {{ reverse_dns_zone }} -ReplicationScope Forest register: result retries: 30 delay: 60 tags: debug until: result is succeeded or 'ResourceExists' in result.stderr failed_when: - result is failed - 'ResourceExists' not in result.stderr
until条件:允许任务在执行成功或出现"ResourceExists"提示时终止重试failed_when条件:仅当任务失败且错误原因不是"资源已存在"时,才标记任务失败
内容的提问来源于stack exchange,提问作者MaKaNu
相关产品推荐
相关产品推荐

