Getting pieces from a list with ansible

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?

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!).

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!

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?