passing parameters to roles

23 views
Skip to first unread message

Neil Watson

unread,
Oct 28, 2016, 12:56:44 PM10/28/16
to Ansible Project
Greetings,

I'm trying to pass a data structure to a role, but it's not working out. What have I done wrong?

main.yml:

---
- hosts: localhost

  vars:

    image:

      one:
        state: present
        path: /usr/src


  roles:

    - { role: test, image: "{{ image.one }}" }

roles/test/tasks/main.yml:

---
  - debug:
      msg: "state: {{ image.state }}, path: {{ image.path }}"

Expected results:

debug: state: present, path: /usr/src

Actual results:

TASK [test : debug] ************************************************************
fatal: [localhost]: FAILED! => {"failed": true, "msg": "{{ image.one }}: {{
image.one }}: {{ image.one }}: {{ image.one }}: {{ image.one }}: {{ image.one
}}: {{ image.one }}: {{ image.one }}: {{ image.one }}: {{ image.one }}: {{
image.one }}: {{ image.one }}: {{ image.one }}: {{ image.one }}: {{ image.one
}}: {{ image.one }}: {{ image.one }}: {{ image.one }}: {{ image.one }}: {{
image.one }}: {{ image.one }}: {{ image.one }}: {{ image.one }}: {{ image.one
}}: {{ image.one }}: {{ image.one }}: {{ image.one }}: {{ image.one }}: {{
image.one }}: {{ image.one }}: {{ image.one }}: {{ image.one }}: {{ image.one
}}: {{ image.one }}: {{ image.one }}: {{ image.one }}: {{ image.one }}: {{
image.one }}: {{ image.one }}: {{ image.one }}: {{ image.one }}: {{ image.one
}}: {{ image.one }}: {{ image.one }}: {{ image.one }}: {{ image.one }}: {{
image.one }}: {{ image.one }}: {{ image.one }}: {{ image.one }}: {{ image.one
}}: {{ image.one }}: {{ image.one }}: {{ image.one }}: {{ image.one }}: {{
image.one }}: {{ image.one }}: {{ image.one }}: {{ image.one }}: {{ image.one
}}: {{ image.one }}: {{ image.one }}: {{ image.one }}: {{ image.one }}: {{
image.one }}: {{ image.one }}: {{ image.one }}: {{ image.one }}: {{ image.one
}}: {{ image.one }}: {{ image.one }}: {{ image.one }}: {{ image.one }}: {{
image.one }}: {{ image.one }}: {{ image.one }}: {{ image.one }}: {{ image.one
}}: {{ image.one }}: {{ image.one }}: {{ image.one }}: {{ image.one }}: {{
image.one }}: {{ image.one }}: {{ image.one }}: {{ image.one }}: {{ image.one
}}: {{ image.one }}: {{ image.one }}: {{ image.one }}: {{ image.one }}: {{
image.one }}: {{ image.one }}: {{ image.one }}: {{ image.one }}: {{ image.one
}}: {{ image.one }}: {{ image.one }}: {{ image.one }}: {{ image.one }}: {{
image.one }}: {{ image.one }}: {{ image.one }}: {{ image.one }}: {{ image.one
}}: {{ image.one }}: {{ image.one }}: {{ image.one }}: {{ image.one }}: {{
image.one }}: {{ image.one }}: {{ image.one }}: {{ image.one }}: {{ image.one
}}: {{ image.one }}: {{ image.one }}: {{ image.one }}: {{ image.one }}: {{
image.one }}: {{ image.one }}: {{ image.one }}: {{ image.one }}: {{ image.one
}}: {{ image.one }}: {{ image.one }}: {{ image.one }}: {{ image.one }}: {{
image.one }}: {{ image.one }}: {{ image.one }}: {{ image.one }}: {{ image.one
}}: {{ image.one }}: {{ image.one }}: {{ image.one }}: {{ image.one }}:
recursive loop detected in template string: {{ image.one }}"}

Kai Stian Olstad

unread,
Oct 28, 2016, 2:44:32 PM10/28/16
to ansible...@googlegroups.com
On 28. okt. 2016 18:56, Neil Watson wrote:
> Greetings,
>
> I'm trying to pass a data structure to a role, but it's not working out.
> What have I done wrong?
>
> main.yml:
> ---
> - hosts: localhost
> vars:
> image:
> one:
> state: present
> path: /usr/src
> roles:
> - { role: test, image: "{{ image.one }}" }
>
> roles/test/tasks/main.yml:
> ---
> - debug:
> msg: "state: {{ image.state }}, path: {{ image.path }}"
>
> Expected results:
>
> debug: state: present, path: /usr/src

First you define image in the vars section, and then you overwrite image
with itself when you call the role, you can't do that.

--
Kai Stian Olstad

Neil Watson

unread,
Oct 28, 2016, 2:53:25 PM10/28/16
to Ansible Project, ansible-pr...@olstad.com
My intention is to pass it to the role not redefine it. What do you suggest?

Kai Stian Olstad

unread,
Oct 28, 2016, 4:09:31 PM10/28/16
to ansible...@googlegroups.com
On 28. okt. 2016 20:53, Neil Watson wrote:
> My intention is to pass it to the role not redefine it. What do you suggest?

You have a few options.
You don't need to pass them to the role, variables is global so you can
use them directly in the role, image.one.state and image.one.path.

Instead of using the image variable in the role, you can rename it to
img. But since variables is global in Ansible I would recommend to
prefix variables in a role with the role name, so you could use
test_image in the role.

--
Kai Stian Olstad
Reply all
Reply to author
Forward
0 new messages