Я нашел следующий подход для создания основной обратной зоны для домена Active Directory через Ansible:
- 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
всегда приводит к провалу задачи.
Каков правильный подход для такого сценария?
Это было бы нормально, если бы не другие ошибки, которые могли бы вызвать проблемы.





Вы можете использовать оператор try/catch для выборочного подавления ошибок:
try {
Add-DnsServerPrimaryZone -NetworkID {{ reverse_dns_zone }} -ReplicationScope Forest -ErrorAction Stop
}
catch [Microsoft.Management.Infrastructure.CimException] {
if ($_.CategoryInfo.Category -ne 'ResourceExists') {
# re-throw unless it's a ResourceExists error
throw
}
}
хороший подход, но ansible yml борется с многострочными строками: ОШИБКА! не удалось разделить аргументы: несбалансированный блок jinja2 или кавычки
Вы можете удалить окончания строк, чтобы превратить их в однострочник - в противном случае используйте > или | для поддержки многострочных сценариев в вашей ansible-задаче stackoverflow.com/questions/40230184/… :)
Я попробовал с помощью > и |, оба создали сообщение об ошибке.
Здесь вам придется принять во внимание три разные вещи в Ansible:
until повторял вашу задачуfailed_when, которое охватывает исключения, возникающие по другим причинам, кроме повторной попытки.changed или там уже была основная обратная зона, которой вы можете управлять с помощью changed_whenВ этом случае вам также придется остановить цикл until, если ресурс уже существует:
until: "result is succeeded or 'ResourceExists' in result.stderr"
И ваше состояние failed_when возникает, когда у вас есть исключение, которое не содержит ResourceExists:
failed_when: "result.stderr != '' and 'ResourceExists' not in result.stderr"
А ваш changed_when произойдет только тогда, когда задача действительно удастся:
changed_when: result is succeeded
Возможно
ignore_errors: true- docs.ansible.com/ansible/latest/playbook_guide/…