json - 删除不在字典中的用户
问题描述
我在 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中创建另一个任务来删除它?我愿意使用任何方法。
谢谢
解决方案
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:
使用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
注意:删除用户时必须小心
推荐阅读
- python - 仅使用字符串,整数,打印和输入时如何在Python中获取特定数字的上一个和下一个数字?
- c++ - 为什么 `constexpr` 函数在编译和运行时会产生不同的结果?
- azure - 如何从 ServiceBusAttribute 构造函数中访问环境变量?
- python - Django Rest Framework get_permissions 需要一个或其他权限
- ubuntu - 树莓派上的 Rust 可执行文件无法读取 oom_kill
- javascript - 无法解构“react__WEBPACK_IMPORTED_MODULE_0___default.a.useContext(...)”的属性“dispatch”,因为它未定义
- julia - 如何区分 Julia codeinfo 插槽中的参数和局部变量?
- php - 如何在 Laravel 的公共文件夹中上传 Canvas 图像
- r - 使用拼凑 r 时轴标题大小发生变化
- javascript - React-redux 不会在状态更改时重新渲染