end_host not working as expected

Both end_host and end_play seem to both cause the job to skip all hosts. I know that only one host meets the condition so it should execute on 1 but exits for both. Am I missing something? I thought end_host would only end the play for the host that meets the when condition.

`

tasks:

  • name: Pre java-1.8.-openjdk package check
    raw: rpm -qa java-1.8.
    -openjdk | wc -l
    register: package_precheck

  • block:

  • name: “end play for host host if nothing to upgrade”
    debug:
    msg: “nothing to upgrade, ending play for host”

  • meta: end_host
    when: package_precheck.stdout > 0

`

You should add a this debug
  - debug: var=package_precheck

Then you'll see that stdout is a string not an int, so filter the variable through int

  when: package_precheck.stdout | int > 0

Thank you Kai, I ran in debug noticed it was a string. I updated the command but end_host still kills the entire run for all hosts. I have 2 for testing.

“stdout”: “1”,
“stdout”: “0”,

Above is the output. From that I’d expect the first host to be skipped and the 2nd host to continue to execute. At least that is how I’m reading end_host should work. end_play sounds like what is being used I’ve tried both, both behave the same.

I think its working now. I think part of my issue was that one of the host had python 2.4 and all the error messages from that was throwing me off. Changed that test node out for a diff one and the logic appears to be working now after changing > 0 to int > 0.

Thanks for the help Kai.

This was also throwing me off, it would be nice if there was a way around it as well.

Even though the logic is working and node1 stops after the check, the block output displays the same msg for all hosts. I would have thought that this would only show the msg for node1 as thats the node thta meets the end_host check. Node2 continues to run all other checks but the message is confusing as it first looks like its skipping both hosts but its really not.

`

TASK [end play for host host if nothing to upgrade] ****************************
ok: [node1.test.com] => {
“msg”: “Nothing to upgrade, ending play for host”
}
ok: [node2.test.com] => {
“msg”: “Nothing to upgrade, ending play for host”
}

`

This was also throwing me off, it would be nice if there was a way around
it as well.

Even though the logic is working and node1 stops after the check, the block
output displays the same msg for all hosts. I would have thought that this
would only show the msg for node1 as thats the node thta meets the end_host
check. Node2 continues to run all other checks but the message is confusing
as it first looks like its skipping both hosts but its really not.

TASK [end play for host host if nothing to upgrade]
****************************
ok: [node1.test.com] => {
    "msg": "Nothing to upgrade, ending play for host"
}
ok: [node2.test.com] => {
    "msg": "Nothing to upgrade, ending play for host"
}

That's because your when: is indented to fare.
It need to be on the same level as the block.

    - block:
        - name: "end play for host host if nothing to upgrade"
          debug:
            msg: "nothing to upgrade, ending play for host"

        - meta: end_host
          when: package_precheck.stdout > 0

As you can see, the when is only on meta task so the debug in the block will always run.