Find line in file

23 views
Skip to first unread message

Neil Young

unread,
Nov 2, 2021, 8:19:20 PM11/2/21
to Ansible Project
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?

Neil Young

unread,
Nov 2, 2021, 8:26:36 PM11/2/21
to Ansible Project
Oops. Disregard please:

regexp: "{{ item.item }}"

Jorge Rúa

unread,
Nov 3, 2021, 6:43:55 AM11/3/21
to ansible...@googlegroups.com
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. 

--
You received this message because you are subscribed to the Google Groups "Ansible Project" group.
To unsubscribe from this group and stop receiving emails from it, send an email to ansible-proje...@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/ansible-project/e1146c52-8a89-4634-a212-e9bc8ab07b30n%40googlegroups.com.

Neil Young

unread,
Nov 3, 2021, 6:57:03 AM11/3/21
to Ansible Project
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.

Reply all
Reply to author
Forward
0 new messages