如何从Ansible中的指定组中删除用户?
How to remove user from a specified group in Ansible?
假设 user01
定义了两个组:groupA
和 groupB
(除了主要组)。
我可以将帐户添加到 groupC
(确保 user01
属于 groupC
)使用:
- user: name=user01 groups=groupC append=yes
如何在不指定帐户应属于的所有组的情况下从 groupB
中删除 user01
(确保 user01
不属于 groupB
)?
据我所知,你不能只使用普通用户模块。
但是,通过一些相当疯狂的旋转,您可以在剧本中做到这一点。
我不确定我是否推荐这个;这只是一个有趣的练习。 (我确实对此进行了测试并且有效。)
有趣的部分是删除列表条目的任务 "build the new groups list"。如果在 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
缺少该功能,这是该功能的未解决错误:
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 组 varnish 列表中,我将从主机 varnish 组中删除 telegraf 用户
也有一种方法可以使用 Ansible 来做到这一点,你必须使用正确的标志
您需要使用 append 标记为 no 或 false 来告诉 Ansbile 不要将用户追加到组中
- user:
name: hive
shell: /bin/bash
groups: hadoop
append: no
state: present
稍微改进 添加正确的条件:
- 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
示例:从 "docker" 组
中删除所有用户
- name: get all user into docker group
shell: |
awk -F':' '/^docker:/ {print }' /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 [""]
所提供的解决方案似乎相当复杂,因为要删除的用户和组都是已知的。我使用了这个 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
如果您认为如果该组不存在任务应该失败,只需修改最后一行:
- 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: "'does not exist in /etc/group' in command_result.stderr"
假设 user01
定义了两个组:groupA
和 groupB
(除了主要组)。
我可以将帐户添加到 groupC
(确保 user01
属于 groupC
)使用:
- user: name=user01 groups=groupC append=yes
如何在不指定帐户应属于的所有组的情况下从 groupB
中删除 user01
(确保 user01
不属于 groupB
)?
据我所知,你不能只使用普通用户模块。
但是,通过一些相当疯狂的旋转,您可以在剧本中做到这一点。 我不确定我是否推荐这个;这只是一个有趣的练习。 (我确实对此进行了测试并且有效。)
有趣的部分是删除列表条目的任务 "build the new groups list"。如果在 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
缺少该功能,这是该功能的未解决错误:
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 组 varnish 列表中,我将从主机 varnish 组中删除 telegraf 用户
也有一种方法可以使用 Ansible 来做到这一点,你必须使用正确的标志
您需要使用 append 标记为 no 或 false 来告诉 Ansbile 不要将用户追加到组中
- user:
name: hive
shell: /bin/bash
groups: hadoop
append: no
state: present
稍微改进
- 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
示例:从 "docker" 组
中删除所有用户- name: get all user into docker group
shell: |
awk -F':' '/^docker:/ {print }' /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 [""]
所提供的解决方案似乎相当复杂,因为要删除的用户和组都是已知的。我使用了这个 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
如果您认为如果该组不存在任务应该失败,只需修改最后一行:
- 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: "'does not exist in /etc/group' in command_result.stderr"