List Ansible-从组x中删除已在其他组中的用户
我正在寻找最简单的方法,当用户已经在谷歌sudo组时,将他们从x组中删除。我将用户存储在这种列表和字典组合的组变量中:List Ansible-从组x中删除已在其他组中的用户,list,dictionary,ansible,sudoers,json-query,List,Dictionary,Ansible,Sudoers,Json Query,我正在寻找最简单的方法,当用户已经在谷歌sudo组时,将他们从x组中删除。我将用户存储在这种列表和字典组合的组变量中: user_account: - name: jenny authorized_keys: - jenny_01 groups: - "{% if not googlesudo.stat.exists %}sudo{% else %}google-sudo{% endif %}" - name: jerry
user_account:
- name: jenny
authorized_keys:
- jenny_01
groups:
- "{% if not googlesudo.stat.exists %}sudo{% else %}google-sudo{% endif %}"
- name: jerry
authorized_keys:
- jerry_01
groups:
- "{% if not googlesudo.stat.exists %}sudo{% else %}google-sudo{% endif %}"
...
这些是我已经创建的任务:
- name: Check if google-sudo file exists
stat:
path: /etc/sudoers.d/google_sudo
register: googlesudo
tags:
- add_user_group
- remove_from_x
- debug: var=googlesudo verbosity=2
tags:
- add_user_group
- remove_from_x
- debug:
msg: "User account to create: {{ item.name }}"
with_items: "{{ user_account }}"
- name: "Creating user"
user:
name: "{{ item.name }}"
group: users
shell: /bin/bash
with_items: "{{ user_account }}"
- name: Add user to additional groups
user:
name: "{{ item.0.name }}"
groups: "{{ item.1 }}"
append: yes
with_subelements:
- "{{ user_account }}"
- groups
tags:
- remove_from_x
- name: Check if user already in google-sudo
command: "groups {{ item.name }}"
with_items:
- "{{ user_account }}"
register: root_users
tags:
- remove_from_x
- name: View root users
debug:
msg: "{{ item }}"
verbosity: 2
with_items:
- "{{ root_users }}"
tags:
- remove_from_x
- name: Save state
set_fact:
is_in_googlesudo: "{{ root_users.results.0.stdout_lines }}"
tags:
- remove_from_x
- name: List
debug: msg='{{ user_account |json_query("[?groups==`google-sudo`]")}}'
tags:
- remove_from_x
- name: Remove from x group
shell: "deluser {{ item.name }} x"
with_items:
- "{{ user_account }}"
when: "'x in is_in_googlesudo' and 'google-sudo in is_in_googlesudo'"
tags:
- remove_from_x
我在测试json\u query
来提取用户名,如果他在googlesudo
和x
组,但没有成功。在定义组时尝试列出用户,但使用以下方法得到空输出:
msg='{{ user_account |json_query("[?groups==`google-sudo`]")}}'
我想知道在服务器上检查后(使用groups
命令)或者在user\u帐户中(如果用户已经在谷歌sudo中),是否有任何较短的方法将用户从组x
中删除
也许有一些好的、优雅的方法来编写这段代码,我会很感激任何处理它的想法。让我们简化数据,例如
vars:
my_组:{{googlesudo.stat.exists}三元('google-sudo','sudo')}
用户帐户:
-姓名:珍妮
组:“{my_group}”
-姓名:杰瑞
组:“{my_group}”
代码按预期工作,例如
-统计:
路径:/tmp/google\u sudo
注册:谷歌
-调试:
用户帐户
-调试:
msg:“{user_account | json_query([?groups==`google sudo`].name”)}”
给出是否存在/tmp/google_sudo
用户帐户:
-组别:谷歌sudo
姓名:珍妮
-组别:谷歌sudo
姓名:杰瑞
味精:
-珍妮
-杰里
否则
用户帐户:
-组别:sudo
姓名:珍妮
-组别:sudo
姓名:杰瑞
味精:[]
Q:“如果用户已经在另一个组中,则将其从组x中删除。”
A:用于获取组中的用户列表。例如,列出组sudo中的用户
-getent:
数据库:组
-调试:
变量:getent_group.sudo.2
如果用户是组sudo的成员,则测试操作,例如
-调试:
msg:“从组x中删除用户{{item.name}”
循环:“{user_account}}”
时间:getent_group.sudo.2中的item.name
Q:“将组作为列表。(可能我应该使用contains函数)。”
A:是的。使用,例如给定列表
vars:
用户帐户:
-姓名:珍妮
群组:[谷歌sudo,群组2]
-姓名:杰瑞
群组:[谷歌sudo,群组3]
任务
-调试:
msg:{{user_account | json_query('[?contains(groups,`group2`)].name')}
给予
msg:
-珍妮
是的,它可以工作!谢谢弗拉基米尔,你又一次救了我还有一件事。我需要将组作为为每个用户指定的列表,而不是以字典的形式。那么json_查询应该是什么样子呢?>{{user_account}json_query([?groups==
google sudo`].name”)}实际上,问题是我是否可以使用json_查询进行这种组合,或者应该使用其他解决方案。可能我应该使用contains
函数。好的,我已经找到了。这适用于列表中的组->{{user_account | json_query(“[?groups[0]=google sudo
].name”)}我已经更新了答案。如果您有更多问题,请提出新问题。