Question: how to use variable in with_sequence, casting to int results in zero value

I am trying to process the result from the find module. The result contains 3 file paths which i would like to process in a loop.

The number of files depends on the number of files found in the directories and is set by result.matched

Using the with_sequence loop should do the trick, i think. But i ran into a problem.

with_sequence: start=0 end={{ variable }}, expects {{ variable }} to be an integer. Casting {{ variable | int}} results in a zero value, which should be 3.

Any suggestions how to solve or work around my issue?

After casting the variable correctly to an integer, off course i still have to subtract 1 to set the correct index value for the results array.

Variables:

file_path: “roles/ansible-role-iamGroups/files”
template_path: “roles/ansible-role-iamGroups/templates”

declared_int: 3

Tasks:

  • name: find files
    find:
    recurse: yes
    patterns: “*.json”
    paths: “/home/user/PycharmProjects/playbook-aws-billing/roles/ansible-role-iamGroups/templates/”
    register: result

  • name: register numbers variable
    shell: “echo {{result.matched}}”
    register: number

  • name: list number variable (==> string value 3)
    debug: var=number

  • name: list result hard coded (works)
    debug: “var=result.files[{{item}}].path”
    with_sequence: “start=0 end=2 stride=1”

  • name: list result with variable casted to integer (number is casted to 0, should be 3 )
    debug: “var=result.files[{{item}}].path”
    with_sequence: “start=0 end={{ number | int }} stride=1”

  • name: list result with declared integer variable minus 1 (works)
    debug: “var=result.files[{{item}}].path”
    with_sequence: “start=0 end={{ declared_int - 1 }} stride=1”

  • name: list result without casting variable number ( results in parsing error)
    debug: “var=result.files[{{item}}].path”
    with_sequence: “start=0 end={{ number }} stride=1”

Output:

ok: [aws] => {
“changed”: false,
“examined”: 25,
“files”: [
{
“atime”: 1480345980.447014,
“ctime”: 1480345980.451014,
“dev”: 2049,
“gid”: 1000,
“inode”: 523227,
“isblk”: false,
“ischr”: false,
“isdir”: false,
“isfifo”: false,
“isgid”: false,
“islnk”: false,
“isreg”: true,
“issock”: false,
“isuid”: false,
“mode”: “0644”,
“mtime”: 1480345980.447014,
“nlink”: 1,
“path”: “/home/user/PycharmProjects/playbook-aws-billing/roles/ansible-role-iamGroups/templates/prod/ReadOnly/readOnly.json”,
“rgrp”: true,
“roth”: true,
“rusr”: true,
“size”: 1655,
“uid”: 1000,
“wgrp”: false,
“woth”: false,
“wusr”: true,
“xgrp”: false,
“xoth”: false,
“xusr”: false
},
{
“atime”: 1480345980.523014,
“ctime”: 1480345980.527014,
“dev”: 2049,
“gid”: 1000,
“inode”: 523175,
“isblk”: false,
“ischr”: false,
“isdir”: false,
“isfifo”: false,
“isgid”: false,
“islnk”: false,
“isreg”: true,
“issock”: false,
“isuid”: false,
“mode”: “0644”,
“mtime”: 1480345980.527014,
“nlink”: 1,
“path”: “/home/user/PycharmProjects/playbook-aws-billing/roles/ansible-role-iamGroups/templates/prod/PowerUser/iamAccess.json”,
“rgrp”: true,
“roth”: true,
“rusr”: true,
“size”: 136,
“uid”: 1000,
“wgrp”: false,
“woth”: false,
“wusr”: true,
“xgrp”: false,
“xoth”: false,
“xusr”: false
},
{
“atime”: 1480345980.531014,
“ctime”: 1480345980.539014,
“dev”: 2049,
“gid”: 1000,
“inode”: 523226,
“isblk”: false,
“ischr”: false,
“isdir”: false,
“isfifo”: false,
“isgid”: false,
“islnk”: false,
“isreg”: true,
“issock”: false,
“isuid”: false,
“mode”: “0644”,
“mtime”: 1480345980.531014,
“nlink”: 1,
“path”: “/home/user/PycharmProjects/playbook-aws-billing/roles/ansible-role-iamGroups/templates/prod/PowerUser/powerUser.json”,
“rgrp”: true,
“roth”: true,
“rusr”: true,
“size”: 138,
“uid”: 1000,
“wgrp”: false,
“woth”: false,
“wusr”: true,
“xgrp”: false,
“xoth”: false,
“xusr”: false
}
],
“invocation”: {
“module_args”: {
“age”: null,
“age_stamp”: “mtime”,
“contains”: null,
“file_type”: “file”,
“follow”: false,
“get_checksum”: false,
“hidden”: false,
“paths”: [
“/home/user/PycharmProjects/playbook-aws-billing/roles/ansible-role-iamGroups/templates/”
],
“patterns”: [
“*.json”
],
“recurse”: true,
“size”: null,
“use_regex”: false
},
“module_name”: “find”
},
“matched”: 3,
“msg”: “”
}

