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 }}"
代码逻辑如下:
from ansible.module_utils.basic import AnsibleModule
import sys
sys.path.append('/usr/share/my_modules')
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()