Nicolas,

for clarity I made a small modification to you specification so the config
file contains something like below


role: common,web,app,db


then you can use this regexp to check that rolename is not already part of
the list

(^role\s*[:]\s*(?!rolename)[\w]+)((,(?!rolename)[\w]+)*)$

for the explanations you can use: https://regex101.com/
to see what's happening

copy the regexp above in the "Regular Expression" field

for the test use the string below:
role: rolenam1,common,app,web,rolenam2,db,rolenam3

look at the "MATCH INFORMATION" window and you will get it I think

change rolenam1 to rolename => no match
that will be the same for rolenam2 or rolename3
to show the position of the decl does not matter.

then from an Ansible perspective
each role can have a task like below, that will append the rolename to the
list if not already done

  vars:
    - therole: "rolename"
    - string: "role: common"

  tasks:

  - name: check if config exist
    stat: path="/tmp/config"
    register: stat_result


  - name: start with a basis /tmp/config file
    shell: echo "{{ string }}" > /tmp/config
    when: stat_result.stat.exists  == False

  - name: Append rolename string to the list if not present already
    lineinfile:
      dest=/tmp/config
      backrefs=True
      state=present
      regexp='(^role\s*[:]\s*(?!rolename)[\w]+)((,(?!rolename)[\w]+)*)$'
      line='\1\2,rolename'

it will be easy to :

- parameterize the rolename string with an ansible variable
  relace it with {{therole}} in the lineifile task

- adapt back to you original spec (config: role:app, role:web)

- deal with any number of white spaces

there is one limitation: the need to have a firt role being declared in the
config.
It is possible to address this but then the regex will be, say, harder to
read


HTH

Phil

-- 
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 [email protected].
To post to this group, send email to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/ansible-project/CAB1FMuTeu3oc0fe5uS1k8EEORoKYioQEck3%2BFpyJ7ua0%3DQObfQ%40mail.gmail.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to