Удалить пользователей, которых нет в словаре - PullRequest
0 голосов
/ 17 октября 2019

У меня есть задача в 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"
    }
  },

Теперь представьте, что у меня есть всервер больше пользователей, кроме списка пользователей. Было бы возможно создать еще одно задание, чтобы удалить это? Я открыт для использования любого метода.

Спасибо

1 Ответ

0 голосов
/ 18 октября 2019

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, вам нужно только имя attribute для использования с модулем user.

В дополнение к вышеупомянутому мы можем получить списокпользователей, использующих модуль getent:, это установит факт под названием getent_passwd:, мы можем проанализировать этот код, чтобы получить username.

Создан список ожидаемых пользователей с использованием username: в качестве ключевого слова.

---
- 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

Примечание: вы должны быть осторожны при удалении пользователей

...