blockinfile & lineinfile both are not working in RHEL 7.6

Hello Guys,

Can someone please help me to resolve this issue.

below playbook i have created to remove dns entries from resolv.conf and its working perfect on rhel 6 but not in rhel 7.6, is there any bug or i need to add any parameters ?

Playbook :- blockinfile

Can someone please help me.

Are you sure the problem is ansible?
the playbook fails? what’s the shown message?

Or the problem is that the configuration are reset on reboot?

regards

Luca

take a look at /var/log/messages for line with

updated /etc/resolv.conf
see more details at https://access.redhat.com/solutions/7412

Furthermore I don’t get why you use the argument block with blockinfile in order to remove the block… isn’t unnecessary?

regards

Luca

Hello Luca,

Are you sure the problem is ansible?
:-Not Sure, same playbook is working on rhel6 but not in rhel7, means no error.

the playbook fails? what’s the shown message?

:-no, playbook is working successfully in rhel 6, but rhel 7 its failing, not only resolv.conf even i tried with dummy file created on /tmp however that also failed.

:-Or the problem is that the configuration are reset on reboot?

no configuration issue

Furthermore I don’t get why you use the argument block with blockinfile in order to remove the block… isn’t unnecessary?

:- is there any module did ansible is having it for removing block in file ?

Thanks,
Deepan M

Hello Luca,

One more information about this blockinfile, i facing problem with state: absent only not with state: present, means i can able to add entries, not able to remove entries.

Thanks,
Deepan M

blockinfile is the right choice
anyway I’m not sure if the argument block is necessary

fusillator@catorcio:~/Code/ansible/test$ cat resolv.conf
nameserver 8.8.8.8
nameserver 13.2.7.8
nameserver 13.2.7.9
nameserver 13.2.7.10
search eu.ro.net mrtools.ro.com mit.gbr.ro.com

fusillator@catorcio:~/Code/ansible/test$ cat blockinfile.yml

  • hosts: localhost
    tasks:
  • name: remove block regexps
    blockinfile:
    path: “./resolv.conf”
    marker: “{mark}”
    marker_begin: “nameserver 13.2.7.8”
    marker_end: “search eu.ro.net mrtools.ro.com mit.gbr.ro.com
    state: absent
    backup: yes

fusillator@catorcio:~/Code/ansible/test$ ansible-playbook blockinfile.yml

PLAY [localhost] **************************************************************************************************************************************************************************************************************************************************************

TASK [Gathering Facts] ********************************************************************************************************************************************************************************************************************************************************
ok: [localhost]

TASK [remove block regexps] ***************************************************************************************************************************************************************************************************************************************************
changed: [localhost]

PLAY RECAP ********************************************************************************************************************************************************************************************************************************************************************
localhost : ok=2 changed=1 unreachable=0 failed=0

fusillator@catorcio:~/Code/ansible/test$ cat resolv.conf
nameserver 8.8.8.8

Can you launch the playbook with increased verbosity to analyze the failure?

Maybe it could be useful the debug feature to shorten the test:

https://docs.ansible.com/ansible/latest/user_guide/playbooks_debugger.html

Unfortunatly at the moment I’m not on a rhel host.
Try also to check audit log for selinux restrictions

sealert -a /var/log/audit.log

regards

Luca

try to check if the marker line as blank/control/not printable characters at the end of the line

xxd resolv.conf

Hi Luca,

Perfectly working what you have suggested.

I need one more suggestion, below is the content i want remove but when the line ends with #name its not working ? do you know how to remove with that also?

Playbook:-

cat resolve.yml

So you solved…
The blank counts for the matching of the marker lines…

fusillator@catorcio:~/Code/ansible/test$ ansible-playbook blockinfile.yml

PLAY [localhost] **************************************************************************************************************************************************************************************************************************************************************

TASK [Gathering Facts] ********************************************************************************************************************************************************************************************************************************************************
ok: [localhost]

TASK [remove block regexps] ***************************************************************************************************************************************************************************************************************************************************
changed: [localhost]

PLAY RECAP ********************************************************************************************************************************************************************************************************************************************************************
localhost : ok=2 changed=1 unreachable=0 failed=0

fusillator@catorcio:~/Code/ansible/test$ cat resolv.conf
nameserver 8.8.8.8
fusillator@catorcio:~/Code/ansible/test$ cat resolv.conf
resolv.conf resolv.conf.3339.2019-02-26@20:21:57~ resolv.conf.3740.2019-02-27@11:09:34~ resolv.conf.4381.2019-02-27@12:03:36~
fusillator@catorcio:~/Code/ansible/test$ cat resolv.conf
resolv.conf resolv.conf.3339.2019-02-26@20:21:57~ resolv.conf.3740.2019-02-27@11:09:34~ resolv.conf.4381.2019-02-27@12:03:36~
fusillator@catorcio:~/Code/ansible/test$ cat resolv.conf.4381.2019-02-27@12:03:36~
nameserver 8.8.8.8
nameserver 13.2.7.8 dns
nameserver 13.2.7.9
nameserver 13.2.7.10
search eu.ro.net mrtools.ro.com mit.gbr.ro.com
fusillator@catorcio:~/Code/ansible/test$ cat blockinfile.yml

  • hosts: localhost
    tasks:
  • name: remove block regexps
    blockinfile:
    path: “./resolv.conf”
    marker: “{mark}”
    marker_begin: “nameserver 13.2.7.8 dns
    marker_end: “search eu.ro.net mrtools.ro.com mit.gbr.ro.com
    state: absent
    backup: yes

