如何从Ansible中的指定组中删除用户?

时间:2016-08-17 05:52:25

标签: ansible ansible-playbook

我们假设user01定义了两个组:groupAgroupB(除了主要组)。

我可以使用以下帐户将帐户添加到groupC(确保user01属于groupC):

- user: name=user01 groups=groupC append=yes

如果不指定帐户应属于的所有群组,如何从user01删除groupB(确保user01不属于groupB)?

6 个答案:

答案 0 :(得分:4)

据我所知,你不能只使用普通的用户模块。

但是,通过一些相当疯狂的旋转,你可以在剧本中做到这一点。 我不确定我推荐这个;这只是一个有趣的练习。 (我测试过这个并且有效。)

有趣的部分是“构建新组列表”任务,它删除了一个列表条目。如果在python列表上调用.remove()返回了新列表,那将是不必要的。

---
- hosts: target
  gather_facts: no

  vars:
    group_to_remove: admins
    new_groups_list: []
    user_to_check: user1

  tasks:
    - user: name="{{ user_to_check }}" groups=testers,developers,admins

    - name: get the current groups list
      command: groups "{{ user_to_check }}"
      register: current_groups

    - debug: var=current_groups

    # parse the output of the groups command into a python list
    # of the current groups
    - set_fact:
        current_group_list: "{{ current_groups.stdout.replace( user_to_check+' : ','').split(' ') }}"

    - name: show user_group_list
      debug: var=current_group_list

    - name: build the new groups list
      set_fact:
        new_groups_list: "{{ new_groups_list + [ item  ]  }}"
      no_log: False
      when: "not '{{ group_to_remove }}' == '{{ item }}'"
      with_items: "{{ current_group_list }}"

    # turn the list, into a comma-delimited string
    - set_fact:
        new_groups: "{{ ','.join(new_groups_list) }}"

    - name: show new_groups_list
      debug: var=new_groups

    - name: set new user groups
      user: name="{{ user_to_check }}" groups="{{ new_groups }}"

    - name: get the new groups list
      command: groups "{{ user_to_check }}"
      register: new_groups

    - debug: var=new_groups

答案 1 :(得分:1)

该功能缺失,这是一个开放的错误:

https://github.com/ansible/ansible/issues/11024

作为解决方法,请使用类似的内容。

  become: true
  shell: "/usr/sbin/delgroup telegraf varnish"
  ignore_errors: yes
  when: ansible_hostname | lower not in groups['varnish'] | lower

请根据您的需求进行调整,如果当前主机不在ansible group varnish list中,我将从主机清漆组中删除telegraf用户

答案 2 :(得分:0)

answer from higuita中添加了正确的条件,对此进行了一些改进:

- name: Get info from user1
  user:
    name: user1
    state: present
  register: user1_data

- name: remove user1 user from grouptodelete group
  become: true
  command: "gpasswd -d user1 grouptodelete"
  when: user1_data.groups is defined and 'grouptodelete' in user1_data.groups

答案 3 :(得分:0)

示例:从“ docker”组中删除所有用户

- name: get all user into docker group
  shell: |
    awk -F':' '/^docker:/ {print $4}' /etc/group
  register: users_intogroup_docker
  changed_when: False

- name: no user into docker group
  command: gpasswd -d {{ item }} docker
  with_items: "{{ users_intogroup_docker.stdout.split(',') }}"
  when: not item in [""]

答案 4 :(得分:0)

提供的解决方案似乎相当复杂,因为要删除的用户和组都是已知的。我使用了这个 ansible 代码,它足以获得幂等行为,并且与其他建议的解决方案具有相同的对 gpasswd 的依赖。

- name: remove user dovecot from the certuser group
  become: true
  command: "gpasswd -d dovecot certuser"
  register: command_result
  changed_when: "not 'is not a member of' in command_result.stderr"
  failed_when: false

答案 5 :(得分:-1)

有一种使用Ansible的方法也可以使用正确的标志

您需要对no或false使用append标志,以告诉Ansbile不要将用户附加到组中

- user:
    name: hive
    shell: /bin/bash
    groups: hadoop
    append: no
    state: present