need help with if condition in jinja template

I am trying to create a report of failed servers output.

Here is my playbook

Clearly your when condition doesn’t match. But in order to know why, we’d need to see the content of a failed backup, and maybe a sample success output as well.
So post that/those.

Please find the task output below, usually all the jobs go to changed state true and the play successfully so i have passed a failed when condition to identify the failure

I tried running your code on my local machine. Of course I don’t have “mksysb” so I had to substitute things I’ve got, but your logic with respect to “failed_when:” and “hostvars[host][‘mksys’][‘msg’]” appears to be okay.

The only thing that stuck out to me is that you have some leading tabs in your original post’s yaml. Perhaps that’s an artifact of posting, email, etc., but do check for tabs and retest if you find any. Either way let us know.

Hi Todd,

my original playbook works just fine, the problem is with the second one where i want the report just for the failed ones, my first play book give me all the output due to special variable {% for host in ansible_play_hosts_all %}

I tried to use if condition to filter the result of the failed ones

{% for host in ansible_play_hosts_all %}
{% if ‘Completed Successfully’ not in hostvars[host][‘mksys’][‘msg’] %}
{{ ‘###’ }}{{ host }}{{ ‘###’ }}
{{ ‘--------------------------’ }}
{{ hostvars[host][‘mksys’][‘msg’] }}
{% endif %}
{% endfor %}

This condition generates nothing., If am running the play on 100 nodes and 5 failed, i want the “hostvars[host][‘mksys’][‘msg’]” of the failed ones to a file.

{% for host in ansible_play_hosts_all %}
{% if 'Completed Successfully' not in hostvars[host]['mksys']['msg'] %}

This condition generates nothing.

Your code works as expected. For testing, put the variable into the inventory

  > cat hosts
  all:
    hosts:
      host1:
        mksys:
          msg: 'Completed Successfully'
      host2:
        mksys:
          msg: 'Completed Successfully'
      host3:
        mksys:
          msg: 'Completed Not Successfully'

The playbook

  > cat pb.yml
  - hosts: all
    tasks:
      - debug:
          msg: |
            {% for host in ansible_play_hosts_all %}
            {% if 'Completed Successfully' not in hostvars[host]['mksys']['msg'] %}
            {{ host }} msg:{{hostvars[host]['mksys']['msg'] }}
            {% endif %}
            {% endfor %}
        run_once: true

gives (abridged)

  msg: |-
    host3 msg:Completed Not Successfully

I understand the problem. Thanks for restating it concisely.

Your template is creating /home/user1/mksysb_error_report.out, but not on localhost.
It’s creating it on each of the target hosts.
It’s doing that because of the leading tabs I asked you about earlier. There’s one in front of your “run_once: True” and another in front of your “delegate_to: localhost”. So even though it may look correctly indented on your screen, your old Ansible sees it as being part of the body of your template, so it’s running the copy task on each of the target hosts, creating the file there instead of once locally.

I could only get your originally posted playbook to run on my local “ansible [core 2.14.2]” if I removed the tabs and fixed the indentation. Otherwise it would error out immediately complaining about the tabs.

However, I still have access to an environment with “ansible 2.10.15”, and there your code — with Vladimir Botka’s clever hack of setting the necessary variables in the inventory — runs just fine, tabs and all, as described above.

Remove the tabs from the three lines that have them and run your test again. Also, look on the target hosts and see if /home/user1/mksysb_error_report.out exists. I expect it will.