Hello,

after hours of struggle with Ansible I've decided to ask for help smarter 
people. What I'm trying to do is to remove (lets say just do ls -la for now 
all files and directories within certain locations which names are not 
containing any part of certain list of variables. Let me give you an 
example:

- name: List currently existing letsencrypt certificates
  find:
    paths={{ item.paths }}
    file_type={{ item.file_type }}
  register: haproxy_le_existing
  with_items:
    - { paths: /etc/letsencrypt/live/, file_type: directory}
    - { paths: /etc/haproxy/ssl/le/, file_type: file}




- debug: var='haproxy_le_ssl|map(attribute="domain")|list|join("|")'
- debug: var='haproxy_le_existing.results|sum(attribute='files', 
start=[])|map(attribute='path')|map('regex_search','^((?!{{haproxy_le_ssl|
map(attribute='domain')|list|join('|')}}).)*$')| select('string') | list'




- name: Remove SSLs that are not in the config
  shell: "ls -la {{ item }}"
  with_items: "{{ haproxy_le_existing.results|sum(attribute='files', 
start=[])|map(attribute='path')|map('regex_search','^((?!{{haproxy_le_ssl|map(attribute='domain')|list|join('|')}}).)*$')|
 
select('string') | list  }}"


variables are here:

haproxy_le_ssl:
  - { domain: let2.example.is}
  - { domain: let3.example.is}
  - { domain: let4.example.is}


Debug works perfectly:

TASK [common/haproxy : List currently existing letsencrypt certificates] 
*******
ok: [haproxy-test.aws.example] => (item={u'file_type': u'directory', u
'paths': u'/etc/letsencrypt/live/'})
ok: [haproxy-test.aws.example] => (item={u'file_type': u'file', u'paths': u
'/etc/haproxy/ssl/le/'})


msg: All items completed


msg: All items completed


TASK [common/haproxy : debug] 
**************************************************
ok: [haproxy-test.aws.example] => {
    "haproxy_le_ssl|map(attribute=\"domain\")|list|join(\"|\")": 
"let2.example.is|let3.example.is|let4.example.is"
}


TASK [common/haproxy : debug] 
**************************************************
ok: [haproxy-test.aws.example] => {
    "haproxy_le_existing.results|sum(attribute='files', 
start=[])|map(attribute='path')|map('regex_search','^((?!let2.example.is|let3.example.is|let4.example.is).)*$')|
 
select('string') | list": [
        "/etc/letsencrypt/live/let1.example.is",
        "/etc/haproxy/ssl/le/dupa.pem"
    ]
}


most probably because it doesn't have "{{ }}", but when it comes to running 
a task I've got following error:

TASK [common/haproxy : Remove SSLs that are not in the config] 
*****************
fatal: [haproxy-test.aws.example]: FAILED! => {"failed": true, "msg": "template 
error while templating string: expected token ',', got 'domain'. String: {{ 
haproxy_le_existing.results|sum(attribute='files', 
start=[])|map(attribute='path')|map('regex_search','^((?!{{haproxy_le_ssl|map(attribute='domain')|list|join('|')}}).)*$')|
 
select('string') | list  }}"}

For me creating oneliner like this is more convenient than creating 
multiple tasks (most probably I could create something using join from 
multiple tasks, but I'd like to understand what is happening here as using 
variable inside regex seems to be quite handy and I might use it in the 
future), even it is not the easiest to read way of doing the job. Please 
advice what could I do in this situation.



-- 
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/5c86fff4-3dd3-4451-a215-f05cafb858e6%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to