Paul,

I recently encountered what I believe the be the same scenario. I googled 
around and couldn't seem to find anything to fit the scenario so I used the 
following approach (probably re-inventing the wheel). The key is to make 
use of roles, playbooks and vars separately. I've adapted your example and 
truncated it for simplicity:

1. Create a role 'groups_users' consisting of least 
'roles/groups_users/tasks/main.yml':
---
- name: Add groups
  groups: name={{ item.name }}
  with_items: groups
- name: Add users
  user: name={{ item.name }}
        uid={{ item.uid }}
  with_items: users

2. Define these groups in your inventory file 'myhosts':
[myhosts]
host1
host2
host3

[groups_users_sysadmins]
host1
host2
host3

[groups_users_db]
host1

3. Create external vars files for each of your groups:

'external_vars/groups_users_sysadmins':
---
groups:
- name: sysadmins
users:
- name=username1
  uid=1234
- name=username2
  uid=2345

'external_vars/groups_users_db':
---
groups:
- name: db
users:
- name=username3
  uid=3456
- name=username4
  uid=4567

4. Create group_vars files for each group:

'group_vars/myhosts':
---
groups_users_sysadmins: no
groups_users_db: no

'group_vars/myhosts':
---
groups_users_sysadmins: yes

'group_vars/db':
---
groups_users_db: yes

5. Create a playbook that adds each group conditionally:
'groups_users.yml':
---
- name: Add sysadmins group and users
  hosts: all
  vars_files:
  - external_vars/groups_users_sysadmins.yml
  roles:
  - { role: groups_users, when: groups_users_sysadmins == True }

- name: Add db group and users
  hosts: all
  vars_files:
  - external_vars/groups_users_db.yml
  roles:
  - { role: groups_users, when: groups_users_db == True }

It's quite a different approach and requires a few more files, but it 
allows for more scalability.

On Tuesday, 28 October 2014 03:55:03 UTC+13, Paul Slootman wrote:
>
> Hi,
> A new ansible user here... I've been perusing the mailing list archives 
> and have gathered a lot of useful tidbits.
>
> I've been fairly successful in figuring out how to create a set of users 
> on a list of hosts. However, what I'm not so clear about is how to create 
> different sets of users on different categories of hosts. We're a software 
> house that administrates the server farms at our customers. Let's say we 
> have 20 customers, and each customer can have 3-20 servers; these servers 
> fall into different categories as well: application servers, database 
> servers, test app. servers, test DB servers for example.
>
> One set of users should be created on all systems always, namely our 
> sysadmins.
> Another set of users should only be created on the database servers; 
> likewise for the application servers.
>
> The approach I'd find logical would be to write a playbook such as:
>
> - hosts: all_hosts
>   tasks:
>   - name: Add sysadmin users
>     user: name={{ item.key }} password={{ item.value.password }} uid={{ 
> item.value.uid }} group={{ item.value.group }} groups="" comment="{{ 
> item.value.comment }}" state={{ item.value.state }} update_password=always
>     with_dict: sysadmin_user
>  
> - hosts: db_hosts
>   tasks:
>   - name: Add DBA users
>     user: name={{ item.key }} password={{ item.value.password }} uid={{ 
> item.value.uid }} group={{ item.value.group }} groups="" comment="{{ 
> item.value.comment }}" state={{ item.value.state }} update_password=always
>     with_dict: dba_user
>  
> - hosts: application_hosts
>   tasks:
>   - name: Add application users
>     user: name={{ item.key }} password={{ item.value.password }} uid={{ 
> item.value.uid }} group={{ item.value.group }} groups="" comment="{{ 
> item.value.comment }}" state={{ item.value.state }} update_password=always
>     with_dict:appl_user
>
> This would work, but would entail listing all hosts at least twice: once 
> for the "all_hosts" list, and once for the specific type of host. I'd like 
> to be able to compose the "all_hosts" list automatically out of the other 
> lists. I've tried a couple of ways after reading things in the mailing list 
> archive that might be applicable, but haven't had any success.
>
> So, in short, my question really boils down to: Is it possible to merge 
> existing host lists so that I don't have to repeat hosts in different 
> lists?  The same question also applies to user lists, although I suspect 
> that if it's possible with host lists, the same method will work for user 
> lists as well.
>
> (Being able to merge host lists would mean it would be possible to define 
> hosts in lists according to customer + type, and then build different host 
> lists such as "all DB hosts" or "all hosts at customer XYZ".)
>
>
> Thanks!
>

-- 
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 [email protected].
To post to this group, send email to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/ansible-project/9a150c00-d76d-4d43-ac0f-25dd2ad7ae99%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to