ansible 开发模块获取服务内存声明

186 阅读3分钟

ansible 开发模块获取服务内存声明

  • 尝试用template解决内存渲染问题,逻辑已经处理完成,但由于最终全局变量无法被引用,于是就换成当下这种方案,自已写ansible模块来解决。

数据的定义说明:

  • 为了方便维护和直观显示,把数据源做成yaml格式再转成Python原生的数据格式给代码逻辑处理。
xxa :
  javaoptmaxmemory: 
     bussiness-a: 2048
  javaoptminmemory: 
     bussiness-a: 1024
serviceB:
  javaoptmaxmemory: 
     serviceB-a: 4096,
     serviceB-b: 5192
  javaoptminmemory:  
     serviceB-a: 1024,
     serviceB-b: 2048
ServiceC:
  javaoptmaxmemory: 
     servicec-a: 2048
  javaoptminmemory: 
     servicec-a: 1024
     xx-xupd-10: 3045
default_config:
  defaultjavaminmemory: 1024
  defaultjavamaxmemory: 2048
  

# 配置分为三级,分别是业务,最大内存|最小内存、服务具体内存
  ServiceB 为产品线
    javaoptmaxmemory: 服务最大内存
         bussiness-a-a:2045: 配置服务名和最大内存
    javaoptminmemory: 服务最小内存
         bussiness-a-a:1024: 配置服务名和最大内存
  
  default_config: 所有容器默认最小和最大内存配置,当没有在产品线里声明服务内存配置,容器内存值默认从此处取。
     defaultjavaminmemory: 1024
     defaultjavamaxmemory: 2048

# 其它关于内存参数说明
  一个服务在部署上到容器时,有四个内存参数需要设置,其中两个是java服务jvm参数的最小内存和最大内存值。
  另外两个是关于容器资源限制的request_memroy和limit_memory,其中limit_memory的值是通过jvm最大内存值*1.2得出。

模块参数和使用说明

模块说明

模块名: getcontainermemory
参数:
bussiness_type: 产品线类型,如vvwork,vvlife,xupd(具体会关联到配置文件里的产品线)
service_name: 服务名
memeory_type: 内存类型,有四种[pod_request_memory,pod_limit_memory,java_min_memory,java_max_memory]




使用说明

部分ansible task

  - name: get jmv config for pod request memory
    getcontainermemory:
      service_name: "{{service}}"
      bussiness_type: "ServiceB"
      memory_type: "pod_request_memory"
    register: podrequestmemory

  - name: get jmv config for java_min_memory
    getcontainermemory:
      service_name: "{{service}}"
      bussiness_type: "ServiceB"
      memory_type: "java_min_memory"
    register: javaminmemory

  - name: echo podrequestmemory
    shell: echo "{{ podrequestmemory }}"

  - name: echo javaminmemory
    shell: echo "{{ javaminmemory }}"

  - name: get memory value
    set_fact: 
      min_memory: "{{ item.value }}"
    with_dict: "{{ javaminmemory.stdout }}"
    



代码逻辑如下:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 20210118
# @Author  : ghd
# @Contact : ghd
# @Site    :
# @File    : gettoainermemory
# @Software: PyCharm
# @Desc    : python file
# @license : Copyright(C), Your Company
from ansible.module_utils.basic import AnsibleModule
import sys
sys.path.append('/usr/share/my_modules')
#from k8smemoryconfig import *
from k8smemoryyamlconfig import *


def main():
    """
    run shell
    """
    changed = False
    module = AnsibleModule(
                argument_spec = dict(
                bussiness_type = dict(type='str', required=True),
                 service_name = dict(type='str', required=True),
                 memory_type = dict(type='str',requried = True),
                ),
    )
    memory_type_list = ["pod_request_memory","pod_limit_memory","java_min_memory","java_max_memory"]
    bussiness_type = module.params['bussiness_type']
    service_name = module.params['service_name']
    memory_type = module.params['memory_type']
    memory_type_mapping = {'pod_request_memory':"javaoptminmemory",'pod_limit_memory':"javaoptmaxmemory",'java_min_memory':"javaoptminmemory",'java_max_memory':"javaoptmaxmemory"}

# 传入获取内存类型,返回相应类型的数据
    def MemroyTrunByType(data,memory_type):
        if memory_type == 'pod_request_memory':
            key = data.keys().pop()
            value = str(data.values().pop()) + 'Mi'
            new_data = {}
            new_data[key] = value
            return new_data
        elif memory_type == 'pod_limit_memory':
            key = data.keys().pop()
            value = str(data.values().pop() * 1.2) + 'Mi'
            new_data = {}
            new_data[key] = value
            return new_data
        elif memory_type == 'java_min_memory':
            key = data.keys().pop()
            value = '-Xms' + str(data.values().pop()) + 'm'
            new_data = {}
            new_data[key] = value
            return new_data
        elif memory_type == 'java_max_memory':
            key = data.keys().pop()
            value = '-Xmx' + str(data.values().pop()) + 'm'
            new_data = {}
            new_data[key] = value
            return new_data
        else:
            return False

    def get_memory_config(bussiness, service, memory_type):
        rc = 0
        if bussiness not in all_memory_config.keys():
            rc = 1
            return rc, "could not found bussiness key"
        if memory_type not in memory_type_list:
            rc = 1
            return rc, "could not found memory type"

        mem_key = memory_type_mapping.get(memory_type)
        if not mem_key:
            rc = 1
            return rc, "could not found mem_key to loop"

        data = {}

        if mem_key == 'javaoptminmemory':
            for key, value in all_memory_config[bussiness][mem_key].items():
                if key == service:
                    data[service] = all_memory_config[bussiness][mem_key][service]
                    new_data = MemroyTrunByType(data,memory_type)
                else:
                    data[service] = all_memory_config['default_config']['defaultjavamaxmemory']
                    new_data = MemroyTrunByType(data,memory_type)

            rc = 0
            return rc, str(new_data)

        if memory_type == 'javaoptmaxmemory':
            for key, value in all_memory_config[bussiness][mem_key].items():
                if key == service:
                    data[service] = all_memory_config[bussiness][mem_key][service]
                    new_data = MemroyTrunByType(data,memory_type)
                else:
                    data[service] = all_memory_config['default_config']['defaultjavamaxmemory']
                    new_data = MemroyTrunByType(data, memory_type)
            rc = 0
            return rc, str(new_data)

    code,output = get_memory_config(bussiness_type, service_name, memory_type)




    code = 0
    if code == 0:
        result = dict(stdout=output,changed=changed,rc=0)
        module.exit_json(**result)
    else:
        result = dict(msg=output,rc=code)
        module.fail_json(**result)


if __name__ == '__main__':

    main()