Ansible: Replacing text in file complex example

From Wiki

I need to replace umask values into /etc/profile from:

if [ $UID -gt 199 ] && [ "`/usr/bin/id -gn`" = "`/usr/bin/id -un`" ]; then
  umask 022
else
  umask 027
fi

to

if [ $UID -gt 199 ] && [ "`/usr/bin/id -gn`" = "`/usr/bin/id -un`" ]; then
  umask 002
else
  umask 022
fi


Below, an ansible script that do this:

- name: Replacing text in file complex example
  hosts: localhost
  gather_facts: false
  vars:
    myfile:  /etc/profile
  tasks:
    - name: "Read {{ myfile }}"
      ansible.builtin.slurp:
        src: "{{ myfile }}"
      register: etc_profile

    - name: Convert file content to string
      ansible.builtin.set_fact:
        profile_txt: "{{ etc_profile['content'] | b64decode }}"

    - name: Change to 'umask_002' between then_else
      ansible.builtin.replace:
        path: "{{ myfile }}"
        regexp: '(then\s+)umask\s\d+(\s+else)'
        replace: '\1umask 002\2'
      when: profile_txt | regex_search('then\s+umask\s002\s+else') is none

    - name: Check 'umask 022' between else_fi
      ansible.builtin.replace:
        path: "{{ myfile }}"
        regexp: '(else\s+)umask\s\d+(\s+fi)'
        replace: '\1umask 022\2'
      when: profile_txt | regex_search('else\s+umask\s022\s+fi') is none

See also