list - Ansible - 如果用户已经在其他组中,则从组 x 中删除用户

标签 list dictionary ansible sudoers json-query

我正在寻找最简单的方法,当用户已经在 google-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_query提取用户名(如果他在 google-sudo)和x组,但没有成功。尝试在定义组时列出用户,但是使用以下命令得到空输出:

msg='{{ user_account |json_query("[?groups==`google-sudo`]")}}'

我想知道是否有更短的方法可以从组 x 中删除用户检查服务器后(使用例如 groups 命令)或在 user_account 中-> group如果他已经在 google-sudo 中。

可能有一些漂亮而优雅的方式来编写这段代码,我将不胜感激任何如何处理它的想法。

最佳答案

让我们简化数据,例如

  vars:
    my_group: "{{ googlesudo.stat.exists|ternary('google-sudo', 'sudo') }}"
    user_account:
      - name: jenny
        groups: "{{ my_group }}"
      - name: jerry
        groups: "{{ my_group }}"

代码按预期工作,例如

    - stat:
        path: /tmp/google_sudo
      register: googlesudo
    - debug:
        var: user_account
    - debug:
        msg: '{{ user_account|json_query("[?groups==`google-sudo`].name") }}'

给出/tmp/google_sudo 是否存在

  user_account:
  - groups: google-sudo
    name: jenny
  - groups: google-sudo
    name: jerry

  msg:
  - jenny
  - jerry

否则

  user_account:
  - groups: sudo
    name: jenny
  - groups: sudo
    name: jerry

  msg: []

问:如果用户已经在另一个组中,则将其从组 x 中删除。

答:使用getent获取组中的用户列表。例如,列出组中的用户 sudo

    - getent:
        database: group
    - debug:
        var: getent_group.sudo.2

如果用户是组 sudo 的成员,则测试操作,例如

    - debug:
        msg: "Remove user {{ item.name }} from group x"
      loop: "{{ user_account }}"
      when: item.name in getent_group.sudo.2

问:将组作为列表。(也许我应该使用 contains 函数。)

答:是的。使用contains ,例如给定列表

  vars:
    user_account:
      - name: jenny
        groups: [google-sudo, group2]
      - name: jerry
        groups: [google-sudo, group3]

任务

    - debug:
        msg: "{{ user_account|json_query('[?contains(groups, `group2`)].name') }}"

给出

  msg:
  - jenny

关于list - Ansible - 如果用户已经在其他组中,则从组 x 中删除用户,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67169676/

相关文章:

python-3.x - 升级 ansible 以在 Controller 上使用 python3

docker extra_host 参数需要主机名的字典值,如何使用变量?

Ansible 库存 : inheritance between groups

java - 添加到列表矩阵中的指定列表

javascript - 使用数组中的值填充下拉列表框

swift - Dictionary 在 Swift 中如何使用 Equatable 协议(protocol)?

python - key :Value Pairs from txt file into a dictionary

python - Random.sample 输出一个 3 维数组

r - 为什么要在 R 中复制列表?

python - 将简单元组转换为字典