Ansible skip depending on output in a loop
i am trying to create dhcp scope only if it does not exists, below is what i have tried:
- name: Get scopes
ansible.windows.win_shell: Get-DhcpServerv4Scope -ScopeId {{ item.ScopeId }}
changed_when: false
register: dhcp
with_items: “{{ dhcp_scope}}”
vars dhcp_scope:
“EndRange”: “172.30.0.254”,
“LeaseDuration”: “10:00:00”,
“ScopeId”: “172.30.0.0”,
“StartRange”: “172.30.0.1”,
“SubnetMask”: “255.255.255.0”,
“name”: “Office B”
dhcp register
“msg”: {
“changed”: false,
“msg”: “All items completed”,
“results”: [
{
“ansible_loop_var”: “item”,
“changed”: false,
“cmd”: “Get-DhcpServerv4Scope -ScopeId 172.30.0.0”,
“delta”: “0:00:01.528935”,
“end”: “2023-07-13 21:47:35.792188”,
“failed”: false,
“item”: {
“EndRange”: “172.30.0.254”,
“LeaseDuration”: “10:00:00”,
“ScopeId”: “172.30.0.0”,
“StartRange”: “172.30.0.1”,
“SubnetMask”: “255.255.255.0”,
“name”: “Office B”
},
“rc”: 0,
“start”: “2023-07-13 21:47:34.263252”,
“stderr”: “”,
“stderr_lines”: ,
“stdout”: “\r\nScopeId SubnetMask Name State StartRange EndRange LeaseDurat\r\n ion \r\n------- ---------- ---- ----- ---------- -------- ----------\r\n172.30.0.0 255.255.255.0 Office B Active 172.30.0.1 172.30.0.254 10:00:00 \r\n\r\n\r\n”,
“stdout_lines”: [
“”,
“ScopeId SubnetMask Name State StartRange EndRange LeaseDurat”,
" ion ",
“------- ---------- ---- ----- ---------- -------- ----------”,
"172.30.0.0 255.255.255.0 Office B Active 172.30.0.1 172.30.0.254 10:00:00 ",
“”,
“”
]
},
{
“ansible_loop_var”: “item”,
“changed”: false,
“cmd”: “Get-DhcpServerv4Scope -ScopeId 172.31.0.0”,
“delta”: “0:00:01.477053”,
“end”: “2023-07-13 21:47:39.577233”,
“failed”: false,
“item”: {
“EndRange”: “172.31.0.254”,
“LeaseDuration”: “10:00:00”,
“ScopeId”: “172.31.0.0”,
“StartRange”: “172.31.0.1”,
“SubnetMask”: “255.255.255.0”,
“name”: “Office C”
},
“rc”: 0,
“start”: “2023-07-13 21:47:38.100180”,
“stderr”: “”,
“stderr_lines”: ,
“stdout”: “\r\nScopeId SubnetMask Name State StartRange EndRange LeaseDurat\r\n ion \r\n------- ---------- ---- ----- ---------- -------- ----------\r\n172.31.0.0 255.255.255.0 Office C Active 172.31.0.1 172.31.0.254 8.00:00:00\r\n\r\n\r\n”,
“stdout_lines”: [
“”,
“ScopeId SubnetMask Name State StartRange EndRange LeaseDurat”,
" ion ",
“------- ---------- ---- ----- ---------- -------- ----------”,
“172.31.0.0 255.255.255.0 Office C Active 172.31.0.1 172.31.0.254 8.00:00:00”,
“”,
“”
This is working, it is skipping the rc=0
- name: "Evaluate the scopes
debug:
when: “item.rc == 1”
with_items: “{{ dhcp}}”
loop: “{{ dhcp.results }}”
but trying to apply it to create the scopes
- name: Create DHCP scopes
win_shell: |
Add-DhcpServerv4Scope -Name “{{ item.name }}” -StartRange “{{ item.StartRange}}” -EndRange “{{ item.EndRange}}” -SubnetMask “{{ item.SubnetMask}}”
with_items: “{{ dhcp_scope}}”
changed_when: false
when: “item.rc == 1”
loop: “{{ dhcp.results }}”
It is failing, due to the fact that is not getting the ScopeId, which is normal as the loop is going through the dhcp.results and not with_items: “{{ dhcp_scope}}” , how to make it so that it can skip the output that is rc=0 and only when item.rc == 1 ?
TASK [Create DHCP scopes] ******************************************************************************************************************************************************************** fatal: : FAILED! => {“msg”: “The task includes an option with an undefined variable. The error was: ‘dict object’ has no attribute ‘ScopeId’\n\nThe error appears to be in ‘/etc/ansible/dhcp_check.yml’: line 57, column 5, but may\nbe elsewhere in the file depending on the exact syntax problem.\n\nThe offending line appears to be:\n\n\n - name: Create DHCP scopes\n ^ here\n”}
if i change it to:
- name: Create DHCP scopes
with_items: “{{ dhcp}}”
changed_when: false
when: “item.rc == 1”
loop: “{{ dhcp.results }}”
ASK [Create DHCP scopes] ********************************************************************************************************************************************************************
FAILED! => {“msg”: “The task includes an option with an undefined variable. The error was: ‘dict object’ has no attribute ‘ScopeId’\n\nThe error appears to be in ‘/etc/ansible/dhcp_check.yml’: line 57, column 5, but may\nbe elsewhere in the file depending on the exact syntax problem.\n\nThe offending line appears to be:\n\n\n - name: Create DHCP scopes\n ^ here\n”}.
How to make - name: Create DHCP scopes so that it can skip creating the scopes if rc=0 and only when item.rc == 1 ? similar with the debug which skips the scopes that exist?
i cant loop over dhcp_scope it will throw an error: error FAILED! => {“msg”: "The conditional check ‘item.rc == 1’ failed. The error was: error while evaluating conditional (item.rc == 1).
What i am trying to achieve is run command on the remote host, if the dhcp scope exist i will skip creating it and only creates the one that do not exists.