Can you please check this as well:
when: item.get('state', 'present') == 'present'
I am just sending this reply quickly without reading the whole question,
but I think that will solve your problem.
For Reference, please check this role:
https://github.com/edx/configuration/blob/master/playbooks/roles/user/tasks/main.yml#L118
On Monday, November 16, 2015 at 2:38:05 PM UTC+5, Ralph Bolton wrote:
>
> 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/0082cfa6-c60d-409b-a2f3-2d694c9540e4%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.