首页 > 解决方案 > 删除不在字典中的用户

问题描述

我在 ansible 中有一个任务,它返回一个包含用户列表的字典,我用它来通过我的服务器中的另一个任务添加这些用户。

- name: Get users
  uri:
    url: http://users.com/users
    method: GET
    return_content: yes
  register: json_users

-name: Add users
 user:
   name: "{{ item }}"
 with_items:
   - {{ json_users[content] }}

现在,我想删除不在此列表中的用户,但我不知道如何提出此任务..

我的清单是这样的:

[
  {
    "id": 1,
    "name": "Leanne Graham",
    "username": "Bret",
    "email": "Sincere@april.biz",
    "address": {
      "street": "Kulas Light",
      "suite": "Apt. 556",
      "city": "Gwenborough",
      "zipcode": "92998-3874",
      "geo": {
        "lat": "-37.3159",
        "lng": "81.1496"
      }
    },
    "phone": "1-770-736-8031 x56442",
    "website": "hildegard.org",
    "company": {
      "name": "Romaguera-Crona",
      "catchPhrase": "Multi-layered client-server neural-net",
      "bs": "harness real-time e-markets"
    }
  },
  {
    "id": 2,
    "name": "Ervin Howell",
    "username": "Antonette",
    "email": "Shanna@melissa.tv",
    "address": {
      "street": "Victor Plains",
      "suite": "Suite 879",
      "city": "Wisokyburgh",
      "zipcode": "90566-7771",
      "geo": {
        "lat": "-43.9509",
        "lng": "-34.4618"
      }
    },
    "phone": "010-692-6593 x09125",
    "website": "anastasia.net",
    "company": {
      "name": "Deckow-Crist",
      "catchPhrase": "Proactive didactic contingency",
      "bs": "synergize scalable supply-chains"
    }
  },

现在,假设我在服务器中除了用户列表之外还有更多用户。是否可以在ansible中创建另一个任务来删除它?我愿意使用任何方法。

谢谢

标签: jsonansiblejinja2

解决方案


ansible 提供了一个非常棒的论点state:,在模块中调用。此参数可用于控制模块在目标节点上的行为,即在用户的情况下不存在/存在,即删除/添加。

在使用作为参数调用user:模块之前delete,您需要创建目标节点上所有用户的列表,然后将其与上述 json 中的用户进行比较,然后使用参数调用user:模块。delete:

- name: Get users
  uri:
    url: http://users.com/users
    method: GET
    return_content: yes
  register: json_users

- name: Add users
 user:
   name: "{{ item }}"
 with_items:
   - "{{ json_users[content] }}"

- name: create a list of users not present in the above json
  <module>:

- name: Add users
 user:
   name: "{{ item }}"
 state: absent
 remove: yes
 with_items:
   - "{{ to_delete_list }}"

希望这会有所帮助。如果您在创建 json 中不存在的用户列表时需要帮助,请告诉我。此外,{{ json_users[content] }}将获得所有关键字作为迭代,with_items您只需要attributeuser模块一起使用的名称。

除了上面我们可以使用模块获取用户列表,getent:这将设置一个事实,getent_passwd:我们可以解析这段代码来获取username.

username:使用as 关键字创建了预期用户列表。

---
- name: to delete the users not needed as per the json
  hosts: localhost
  gather_facts: no
  tasks:
    - include_vars: 
        file: vars.yml
        name: expected

    - getent:
        database: passwd
      register: list_of_users

    - set_fact:
        expected_users: "{{ expected_users | default([]) | map(attribute='item') | list }}"
      loop:
        - "{{ expected | json_query('expected[*].username')  }}"

    - debug:
        msg: "{{ item.key }}"
      when: "item.key not in expected_users"
      with_dict:
        - "{{ getent_passwd }}"

您可以更新debug:以使用该user:模块state: absent

注意:删除用户时必须小心


推荐阅读