设为首页 收藏本站
查看: 830|回复: 0

[经验分享] SaltStack源码分析之group状态模块

[复制链接]

尚未签到

发表于 2018-8-1 08:24:20 | 显示全部楼层 |阅读模式
def present(name,  
            gid=None,
  
            system=False,
  
            addusers=None,
  
            delusers=None,
  
            members=None):
  
    '''
  
    Ensure that a group is present
  

  
    name
  
        The name of the group to manage
  

  
    gid
  
        The group id to assign to the named group; if left empty, then the next
  
        available group id will be assigned
  

  
    system
  
        Whether or not the named group is a system group.  This is essentially
  
        the '-r' option of 'groupadd'.
  

  
    addusers
  
        List of additional users to be added as a group members.
  

  
    delusers
  
        Ensure these user are removed from the group membership.
  

  
    members
  
        Replace existing group members with a list of new members.
  

  
    Note: Options 'members' and 'addusers/delusers' are mutually exclusive and
  
          can not be used together.
  
    '''
  
    ret = {'name': name,
  
           'changes': {},
  
           'result': True,
  
           'comment': 'Group {0} is present and up to date'.format(name)}
  

  
    if members and (addusers or delusers):
  
        ret['result'] = None
  
        ret['comment'] = (
  
            'Error: Conflicting options "members" with "addusers" and/or'
  
            ' "delusers" can not be used together. ')
  
        return ret
  

  
    if addusers and delusers:
  
        #-- if trying to add and delete the same user(s) at the same time.
  
        if not set(addusers).isdisjoint(set(delusers)):
  
            ret['result'] = None
  
            ret['comment'] = (
  
                'Error. Same user(s) can not be added and deleted'
  
                ' simultaneously')
  
            return ret
  

  
    changes = _changes(name,
  
                       gid,
  
                       addusers,
  
                       delusers,
  
                       members)
  
    if changes:
  
        ret['comment'] = (
  
            'The following group attributes are set to be changed:\n')
  
        for key, val in changes.items():
  
            ret['comment'] += '{0}: {1}\n'.format(key, val)
  

  
        if __opts__['test']:
  
            ret['result'] = None
  
            return ret
  

  
        for key, val in changes.items():
  
            if key == 'gid':
  
                __salt__['group.chgid'](name, gid)
  
                continue
  
            if key == 'addusers':
  
                for user in val:
  
                    __salt__['group.adduser'](name, user)
  
                continue
  
            if key == 'delusers':
  
                for user in val:
  
                    __salt__['group.deluser'](name, user)
  
                continue
  
            if key == 'members':
  
                __salt__['group.members'](name, ','.join(members))
  
                continue
  
        # Clear cached group data
  
        sys.modules[
  
            __salt__['test.ping'].__module__
  
            ].__context__.pop('group.getent', None)
  
        changes = _changes(name,
  
                           gid,
  
                           addusers,
  
                           delusers,
  
                           members)
  
        if changes:
  
            ret['result'] = False
  
            ret['comment'] += 'Some changes could not be applied'
  
            ret['changes'] = {'Failed': changes}
  
        else:
  
            ret['changes'] = {'Final': 'All Changed applied successfully'}
  

  
    if changes is False:
  
        # The group is not present, make it!
  
        if __opts__['test']:
  
            ret['result'] = None
  
            ret['comment'] = 'Group {0} set to be added'.format(name)
  
            return ret
  

  
        grps = __salt__['group.getent']()
  
        # Test if gid is free
  
        if gid is not None:
  
            gid_group = None
  
            for lgrp in grps:
  
                if lgrp['gid'] == gid:
  
                    gid_group = lgrp['name']
  
                    break
  

  
            if gid_group is not None:
  
                ret['result'] = False
  
                ret['comment'] = (
  
                    'Group {0} is not present but gid {1} is already taken by'
  
                    ' group {2}'.format(name, gid, gid_group))
  
                return ret
  

  
        # Group is not present, make it.
  
        if __salt__['group.add'](name,
  
                                 gid,
  
                                 system=system):
  
            # if members to be added
  
            grp_members = None
  
            if members:
  
                grp_members = ','.join(members)
  
            if addusers:
  
                grp_members = ','.join(addusers)
  
            if grp_members:
  
                __salt__['group.members'](name, grp_members)
  
            # Clear cached group data
  
            sys.modules[__salt__['test.ping'].__module__].__context__.pop(
  
                'group.getent', None)
  
            ret['comment'] = 'New group {0} created'.format(name)
  
            ret['changes'] = __salt__['group.info'](name)
  
            changes = _changes(name,
  
                               gid,
  
                               addusers,
  
                               delusers,
  
                               members)
  
            if changes:
  
                ret['result'] = False
  
                ret['comment'] = (
  
                    'Group {0} has been created but, some changes could not'
  
                    ' be applied')
  
                ret['changes'] = {'Failed': changes}
  
        else:
  
            ret['result'] = False
  
            ret['comment'] = 'Failed to create new group {0}'.format(name)
  
    return ret

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-544459-1-1.html 上篇帖子: SaltStack源码分析之user状态模块 下篇帖子: Saltstack常用模块及API之查看主机支持的模块清单
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表