--- # Robot flavor (Robot Webservice API) - name: Assert Robot credentials present ansible.builtin.assert: that: - (HETZNER_ROBOT_USER | default('') | length) > 0 - (HETZNER_ROBOT_PASSWORD | default('') | length) > 0 fail_msg: "Robot credentials required: HETZNER_ROBOT_USER / HETZNER_ROBOT_PASSWORD." no_log: "{{ hetzner_no_log | bool }}" - name: Validate records (robot) ansible.builtin.assert: that: - rdns_records | length > 0 - (rdns_records | selectattr('ip_address','defined') | list | length) == (rdns_records | length) - (rdns_records | selectattr('dns_ptr','defined') | list | length) == (rdns_records | length) fail_msg: "Each record must have ip_address and dns_ptr for Robot rDNS." no_log: "{{ hetzner_no_log | bool }}" - name: Apply rDNS via Hetzner Robot API vars: hetzner_robot_base_url: "{{ HETZNER_ROBOT_BASE_URL }}" ip_path: "{{ item.ip_address | urlencode }}" ansible.builtin.uri: url: "{{ hetzner_robot_base_url }}/rdns/{{ ip_path }}" method: POST user: "{{ HETZNER_ROBOT_USER }}" password: "{{ HETZNER_ROBOT_PASSWORD }}" force_basic_auth: true headers: Accept: application/json body_format: form-urlencoded body: ptr: "{{ item.dns_ptr }}" status_code: [200, 201] loop: "{{ rdns_records }}" loop_control: label: "{{ item.ip_address }} -> {{ item.dns_ptr }}" async: "{{ hetzner_async_enabled | ternary(hetzner_async_time, omit) }}" poll: "{{ hetzner_async_enabled | ternary(hetzner_async_poll, omit) }}" no_log: "{{ hetzner_no_log | bool }}"