# Error with playbook, which should create user accounts and set authorized public keys

**URL:** <https://forum.ansible.com/t/error-with-playbook-which-should-create-user-accounts-and-set-authorized-public-keys/18771>\
**Category:** Ansible Project\
**Created:** [July 15, 2015, 11:33am UTC](https://forum.ansible.com/t/error-with-playbook-which-should-create-user-accounts-and-set-authorized-public-keys/18771 "2015-07-15T11:33:25Z")\
**Posts on this page:** 9\
**Page:** 1

<div class="post-metadata">

**Author:** ![Dimitar\_Hristov](https://avatars.discourse-cdn.com/v4/letter/d/54ee81/32.png) [@Dimitar\_Hristov](https://forum.ansible.com/u/Dimitar_Hristov)\
**Post date:** [July 15, 2015, 11:33am UTC](https://forum.ansible.com/t/error-with-playbook-which-should-create-user-accounts-and-set-authorized-public-keys/18771/1 "2015-07-15T11:33:25Z")

</div>

Hi Guys,

I get an error when I run a playbook, which aims to create new users and set authorized keys for them. The error:

TASK: [create new users] \*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*  
fatal: [testvm1] =\> with\_items expects a list or a set  
fatal: [testvm2] =\> with\_items expects a list or a set

Here’s a part of the playbook (the first task fails):

- name: create new users  
user: name={{ item.name }} group=wheel append=yes password={{user\_password}}  
with\_items: “{{users}}”

- name: set pub keys  
authorized\_key: “user={{ item.0.name }} key=‘{{ lookup(‘file’, item.1) }}’”  
with\_subelements:

- users

- authorized

- name: set pass expiration  
command: /usr/bin/chage -d 0 {{ item.name }}  
with\_items: “{{users}}”

Here’s the var file:

---

<div class="post-metadata">

**Author:** ![Brian\_Coca](https://avatars.discourse-cdn.com/v4/letter/b/6de8d8/32.png) [@Brian\_Coca](https://forum.ansible.com/u/Brian_Coca)\
**Post date:** [July 15, 2015, 3:59pm UTC](https://forum.ansible.com/t/error-with-playbook-which-should-create-user-accounts-and-set-authorized-public-keys/18771/2 "2015-07-15T15:59:40Z")

</div>

that looks correct, very similar to what i was doing.

can you run with -vvvv and also - debug: var=users ?

---

<div class="post-metadata">

**Author:** ![Dimitar\_Hristov](https://avatars.discourse-cdn.com/v4/letter/d/54ee81/32.png) [@Dimitar\_Hristov](https://forum.ansible.com/u/Dimitar_Hristov)\
**Post date:** [July 16, 2015, 10:23am UTC](https://forum.ansible.com/t/error-with-playbook-which-should-create-user-accounts-and-set-authorized-public-keys/18771/3 "2015-07-16T10:23:23Z")

</div>

Hi Brian,

here’s the info you asked for:

TASK: [debug var=users] \*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*  
 ESTABLISH CONNECTION FOR USER: dimitar  
 ESTABLISH CONNECTION FOR USER: dimitar  
ok: [testvm1] =\> {  
“var”: {  
“users”: “users”  
}  
}  
ok: [testvm2] =\> {  
“var”: {  
“users”: “users”  
}  
}

TASK: [create new users] \*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*  
fatal: [testvm2] =\> with\_items expects a list or a set  
fatal: [testvm1] =\> with\_items expects a list or a set

FATAL: all hosts have already failed – aborting

Hope it helps 🙂

Regards,  
Dimitar

---

<div class="post-metadata">

**Author:** ![Shawn\_Mulford](https://avatars.discourse-cdn.com/v4/letter/s/b9e5f3/32.png) [@Shawn\_Mulford](https://forum.ansible.com/u/Shawn_Mulford)\
**Post date:** [July 16, 2015, 6:23pm UTC](https://forum.ansible.com/t/error-with-playbook-which-should-create-user-accounts-and-set-authorized-public-keys/18771/4 "2015-07-16T18:23:50Z")

</div>

You loop needs something to iterate over. Since ansible treats variables as strings, you need to make is a list. Try something like below:

# cat ./split\_users.yml

---

<div class="post-metadata">

**Author:** ![Brian\_Coca](https://avatars.discourse-cdn.com/v4/letter/b/6de8d8/32.png) [@Brian\_Coca](https://forum.ansible.com/u/Brian_Coca)\
**Post date:** [July 16, 2015, 6:35pm UTC](https://forum.ansible.com/t/error-with-playbook-which-should-create-user-accounts-and-set-authorized-public-keys/18771/5 "2015-07-16T18:35:15Z")

</div>

your debug is indicative that 'users' is undefined, that is why it is  
failing (we made the message much clearer in 2.0)

---

<div class="post-metadata">

**Author:** ![Dimitar\_Hristov](https://avatars.discourse-cdn.com/v4/letter/d/54ee81/32.png) [@Dimitar\_Hristov](https://forum.ansible.com/u/Dimitar_Hristov)\
**Post date:** [July 20, 2015, 8:49am UTC](https://forum.ansible.com/t/error-with-playbook-which-should-create-user-accounts-and-set-authorized-public-keys/18771/6 "2015-07-20T08:49:17Z")

</div>

Ok, I managed to fixed with what you and Shawn said, but why the following happens:

When I define this in my playbook:  
vars:  
include: /etc/ansible/add\_users/global\_vars/main.yml

And then I have the following in my vars file:

---

<div class="post-metadata">

**Author:** ![Dimitar\_Hristov](https://avatars.discourse-cdn.com/v4/letter/d/54ee81/32.png) [@Dimitar\_Hristov](https://forum.ansible.com/u/Dimitar_Hristov)\
**Post date:** [July 20, 2015, 8:51am UTC](https://forum.ansible.com/t/error-with-playbook-which-should-create-user-accounts-and-set-authorized-public-keys/18771/7 "2015-07-20T08:51:29Z")

</div>

Please ignore the differences in user names and public keys, they’re the same (I used to change the names in this thread only).

---

<div class="post-metadata">

**Author:** ![Brian\_Coca](https://avatars.discourse-cdn.com/v4/letter/b/6de8d8/32.png) [@Brian\_Coca](https://forum.ansible.com/u/Brian_Coca)\
**Post date:** [July 20, 2015, 3:41pm UTC](https://forum.ansible.com/t/error-with-playbook-which-should-create-user-accounts-and-set-authorized-public-keys/18771/8 "2015-07-20T15:41:53Z")

</div>

vars:  
&nbsp;&nbsp;&nbsp;&nbsp;include: /etc/ansible/add\_users/global\_vars/main.yml

^ that does not work, you want:

vars\_files:  
&nbsp;&nbsp;- /etc/ansible/add\_users/global\_vars/main.yml

[https://docs.ansible.com/playbooks\_variables.html#variable-file-separation](https://docs.ansible.com/playbooks_variables.html#variable-file-separation)

include is for plays or tasks, for vars you have vars\_files or as a  
task include\_vars.

---

<div class="post-metadata">

**Author:** ![Dimitar\_Hristov](https://avatars.discourse-cdn.com/v4/letter/d/54ee81/32.png) [@Dimitar\_Hristov](https://forum.ansible.com/u/Dimitar_Hristov)\
**Post date:** [July 21, 2015, 7:00am UTC](https://forum.ansible.com/t/error-with-playbook-which-should-create-user-accounts-and-set-authorized-public-keys/18771/9 "2015-07-21T07:00:30Z")

</div>

Yes, it works like this:  
vars\_files:

- /etc/ansible/add\_users/global\_vars/main.yml

Thanks,  
Dimitar
