• 【日常运维】CMDB轻松管理千百台服务器---jumpserver堡垒机


     本站以分享各种运维经验和运维所需要的技能为主

    《python零基础入门》:python零基础入门学习

    《python运维脚本》: python运维脚本实践

    shell》:shell学习

    《terraform》持续更新中:terraform_Aws学习零基础入门到最佳实战

    《k8》暂未更新

    docker学习》暂未更新

    《ceph学习》ceph日常问题解决分享

    《日志收集》ELK+各种中间件

    《运维日常》运维日常

    《linux》运维面试100问

     【日常运维】CMDB轻松管理千百台服务器---jumpserver堡垒机

    背景:

    公司的服务器日益增多的时候,管理起来就需要一个cmdb的平台进行管理。

    介绍:

    JumpServer 是广受欢迎的开源堡垒机,是符合 4A 规范的专业运维安全审计系统。

    JumpServer 使用 Python 开发,配备了业界领先的 Web Terminal 方案,交互界面美观、用户体验好。

    JumpServer 采纳分布式架构,支持多机房跨区域部署,支持横向扩展,无资产数量及并发限制。

    改变世界,从一点点开始。

    安装部署:

    安装部署 - JumpServer 文档

    [工作随笔]JumpServer排坑安装及二次开发-腾讯云开发者社区-腾讯云

    Python调用Jumpserver的Api接口增删改查:

    满足添加自动添加云机器信息入jumpserver。

    1. # -*- coding: utf-8 -*-
    2. import requests, datetime, json
    3. from httpsig.requests_auth import HTTPSignatureAuth
    4. KeyID = '77e76d19-141c-4545--xxx'
    5. SecretID = 'a04817bc-0bb1-439f-baa2-xxxx'
    6. gmt_form = '%a, %d %b %Y %H:%M:%S GMT'
    7. ptivate_token = 'xxxxx'
    8. headers = {
    9. 'accept': 'application/json',
    10. 'Content-Type': 'application/json',
    11. # 'X-CSRFToken': 'eoLo2AVcQK5X1JQ392JHCzjZ8wPCWZJFJao5O9ObH8zQwtiPhGBzaOnNKjaENShf',
    12. "Authorization": 'Token ' + ptivate_token,
    13. 'X-JMS-ORG': '00000000-0000-0000-0000-000000000002',
    14. 'Date': datetime.datetime.utcnow().strftime(gmt_form)
    15. }
    16. # 认证
    17. def get_auth(KeyID, SecretID):
    18. """
    19. 认证
    20. :param KeyID: The key ID
    21. :param SecretID: The secret ID
    22. :return:
    23. """
    24. signature_headers = ['(request-target)', 'accept', 'date']
    25. auth = HTTPSignatureAuth(key_id=KeyID, secret=SecretID, algorithm='hmac-sha256', headers=signature_headers)
    26. return auth
    27. auth = get_auth(KeyID, SecretID)
    28. # 获取所有用户
    29. def get_user_all():
    30. """
    31. 获取所有用户
    32. :return:
    33. """
    34. url = jms_url + '/api/v1/users/users/'
    35. response = requests.get(url, auth=auth, headers=headers)
    36. user_list = json.loads(response.text)
    37. count = 0
    38. for i in user_list:
    39. count += 1
    40. print(i)
    41. print(count)
    42. # 获取监控指标
    43. def get_prometheus_metric():
    44. """
    45. 获取监控指标
    46. :return:
    47. """
    48. url = jms_url + "/api/v1/prometheus/metrics/"
    49. response = requests.get(url, headers=headers, auth=auth)
    50. print(response.text)
    51. return response.text
    52. # 获取所有资产节点
    53. def get_node_all():
    54. """
    55. 获取所有资产节点
    56. :return:
    57. """
    58. url = jms_url + "/api/v1/assets/nodes/"
    59. response = requests.get(url, headers=headers, auth=auth)
    60. node_list = json.loads(response.text)
    61. count = 0
    62. for i in node_list:
    63. count += 1
    64. print(i)
    65. print(count)
    66. return response.json()
    67. # 查看当前token(即admin)的所有资产
    68. def get_asset_all():
    69. """
    70. 查看当前token(即admin)的所有资产
    71. :return:
    72. """
    73. url = jms_url + "/api/v1/assets/assets/"
    74. response = requests.get(url, headers=headers, auth=auth)
    75. node_list = json.loads(response.text)
    76. count = 0
    77. for i in node_list:
    78. count += 1
    79. print(i)
    80. print(count)
    81. return response.json()
    82. ###################################################################################################
    83. # 创建资产节点
    84. def assets_nodes_create(node_name):
    85. """
    86. 创建资产节点
    87. :param node_name:
    88. :return:
    89. """
    90. node_data = {
    91. "value": node_name
    92. }
    93. url = jms_url + "/api/v1/assets/nodes/"
    94. node_info = get_node_info(node_name)
    95. if node_info: # 根据node_name去查询,如果查到了说明已经有了。
    96. print("{name}已存在, id: {id}".format(name=node_name, id=node_info[0]["id"]))
    97. else:
    98. data = json.dumps(node_data)
    99. resp = requests.post(url, headers=headers, data=data)
    100. return resp.json()
    101. #
    102. def get_assets_list_by_ip(ip):
    103. """
    104. 根据ip获取资产信息
    105. :param ip:
    106. :return:
    107. """
    108. url = jms_url + "/api/v1/assets/assets/"
    109. response = requests.get(url, headers=headers, params={
    110. "ip": ip
    111. })
    112. print(response.json())
    113. return response.json()
    114. # 查看资产节点信息
    115. def get_node_info(node_name):
    116. """
    117. 查看资产节点信息
    118. :param node_name: 节点名称
    119. :return:
    120. """
    121. url = jms_url + "/api/v1/assets/nodes/"
    122. response = requests.get(url, auth=auth, headers=headers, params={
    123. "value": node_name
    124. })
    125. print(response.text)
    126. return response.json()
    127. # 创建资产机器
    128. def asset_create(ip, hostname, node_id, comment):
    129. """
    130. 创建资产机器
    131. :param ip: ip地址
    132. :param hostname: 主机名
    133. :param node_id: 节点id
    134. :return: 返回创建的资产信息
    135. """
    136. asset_Data = {
    137. "name": hostname,
    138. "address": ip,
    139. "platform": "1",
    140. "protocols": [{
    141. "name": "ssh",
    142. "port": 22
    143. }],
    144. "is_active": True,
    145. "nodes": [node_id],
    146. "comment": comment,
    147. "accounts": [{
    148. # 账号模板id
    149. "template": "60b11033-a6e1-467d-8388-68a0e64134ff",
    150. }]
    151. }
    152. url = jms_url + "/api/v1/assets/hosts/"
    153. print(url)
    154. data = json.dumps(asset_Data)
    155. print(data)
    156. response = requests.post(url, auth=auth, headers=headers, data=data)
    157. print(response.text)
    158. # 运行创建服务器资产
    159. def run_create_assets(node_name, project_name, ip, comment):
    160. """
    161. 运行创建服务器资产
    162. :param node_name: 节点名称
    163. :param project_name: 机器名称
    164. :param ip: ip地址
    165. :param comment: 备注
    166. :return:
    167. """
    168. # 节点id,无节点时创建节点
    169. node_info = get_node_info(node_name)
    170. # 如果len(node_info) == 0 说明没有节点,需要创建节点
    171. if len(node_info) == 0:
    172. # 创建节点
    173. node_id = assets_nodes_create(node_name)
    174. print(node_id)
    175. else:
    176. # 获取节点id
    177. node_id = node_info[0]["id"]
    178. print(node_id)
    179. # 管理用户 id
    180. hostname = "{ip}_{project_name}".format(ip=ip, project_name=project_name)
    181. # 查IP,创建资产
    182. ip_info = get_assets_list_by_ip(ip)
    183. if ip_info:
    184. print("%s 已存在,nodes: %s" % (ip_info[0]["address"], ip_info[0]["nodes"]))
    185. else:
    186. asset_create(ip, hostname, node_id, comment)
    187. def get_org_info():
    188. """
    189. 获取组织信息
    190. :return:
    191. """
    192. url = jms_url + "/api/v1/orgs/orgs/"
    193. response = requests.get(url, headers=headers)
    194. org_list = response.text
    195. print(org_list)
    196. for i in org_list.split("id"):
    197. print(i)
    198. return response.json()
    199. if __name__ == '__main__':
    200. jms_url = 'https://jms.xxx.top'
    201. username = 'admin'
    202. password = 'xxxxxx'
    203. # 获取token
    204. # token = get_token(jms_url, username, password)
    205. # 创建资产节点
    206. # assets_nodes_create("k8s")
    207. # 根据ip获取资产信息
    208. # get_assets_list_by_ip("192.168.11.10")
    209. # 查看资产节点信息
    210. # get_node_info("k8s")
    211. # 创建资产调用
    212. # node_id = ["e8641c37-93e3-450e-aaf8-64d5baa69753"]
    213. # get_node_info("k8s")
    214. # asset_create(ip, hostname, node_id)
    215. # 运行创建服务器资产
    216. # run_create_assets("test", "风控", "192.168.11.10", "测试")
    217. # 获取组织信息
    218. # get_org_info()
    219. # 获取所有用户
    220. get_user_all()

    二次开发:jumpserver同步腾讯云主机信息

    需要基础是django 的大框架以及一些前端知识

    jumpserver同步腾讯云主机信息 - 简书

  • 相关阅读:
    华测视频RTK,AR实景导航
    车载音频系统中的数据通信
    CH455G驱动数码管
    【操作系统】Lesson1-什么是操作系统
    一次Python无法安装模块的问题探索与解决之旅
    Android 10 SystemUI 如何添加4G信号和WiFi图标
    js内存与数据
    List获取差集产生的问题
    选择需求管理工具
    IDEA运行项目报错:Command line is too long的解决办法
  • 原文地址:https://blog.csdn.net/zerotoall/article/details/140458850