regards

Luca

Hi Luca,

I tried by removing blank space, even though its not working! seems # is not allowing to execute, can you please tell what can be done here!

cat resolve.yml

I dont know for me it s working… see my test in the prevoius answer. try to double check the yaml specification

Hi Luca,

See below highlighted, seems on both playbook and file, you have removed blank space, thats why its working for you! but in my case blank is present, please see my output.

can you please my below info on your system and check what its showing.

fusillator@catorcio:~/Code/ansible/test$ cat resolv.conf.4381.2019-02-27@12:03:36~
nameserver 8.8.8.8
nameserver 13.2.7.8 dns
nameserver 13.2.7.9
nameserver 13.2.7.10
search eu.ro.net mrtools.ro.com mit.gbr.ro.com
fusillator@catorcio:~/Code/ansible/test$ cat blockinfile.yml

  • hosts: localhost
    tasks:
  • name: remove block regexps
    blockinfile:
    path: “./resolv.conf”
    marker: “{mark}”
    marker_begin: “nameserver 13.2.7.8 dns
    marker_end: “search eu.ro.net mrtools.ro.com mit.gbr.ro.com
    state: absent
    backup: yes

myoutput:-

cat resolv.conf
nameserver 13.2.7.8 # dns1
nameserver 13.2.7.9 # dns2
nameserver 13.2.7.10 # dns3
search eu.ro.net mrtools.ro.com mit.gbr.ro.com

cat resolve.yml

Interesting I’m commuting at the moment, I will test It tonight

Consider using the replace module to normalize the space incongruence before the blockinfile task…

Something like

- replace:
    path: resolv.conf
    regexp: '^(.*)\s+#\s+(.*)$'
    replace: ' # '
    backup: yes

unfortunately I can't try the playbook in this moment. 

Regards

Luca

Hello Luca,

Replace can be removed single line, but how we can remove block ?

Thanks,
Deepan M

Hello Luca,

Below playbook no result, seems because of #name its not working i guess.

Replace should substitute all instance matching the regexp, as for the manual

This module will replace all instances of a pattern within a file.

Try this

  • hosts: localhost
    tasks:
  • name: sort out blank discrepancy
    replace:
   path: resolv.conf
   regexp: '^(.*)\s+#\s+(.*)$'
   replace: ' # '
   backup: yes
  • name: remove block regexps
    blockinfile:
    path: “./resolv.conf”
    marker: “{mark}”
    marker_begin: “nameserver 13.2.7.8 dns
    marker_end: “search eu.ro.net mrtools.ro.com mit.gbr.ro.com
    state: absent
    backup: yes

Anyway I didn’t test it yet.
Regards

Luca

I’m finally home

Sorry the previous regexp was completely incorrect. Now I fixed it with a couple of tests…

And here it is

fusillator@catorcio:~/Code/ansible/test$ cat blockinfile.yml

  • hosts: localhost
    tasks:
  • name: sort out blank discrepancy
    replace:
    path: resolv.conf
    regexp: ‘^nameserver\s+([^ ]+)\s+#(.*)’
    replace: ‘nameserver \1 #\2’
    backup: yes
  • name: remove block regexps
    blockinfile:
    path: “./resolv.conf”
    marker: “{mark}”
    marker_begin: “nameserver 13.2.7.8 # dns1”
    marker_end: “search eu.ro.net mrtools.ro.com mit.gbr.ro.com
    state: absent
    fusillator@catorcio:~/Code/ansible/test$ cat resolv.conf
    nameserver 8.8.8.8
    nameserver 13.2.7.8 # dns1
    nameserver 13.2.7.9 # dns2
    nameserver 13.2.7.10 # dns3
    search eu.ro.net mrtools.ro.com mit.gbr.ro.com
    fusillator@catorcio:~/Code/ansible/test$ ansible-playbook blockinfile.yml

PLAY [localhost] **************************************************************************************************************************************************************************************************************************************************************

TASK [Gathering Facts] ********************************************************************************************************************************************************************************************************************************************************
ok: [localhost]

TASK [sort out blank discrepancy] *********************************************************************************************************************************************************************************************************************************************
changed: [localhost]

TASK [remove block regexps] ***************************************************************************************************************************************************************************************************************************************************
changed: [localhost]

PLAY RECAP ********************************************************************************************************************************************************************************************************************************************************************
localhost : ok=3 changed=2 unreachable=0 failed=0

fusillator@catorcio:~/Code/ansible/test$ cat resolv.conf
nameserver 8.8.8.8

Regards

Luca