Thanks for the suggestion - Unfortunately it doesn't work for me :-( I get:

TASK: [users | Create Unix users from the users.yml file] 
********************* 
fatal: [ralph] => error while evaluating conditional: inventory_hostname in 
item.value.access_to

FATAL: all hosts have already failed -- aborting


I tried this in the play:

  - name: debug output
    debug: msg="access to is {{item.access_to }}"
    with_items: unix_users

...and got this as output:

    "msg": "access to is ['dev_hosts', 'test_hosts', 'uat_hosts']"


...so it's getting it, and even knows its a list of names. If I put the 
hostname in the list it matches and we're all good - but I'd really rather 
use Ansible host groups. I guess I need a way to 'eval()' the list so that 
each of items in the list is looked up in groups[]. I tried to do this as a 
template, and successfully made up the right sort of 'code' as text, but 
then couldn't find a way to have it re-evaluated into actual data.

I'm thinking I need to find a whole different way to do this, but can't 
find any good advice on how I should approach the problem.

Cheers,

...Ralph

On Friday, 13 November 2015 18:24:18 UTC, Joanna Delaporte wrote:
>
> Does the following work?
>
>    when: "inventory_hostname in item.*value*.access_to"
>
> I have used dicts a little for users, and that is how I reference details 
> for users.
>
> Joanna
>
> On Friday, November 13, 2015 at 12:02:25 PM UTC-6, Ralph Bolton wrote:
>>
>> Hi,
>>
>> I'm trying to manage a small number of Unix users on a smallish estate of 
>> servers (~100 servers). My users are either devs, sysadmins or support, and 
>> need different access to different boxes. I've got a nice way to give them 
>> differing levels of sudo access, but now want to figure out how to grant 
>> and revoke access to different boxes. Obviously, I've got a variety of 
>> groups in my ansible hosts file, and I have a Yaml definition for my users 
>> and groups.
>>
>> For example, the devs really only need access to the host groups 
>> dev_servers and test_servers. However, let's say user Fred needs temporary 
>> access to production, I'd like to add him to a group, run Ansible and then 
>> let him do his work. When he's done, remove him from that group and then 
>> run Ansible to revoke his access.
>>
>> So far, I have a vars/main.yml that looks something like:
>>
>> ---
>> unix_groups:
>>   - group: general
>>     state: present
>>     gid: 1500
>>
>> unix_users:
>>    - user: fred
>>      state: present
>>      uid: 5000
>>      group: general
>>      root_access: restricted
>>   - user: barney
>>     state: present
>>     uid: 5001
>>     group: general
>>     root_access: none
>>   - user: wilma
>>     state: present
>>     uid: 5002
>>     group: general
>>     root_access: full
>>
>>
>>
>> ...and a tasks/main.yml that contains:
>>
>> - name: Pull in user/group variables from role_vars
>>   include_vars: main.yml
>>
>> - name: Create Unix groups from the groups.yml file
>>   action: group name={{ item.group }} state={{ item.state }} gid={{ item.gid 
>> }}
>>   with_items: unix_groups
>>
>> - name: Create Unix users from the users.yml file
>>   action: user name={{ item.user }} state={{ item.state }} group={{ item.
>> group | default(None) }} uid={{ item.uid | default(None) }} shell=/bin/bash 
>> expires=0
>>   with_items: unix_users
>>
>> - name: Create sudoers file if the user is allowed root access
>>   template: src=../templates/sudoers-{{ item.root_access|default(None) 
>> }}.j2 dest=/etc/sudoers.d/{{ item.user }} owner=root group=root mode=0440
>>   when: item.state == "present" and (item.root_access|default(None) == 
>> "full" or item.root_access|default(None) == "restricted")
>>   with_items: unix_users
>>
>> - name: Revoke root access if user is not allowed it
>>   file: dest=/etc/sudoers.d/{{ item.user }} state=absent
>>   when: item.state != "present" or (item.root_access|default(None) != 
>> "full" and item.root_access|default(None) != 'restricted')
>>   with_items: unix_users
>>
>> All of this works nicely - if I were to set Wilma's root_access to 
>> 'restricted' or 'none', then her sudo config would either change or be 
>> removed entirely. Likewise, if I set her 'state' to 'absent' her account if 
>> removed from the systems. This works nicely for all the hosts I apply this 
>> role to (which at the moment is all of them). So far so good...
>>
>> Now I'd like to be able to add users to certain hosts (I'm guessing host 
>> groups makes most sense). I tried adding something like
>>
>>     access_to: test_hosts, dev_hosts
>>
>> ...and
>>
>>     access_to:
>>     - test_hosts
>>     - dev_hosts
>>
>> ...to vars/main.yml and then tried various permutations of "when" clause 
>> in my user creation. For example:
>>
>>    when: "inventory_hostname in item.access_to"
>>
>> ...but nothing I've tried seems to work. I realise the normal pattern is 
>> to apply a role to certain host groups, and so perhaps I need to apply 
>> different roles to different groups and yet somehow supply them with my 
>> single Yaml user definition. I'm not sure how I'd revoke access if I'm not 
>> running against a group of hosts, but I'm sure I could figure something out 
>> there.
>>
>> All this feels like I've made this a lot harder for myself than I should 
>> have done. What's the "right" way to do this sort of thing? Any ideas if I 
>> can make what I have work in some sensible way, or should I be reworking it 
>> somehow else?
>>
>> Cheers,
>>
>> ...Ralph
>>
>>

-- 
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/b71648a5-1251-427c-9832-eb1c90d107ce%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to