group - correctly determine if a local group exists. (#59772)

Fixes #58619
Add integration test
This commit is contained in:
Ruediger Pluem 2020-02-05 18:34:41 +01:00 committed by GitHub
parent 50eb2f6957
commit 80c4b86abe
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 83 additions and 5 deletions

View file

@ -0,0 +1,5 @@
bugfixes:
- >
group - The group module was not correctly detecting whether a local
group is existing or not with local set to yes if the same group
exists in a non local group repository e.g. LDAP. (https://github.com/ansible/ansible/issues/58619)

View file

@ -98,6 +98,7 @@ system:
'''
import grp
import os
from ansible.module_utils._text import to_bytes
from ansible.module_utils.basic import AnsibleModule
@ -192,11 +193,36 @@ class Group(object):
return self.execute_command(cmd)
def group_exists(self):
try:
if grp.getgrnam(self.name):
return True
except KeyError:
return False
# The grp module does not distinguish between local and directory accounts.
# It's output cannot be used to determine whether or not a group exists locally.
# It returns True if the group exists locally or in the directory, so instead
# look in the local GROUP file for an existing account.
if self.local:
if not os.path.exists(self.GROUPFILE):
self.module.fail_json(msg="'local: true' specified but unable to find local group file {0} to parse.".format(self.GROUPFILE))
exists = False
name_test = '{0}:'.format(self.name)
with open(self.GROUPFILE, 'rb') as f:
reversed_lines = f.readlines()[::-1]
for line in reversed_lines:
if line.startswith(to_bytes(name_test)):
exists = True
break
if not exists:
self.module.warn(
"'local: true' specified and group was not found in {file}. "
"The local group may already exist if the local group database exists somewhere other than {file}.".format(file=self.GROUPFILE))
return exists
else:
try:
if grp.getgrnam(self.name):
return True
except KeyError:
return False
def group_info(self):
if not self.group_exists():

View file

@ -267,3 +267,50 @@
state: absent
# only applicable to Linux, limit further to CentOS where 'luseradd' is installed
when: ansible_distribution == 'CentOS'
# https://github.com/ansible/ansible/pull/59772
- block:
- name: create group with a gid
group:
name: group1_test
gid: 1337
local: no
state: present
register: create_group_gid
- name: get gid of created group
command: "{{ ansible_python_interpreter | quote }} -c \"import grp; print(grp.getgrnam('group1_test').gr_gid)\""
register: create_group_gid_actual
- name: assert create group with a gid
assert:
that:
- create_group_gid is changed
- create_group_gid.gid | int == 1337 | int
- create_group_gid_actual.stdout | trim | int == 1337 | int
- name: create local group with the same gid
group:
name: group1_test
gid: 1337
local: yes
state: present
register: create_local_group_gid
- name: assert create local group with a gid
assert:
that:
- create_local_group_gid.gid | int == 1337 | int
always:
- name: Cleanup create group with a gid
group:
name: group1_test
local: no
state: absent
- name: Cleanup create local group with the same gid
group:
name: group1_test
local: yes
state: absent
# only applicable to Linux, limit further to CentOS where 'lgroupadd' is installed
when: ansible_distribution == 'CentOS'