【问题标题】:Ansible - remove user from group x if already in other groupAnsible - 如果已经在其他组中,则从组 x 中删除用户
【发布时间】:2021-04-19 21:39:31
【问题描述】:

当用户已经在组 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

如果他在google-sudox 组中,我正在测试json_query 以提取用户名,但没有成功。尝试在定义组时列出用户,但是我得到空输出,使用这个:

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

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

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

【问题讨论】:

    标签: list dictionary ansible sudoers json-query


    【解决方案1】:

    让我们简化数据,例如

      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,例如给定列表

      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
    

    【讨论】:

    • 是的,它有效!谢谢弗拉基米尔,你又一次救了我。 :)
    • 还有一件事。我需要将组作为为每个用户指定的列表,而不是以字典的形式。那么 json_query 应该是什么样子 -> {{ user_account|json_query("[?groups==google-sudo`].name") }}' 实际上,问题是我是否可以将 json_query 用于此组合或应该使用其他解决方案。
    • 也许我应该使用contains函数。
    • 好的,我已经想通了。这适用于列表中的组 -> '{{ user_account|json_query("[?groups[0]==google-sudo].name") }}'
    • 我已经更新了答案。如果您有更多问题,请提出新问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-10
    • 1970-01-01
    • 2011-07-04
    • 1970-01-01
    相关资源
    最近更新 更多