TASK [ansible-role-iamGroups : register numbers variable] **************************************************************************************************************************************************************************************************************************************************
task path: /home/user/PycharmProjects/playbook-aws-billing/roles/ansible-role-iamGroups/tasks/main.yml:9
Using module file /home/user/ansible/lib/ansible/modules/core/commands/command.py
ESTABLISH LOCAL CONNECTION FOR USER: user
EXEC /bin/sh -c ‘( umask 77 && mkdir -p “echo $HOME/.ansible/tmp/ansible-tmp-1480495766.92-247180421426282” && echo ansible-tmp-1480495766.92-247180421426282=“echo $HOME/.ansible/tmp/ansible-tmp-1480495766.92-247180421426282” ) && sleep 0’
PUT /tmp/tmpO5IsA5 TO /home/user/.ansible/tmp/ansible-tmp-1480495766.92-247180421426282/command.py
EXEC /bin/sh -c ‘chmod u+x /home/user/.ansible/tmp/ansible-tmp-1480495766.92-247180421426282/ /home/user/.ansible/tmp/ansible-tmp-1480495766.92-247180421426282/command.py && sleep 0’
EXEC /bin/sh -c ‘/usr/bin/python /home/user/.ansible/tmp/ansible-tmp-1480495766.92-247180421426282/command.py; rm -rf “/home/user/.ansible/tmp/ansible-tmp-1480495766.92-247180421426282/” > /dev/null 2>&1 && sleep 0’
changed: [aws] => {
“changed”: true,
“cmd”: “echo 3”,
“delta”: “0:00:00.003979”,
“end”: “2016-11-30 09:49:27.332742”,
“invocation”: {
“module_args”: {
“_raw_params”: “echo 3”,
“_uses_shell”: true,
“chdir”: null,
“creates”: null,
“executable”: null,
“removes”: null,
“warn”: true
},
“module_name”: “command”
},
“rc”: 0,
“start”: “2016-11-30 09:49:27.328763”,
“stderr”: “”,
“stdout”: “3”,
“stdout_lines”: [
“3”
],
“warnings”:
}

TASK [ansible-role-iamGroups : list number variable (==> string value 3)] **********************************************************************************************************************************************************************************************************************************
task path: /home/user/PycharmProjects/playbook-aws-billing/roles/ansible-role-iamGroups/tasks/main.yml:13
ok: [aws] => {
“number”: {
“changed”: true,
“cmd”: “echo 3”,
“delta”: “0:00:00.003979”,
“end”: “2016-11-30 09:49:27.332742”,
“rc”: 0,
“start”: “2016-11-30 09:49:27.328763”,
“stderr”: “”,
“stdout”: “3”,
“stdout_lines”: [
“3”
],
“warnings”:
}
}

TASK [ansible-role-iamGroups : list result hard coded (works)] *********************************************************************************************************************************************************************************************************************************************
task path: /home/user/PycharmProjects/playbook-aws-billing/roles/ansible-role-iamGroups/tasks/main.yml:16
ok: [aws] => (item=0) => {
“invocation”: {
“module_args”: {
“var”: “result.files[0].path”
},
“module_name”: “debug”
},
“item”: “0”,
“result.files[0].path”: “/home/user/PycharmProjects/playbook-aws-billing/roles/ansible-role-iamGroups/templates/prod/ReadOnly/readOnly.json”
}
ok: [aws] => (item=1) => {
“invocation”: {
“module_args”: {
“var”: “result.files[1].path”
},
“module_name”: “debug”
},
“item”: “1”,
“result.files[1].path”: “/home/user/PycharmProjects/playbook-aws-billing/roles/ansible-role-iamGroups/templates/prod/PowerUser/iamAccess.json”
}
ok: [aws] => (item=2) => {
“invocation”: {
“module_args”: {
“var”: “result.files[2].path”
},
“module_name”: “debug”
},
“item”: “2”,
“result.files[2].path”: “/home/user/PycharmProjects/playbook-aws-billing/roles/ansible-role-iamGroups/templates/prod/PowerUser/powerUser.json”
}

