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 ansible-project+unsubscr...@googlegroups.com.
To post to this group, send email to ansible-project@googlegroups.com.
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