Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
List Ansible-从组x中删除已在其他组中的用户_List_Dictionary_Ansible_Sudoers_Json Query - Fatal编程技术网

List Ansible-从组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

我正在寻找最简单的方法,当用户已经在谷歌sudo组时,将他们从x组中删除。我将用户存储在这种列表和字典组合的组变量中:

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”)}我已经更新了答案。如果您有更多问题,请提出新问题。