Find line in file

One of the most recommended things is to use “lineinfiles” with some special attributes for just finding a line in a file.

I have a weird issue with this. If I just lookup one line, like so:

  • name: TEST - Check /tmp/out.log
    lineinfile:
    path: /tmp/out.log
    regexp: “^bla”
    state: absent
    check_mode: yes
    changed_when: false
    register: checklog
    failed_when: not checklog.found

This sequence fails (as expected), because the “bla” line is not in the file. If I enter a string, which is in the file, it doesn’t fail. So far so good.

Now I wanted to examine several lines, but this never fails. “line1” to “line4” are in, “bla” not.
But the result is OK…

  • name: TEST - Check /tmp/out.log
    lineinfile:
    path: /tmp/out.log
    regexp: “{{ item }}”
    state: absent
    check_mode: yes
    changed_when: false
    register: checklog
    with_items:
  • {item: “^line1”}
  • {item: “^line2”}
  • {item: “^line3”}
  • {item: “^line4”}
  • {item: “^bla”}
    failed_when: not checklog.found

Does that make sense at all?

Oops. Disregard please:

regexp: “{{ item.item }}”

If it never fails is just because you are iterating over items and registering the result of each iteration. So the condition is only evaluated only on the last iteration.

No, the reason was the wrong “{{ item.item }}” reference.

Real world example:

  • name: TEST - Check /tmp/out.log for some lines expected to be there
    tags: test
    lineinfile:
    path: /tmp/out.log
    regexp: “{{ item.item }}”
    state: absent
    check_mode: yes
    changed_when: false
    register: checklog
    with_items:
  • { item: “^v=1”}
  • { item: “^s=Kurento Media Server” }
  • { item: “^IceCandidateFound” }
  • { item: “^IceGatheringDone” }
    failed_when: not checklog.found

The failing line is “v=1”, because it is “v=0”. The rest of the lines except the last is there. Result:

TASK [TEST - Check /tmp/out.log for some lines expected to be there] ******************************************************************************************************************************************************************
failed: [ubuntuVM] (item={‘item’: ‘^v=1’}) => {“ansible_loop_var”: “item”, “backup”: “”, “changed”: false, “failed_when_result”: true, “found”: 0, “item”: {“item”: “^v=1”}, “msg”: “”}
ok: [ubuntuVM] => (item={‘item’: ‘^s=Kurento Media Server’}) => {“ansible_loop_var”: “item”, “backup”: “”, “changed”: false, “failed_when_result”: false, “found”: 1, “item”: {“item”: “^s=Kurento Media Server”}, “msg”: “1 line(s) removed”}
ok: [ubuntuVM] => (item={‘item’: ‘^IceCandidateFound’}) => {“ansible_loop_var”: “item”, “backup”: “”, “changed”: false, “failed_when_result”: false, “found”: 12, “item”: {“item”: “^IceCandidateFound”}, “msg”: “12 line(s) removed”}
failed: [ubuntuVM] (item={‘item’: ‘^IceGatheringDone’}) => {“ansible_loop_var”: “item”, “backup”: “”, “changed”: false, “failed_when_result”: true, “found”: 0, “item”: {“item”: “^IceGatheringDone”}, “msg”: “”}

PLAY RECAP ****************************************************************************************************************************************************************************************************************************
ubuntuVM : ok=1 changed=0 unreachable=0 failed=1 skipped=0 rescued=0 ignored=0

So it works as expected

Solved.