TASK [ansible-role-iamGroups : list result with variable casted to integer (number is casted to 0, should be 3 )] ******************************************************************************************************************************************************************************************
task path: /home/user/PycharmProjects/playbook-aws-billing/roles/ansible-role-iamGroups/tasks/main.yml:20
ok: [aws] => (item=0) => {
“invocation”: {
“module_args”: {
“var”: “result.files[0].path”
},
“module_name”: “debug”
},
“item”: “0”,
“result.files[0].path”: “/home/user/PycharmProjects/playbook-aws-billing/roles/ansible-role-iamGroups/templates/prod/ReadOnly/readOnly.json”
}

TASK [ansible-role-iamGroups : list result with declared integer variable minus 1 (works)] ****************************************************************************************************************************************************************************************************************
task path: /home/user/PycharmProjects/playbook-aws-billing/roles/ansible-role-iamGroups/tasks/main.yml:24
ok: [aws] => (item=0) => {
“invocation”: {
“module_args”: {
“var”: “result.files[0].path”
},
“module_name”: “debug”
},
“item”: “0”,
“result.files[0].path”: “/home/user/PycharmProjects/playbook-aws-billing/roles/ansible-role-iamGroups/templates/prod/ReadOnly/readOnly.json”
}
ok: [aws] => (item=1) => {
“invocation”: {
“module_args”: {
“var”: “result.files[1].path”
},
“module_name”: “debug”
},
“item”: “1”,
“result.files[1].path”: “/home/user/PycharmProjects/playbook-aws-billing/roles/ansible-role-iamGroups/templates/prod/PowerUser/iamAccess.json”
}
ok: [aws] => (item=2) => {
“invocation”: {
“module_args”: {
“var”: “result.files[2].path”
},
“module_name”: “debug”
},
“item”: “2”,
“result.files[2].path”: “/home/user/PycharmProjects/playbook-aws-billing/roles/ansible-role-iamGroups/templates/prod/PowerUser/powerUser.json”
}

TASK [ansible-role-iamGroups : list result without casting variable number ( results in parsing error)] ****************************************************************************************************************************************************************************************************
task path: /home/user/PycharmProjects/playbook-aws-billing/roles/ansible-role-iamGroups/tasks/main.yml:28
fatal: [aws]: FAILED! => {
“failed”: true,
“msg”: “unknown error parsing with_sequence arguments: u"start=0 end={u’changed’: True, u’end’: u’2016-11-30 09:49:27.332742’, u’stdout’: u’3’, u’cmd’: u’echo 3’, u’rc’: 0, u’start’: u’2016-11-30 09:49:27.328763’, u’stderr’: u’‘, u’delta’: u’0:00:00.003979’, ‘stdout_lines’: [u’3’], u’warnings’: } stride=1". Error was: can’t parse arg end=u"{u’changed’:" as integer”
}
to retry, use: --limit @/home/user/PycharmProjects/playbook-aws-billing/billing-iam-pb.retry

PLAY RECAP *************************************************************************************************************************************************************************************************************************************************************************************************
aws : ok=7 changed=1 unreachable=0 failed=1

I am trying to process the result from the find module. The result contains
3 file paths which i would like to process in a loop.
The number of files depends on the number of files found in the directories
and is set by result.matched

Using the with_sequence loop should do the trick, i think. But i ran into a
problem.

with_sequence: start=0 end={{ variable }}, expects {{ variable }} to be an
integer. Casting {{ variable | int}} results in a zero value, which should
be 3.

Any suggestions how to solve or work around my issue?

Why not use with_items?

After casting the variable correctly to an integer, off course i still have
to subtract 1 to set the correct index value for the results array.

*Variables*:

file_path: "roles/ansible-role-iamGroups/files"
template_path: "roles/ansible-role-iamGroups/templates"

declared_int: 3

*Tasks*:

- name: find files
  find:
    recurse: yes
    patterns: "*.json"
    paths:
"/home/user/PycharmProjects/playbook-aws-billing/roles/ansible-role-iamGroups/templates/"
  register: result

- name: register numbers variable
  shell: "echo {{result.matched}}"
  register: number

- name: list number variable (==> string value 3)
  debug: var=number

- name: list result hard coded (works)
  debug: "var=result.files[{{item}}].path"
  with_sequence: "start=0 end=2 stride=1"

- name: list result
   debug: var=item.path
   with_items: result.files

Hi Kai,

Thanks for your reaction.

I think item.path won’t work because of the structure of result.files.
result.files contains a list […path…], [.path…] ,So in the debug var i should reference item[0].path , item[1].path

I worked my way around creating a list

create a list of policies to be defined

  • name: create list of files
    debug:
    msg: “{{ result.files | map(attribute=‘path’) | list }}”
    register: fileList