Getting pieces from a list with ansible

104 views
Skip to first unread message

Dan C

unread,
Jan 18, 2016, 10:33:56 AM1/18/16
to Ansible Project
Hi, I know I am provably misunderstanding somthing, but I am not able to find a solution to my (rather simple) problem.

What I want is quite easy. I have a list and I want to get the last (or first) X elements of it:


Example:

- set_fact: mylist={{["l10","j82","b83","8jk","j83"]|list}}
- debug: var=mylist
- set_fact: max_n={{1|int}}
- debug: var=max_n
- debug: var=mylist[-{{max_n}}:]

Since here everything seems to work ok with the output:


PLAY [deploy] ******************************************************************


TASK
[setup] *******************************************************************
ok
: [localhost]


TASK
[cleanup_s3_folder : set_fact] ********************************************
ok
: [localhost]


TASK
[cleanup_s3_folder : debug] ***********************************************
ok
: [localhost] => {
   
"mylist": [
       
"l10",
       
"j82",
       
"b83",
       
"8jk",
       
"j83"
   
]
}


TASK
[cleanup_s3_folder : set_fact] ********************************************
ok
: [localhost]


TASK
[cleanup_s3_folder : debug] ***********************************************
ok
: [localhost] => {
   
"max_n": "1"
}


TASK
[cleanup_s3_folder : debug] ***********************************************
ok
: [localhost] => {
   
"mylist[-1:]": [
       
"j83"
   
]
}


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

Now, this last list, containing in this case only the value "j83", I want it on a variable to use further on, so I try with:

- set_fact: elements=mylist[-{{max_n}}:]
- debug: var=elements

- set_fact: elements2={{ mylist[-{{max_n}}:] }}
- debug: var=elements2



And I am not getting what I want:

PLAY [deploy] ******************************************************************


TASK
[setup] *******************************************************************
ok
: [localhost]


TASK
[cleanup_s3_folder : set_fact] ********************************************
ok
: [localhost]


TASK
[cleanup_s3_folder : debug] ***********************************************
ok
: [localhost] => {
   
"mylist": [
       
"l10",
       
"j82",
       
"b83",
       
"8jk",
       
"j83"
   
]
}


TASK
[cleanup_s3_folder : set_fact] ********************************************
ok
: [localhost]


TASK
[cleanup_s3_folder : debug] ***********************************************
ok
: [localhost] => {
   
"max_n": "1"
}


TASK
[cleanup_s3_folder : debug] ***********************************************
ok
: [localhost] => {
   
"mylist[-1:]": [
       
"j83"
   
]
}


TASK
[cleanup_s3_folder : set_fact] ********************************************
ok
: [localhost]


TASK
[cleanup_s3_folder : debug] ***********************************************
ok
: [localhost] => {
   
"elements": "mylist[-1:]"
}


TASK
[cleanup_s3_folder : set_fact] ********************************************
fatal
: [localhost]: FAILED! => {"failed": true, "msg": "ERROR! template error while templating string: expected token ':', got '}'"}


PLAY RECAP
*********************************************************************
localhost                  
: ok=8    changed=0    unreachable=0    failed=1



Is there an easy way to get a VARIABLE piece of a list into a new variable?


Brian Coca

unread,
Jan 18, 2016, 1:25:58 PM1/18/16
to Ansible Project
first thing, this is not needed:

- set_fact: mylist={{["l10","j82","b83","8jk","j83"]|list}}

this should be enough:
- set_fact:
mylist: ["l10","j82","b83","8jk","j83"]

another issue is that moustaches do not stack! and you need moustaches
for variables


- set_fact: elements={{mylist[-max_n:]}}


the first way you did it you had a string mylist, .not a variable, the
second you were putting {{ }} inside of {{}} which does not work
(moustaches do not stack!).
> --
> 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-proje...@googlegroups.com.
> To post to this group, send email to ansible...@googlegroups.com.
> To view this discussion on the web visit
> https://groups.google.com/d/msgid/ansible-project/69a9793b-9a30-422d-aed8-504672876d78%40googlegroups.com.
> For more options, visit https://groups.google.com/d/optout.



--
Brian Coca

Dan C

unread,
Jan 19, 2016, 3:17:07 AM1/19/16
to Ansible Project
Thanks Brian,

You are right about not needing the "|list", it works perfectly without it.

But I am yet not able to assign the variable, using what you suggested I am now getting a different error:

- set_fact: mylist={{["l10","j82","b83","8jk","j83"]}}
- debug: var=mylist
- set_fact: max_n={{1|int}}
- debug: var=max_n
- debug: var=mylist[-{{max_n}}:]


- set_fact: elements={{mylist[-max_n:]}}
- debug: var=elements




[...]


TASK
[debug] *******************************************************************

ok
: [localhost] => {
   
"mylist[-1:]": [
       
"j83"
   
]
}



TASK
[set_fact] ****************************************************************
fatal
: [localhost]: FAILED! => {"failed": true, "msg": "ERROR! an unexpected type error occurred. Error was bad operand type for unary -: 'unicode'"}

Thanks!

Dan C

unread,
Jan 21, 2016, 7:28:52 AM1/21/16
to Ansible Project
Hi again,

So, it is not possible to get a "variable" piece of a "variable" list?

What I need is to maintain a fixed number of objects in a storage, I want to have always only the "last X" objects and delete all the rest.
Is there any other way to do so?


Reply all
Reply to author
Forward
0 new messages