When you do the list syntax for with_items, it would have worked if you 
would have put in an expression.

    - name: Write out SSLs to files 
      copy: dest=/etc/ssl/{{item.tls.domain}}.pem owner=root 
group=root mode=0600 content={{item.tls.pem}} 
      with_items: 
        - "{{ l7config.frontends }}"
      when: item.tls is defined 

Here is the output from the example I gave 

- hosts: localhost
  connection: local
  vars:
    config: 
      frontend: 
        - id: 1
          value: test1
          tls: 
            - key: key1
              domain: domain1
        - id: 2
          value: test2
      backend:
        - id: 3
        - id: 4
  tasks:
    - debug: var=item
      with_items: 
        - "{{ config.frontend }}"
      when: item.tls is defined
    - debug: var=item
      with_items: config.frontend | selectattr("tls", "defined") | list

And the result

(ansible)[ec2-user@ip-10-0-0-226 playbooks]$ ansible-playbook 
test_withitems.yml 

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

GATHERING FACTS 
*************************************************************** 
ok: [localhost]

TASK: [debug var=item] 
******************************************************** 
ok: [localhost] => (item={'tls': [{'domain': 'domain1', 'key': 'key1'}], 
'id': 1, 'value': 'test1'}) => {
    "item": {
        "id": 1, 
        "tls": [
            {
                "domain": "domain1", 
                "key": "key1"
            }
        ], 
        "value": "test1"
    }
}
skipping: [localhost] => (item={'id': 2, 'value': 'test2'})

TASK: [debug var=item] 
******************************************************** 
ok: [localhost] => (item={'tls': [{'domain': 'domain1', 'key': 'key1'}], 
'id': 1, 'value': 'test1'}) => {
    "item": {
        "id": 1, 
        "tls": [
            {
                "domain": "domain1", 
                "key": "key1"
            }
        ], 
        "value": "test1"
    }
}

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


I believe this occurs because in the single line syntax it assumes an 
expression already, which is why you can specify jinja filters without 
wrapping it all in a jinja {{ }} expression block.  But when you do the 
long form / list form (don't know what the correct terminology is), it 
doesn't do expression blocks implicitly, you have to explicitly specify 
them.

Good news is, all these different ways of doing things is just different 
tools we can utilize depending on the situation, I find myself sometimes 
using jinja filters and other times using the standard with / when from 
ansible.

Thanks!
Michael

On Thursday, October 23, 2014 3:28:48 AM UTC-5, Dane wrote:
>
> Just for completeness in case anyone else stumbles across this issue, 
> my final task was: 
>
>   # Use long-form for task, Ansible issue #9172 
>   - name: Write out SSLs to files 
>     copy: 
>       dest: /etc/ssl/{{item.tls.domain}}.pem 
>       owner: root 
>       group: root 
>       mode: 0600 
>       content: "{{item.tls.pem}}" 
>     with_items: l7config.frontends 
>     when: item.tls is defined 
>
> Thanks 
>
> Dane 
>
> On 23 October 2014 09:21, Dane Elwell <[email protected] <javascript:>> 
> wrote: 
> > Hi Michael, 
> > 
> > Thanks for the response. Your example does work for me, however 
> > looking at your example I've managed to figure out why my original 
> > example wasn't working: 
> > 
> >     - name: Write out SSLs to files 
> >       copy: dest=/etc/ssl/{{item.tls.domain}}.pem owner=root 
> > group=root mode=0600 content={{item.tls.pem}} 
> >       with_items: 
> >         - l7config.frontends 
> >       when: item.tls is defined 
> > 
> > Does not work, whereas: 
> > 
> >     - name: Write out SSLs to files 
> >       copy: dest=/etc/ssl/{{item.tls.domain}}.pem owner=root 
> > group=root mode=0600 content={{item.tls.pem}} 
> >       with_items: l7config.frontends 
> >       when: item.tls is defined 
> > 
> > Works fine. The with_items can't be a list itself, as Ansible doesn't 
> > appear to 'see' inside the dictionary then, and just treats it as a 
> > string. 
> > 
> > Didn't know about selectattr, so that's one to remember, but now I've 
> > got my original example working I'll stick with it as it seems more 
> > natural to me out of the two! 
> > 
> > Thanks 
> > 
> > Dane 
> > 
> > 
> > On 23 October 2014 00:39, Michael Hoglan <[email protected] <javascript:>> 
> wrote: 
> >> Have you thought about breaking out some jinja expressions to 
> manipulate the 
> >> structure?  In particular the selectrattr() filter. 
> >> http://jinja.pocoo.org/docs/dev/templates/ 
> >> 
> >> Here is a similar example I did 
> >> - hosts: localhost 
> >>   connection: local 
> >>   vars: 
> >>     config: 
> >>       frontend: 
> >>         - id: 1 
> >>           value: test1 
> >>           tls: 
> >>             - key: key1 
> >>               domain: domain1 
> >>         - id: 2 
> >>           value: test2 
> >>       backend: 
> >>         - id: 3 
> >>         - id: 4 
> >>   tasks: 
> >>     - debug: var=item 
> >>       with_items: config.frontend 
> >>     - debug: var=item 
> >>       with_items: config.frontend | selectattr("tls", "defined") | list 
> >> 
> >> And then the output 
> >> (ansible)[ec2-user@ip-10-0-0-226 playbooks]$ ansible-playbook 
> >> test_withitems.yml 
> >> 
> >> PLAY [localhost] 
> >> ************************************************************** 
> >> 
> >> GATHERING FACTS 
> >> *************************************************************** 
> >> ok: [localhost] 
> >> 
> >> TASK: [debug var=item] 
> >> ******************************************************** 
> >> ok: [localhost] => (item={'tls': [{'domain': 'domain1', 'key': 
> 'key1'}], 
> >> 'id': 1, 'value': 'test1'}) => { 
> >>     "item": { 
> >>         "id": 1, 
> >>         "tls": [ 
> >>             { 
> >>                 "domain": "domain1", 
> >>                 "key": "key1" 
> >>             } 
> >>         ], 
> >>         "value": "test1" 
> >>     } 
> >> } 
> >> ok: [localhost] => (item={'id': 2, 'value': 'test2'}) => { 
> >>     "item": { 
> >>         "id": 2, 
> >>         "value": "test2" 
> >>     } 
> >> } 
> >> 
> >> TASK: [debug var=item] 
> >> ******************************************************** 
> >> ok: [localhost] => (item={'tls': [{'domain': 'domain1', 'key': 
> 'key1'}], 
> >> 'id': 1, 'value': 'test1'}) => { 
> >>     "item": { 
> >>         "id": 1, 
> >>         "tls": [ 
> >>             { 
> >>                 "domain": "domain1", 
> >>                 "key": "key1" 
> >>             } 
> >>         ], 
> >>         "value": "test1" 
> >>     } 
> >> } 
> >> 
> >> PLAY RECAP 
> >> ******************************************************************** 
> >> localhost                  : ok=3    changed=0    unreachable=0   
>  failed=0 
> >> 
> >> That should give a list of all frontends that have a tls attribute 
> defined. 
> >> 
> >> Thanks! 
> >> Michael 
> >> 
> >> -- 
> >> 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] <javascript:>. 
> >> To post to this group, send email to [email protected] 
> <javascript:>. 
> >> To view this discussion on the web visit 
> >> 
> https://groups.google.com/d/msgid/ansible-project/7d540723-1226-4574-a067-482c1c916c99%40googlegroups.com.
>  
>
> >> For more options, visit https://groups.google.com/d/optout. 
>

-- 
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/134f26c2-d7c7-4784-8335-a8f2b9e32123%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to