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/9c279d80-cbef-4e54-9c09-4304de5d7176%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.