python开发ansible自定义模块,,ansible版本2
python开发ansible自定义模块,,ansible版本2
ansible版本2.7
pip install ansible==2.7
先导出环境变量指出 我们自定义模块的目录.
我存放的目录 export ANSIBLE_LIBRARY=/home/makeit/mylib/
也是就是把自己写的模块放到这个目录中,ansible在执行的时候会读取ANSIBLE_LIBRARY这个环境变量来查找对应的模块文件
模块名称.py 假设我们新写的模块文件名 mydownload.py 那么我们的模块名就是mydownload
使用的时候 ansible all -m mydownload -a ‘url=http://test.com/test.png dest=/tmp/test.png‘
直接上代码吧
#!/usr/bin/env python#!coding:utf-8from ansible.module_utils.basic import AnsibleModuleimport requests,osdef main(): module=AnsibleModule( argument_spec=dict( url=dict(required=True,type='str'), dest=dict(required=True,type='str') ) ) if os.path.exists(module.params.get('dest')): module.exit_json(changed=False) return rst=requests.get(module.params.get('url')) if rst: with open(module.params.get('dest'),'w') as f: f.write(rst.content) if os.path.exists(module.params.get('dest')): module.exit_json(changed=True)if __name__=='__main__': main()
下面是用python脚本直接执行任务的实现
#!/usr/bin/env python# coding: utf8from ansible import __version__ as AVif AV>=2.8: print('实例代码不支持2.8及以上平台运行') exit(1)import shutilfrom collections import namedtuple# DataLoader用于解析yaml/json/ini文件from ansible.parsing.dataloader import DataLoader# VariableManager用于分析ansible用到的变量from ansible.vars.manager import VariableManager# InventoryManager用于分析主机文件from ansible.inventory.manager import InventoryManagerfrom ansible.playbook.play import Play# task_queue_manager管理任务队列from ansible.executor.task_queue_manager import TaskQueueManagerimport ansible.constants as C # ansible的常量#创建元组,将选项加入,如:connection:连接,module_path:模块路径,forks:进程数量等Options = namedtuple('Options', ['connection', 'module_path', 'forks', 'become', 'become_method', 'become_user', 'check', 'diff'])# 创建具体的实例对象# connection有三个选择local/ssh/smart# local表示在本机执行,ssh表示通过ssh协议执行,smart表示自动选择options = Options(connection='smart', module_path=['/usr/share/ansible/plugins/modules/'], forks=10, become=True, become_method='sudo',become_user='root', check=False, diff=False)loader = DataLoader() #负责查找和读取YAML、JSON和INI文件passwords = dict() # 用于存储加密密码、远程连接密码等# 声明被ansible管理的主机有哪些,可以把各主机用逗号分开形成字符串# 也可以使用主机清单文件路径,将路径放到列表中# inventory = InventoryManager(loader=loader, sources='localhost,')inventory = InventoryManager(loader=loader, sources=['hosts'])#变量管理器负责合并所有不同的源,从而为每个上下文提供变量的统一视图。variable_manager = VariableManager(loader=loader, inventory=inventory)#脚本执行时屏幕显示的结果结构及信息play_source = dict( name="Ansible Play", # Play名称 # hosts='localhost', # 在哪些主机上执行命令 hosts='k8s', # 在上面inventory定影的myansi/hosts中查找 gather_facts='no', # 不收集主机信息 tasks=[ # 以下是执行的命令 dict(action=dict(module='yum', args='name=httpd state=latest'), register='shell_out'), #dict(action=dict(module='debug', args=dict(msg='{{shell_out}}'))) ] )#上面导入的对象,play_source执行的任务有哪些,变量到的分析play = Play().load(play_source, variable_manager=variable_manager, loader=loader)tqm = Nonetry:#tqm是taskQueueManager任务管理器生成的实例 tqm = TaskQueueManager( inventory=inventory, #主机清单 variable_manager=variable_manager, #参数管理 loader=loader, #json等语法分析 options=options, #选项 passwords=passwords, #密码 ) result = tqm.run(play) # tqm实例中的run方法开始执行play中的任务finally: if tqm is not None: #如果tqm不为none tqm.cleanup() #清理 shutil.rmtree(C.DEFAULT_LOCAL_TMP, True) #删除ansible执行任务是生成的临时目录
python开发ansible自定义模块
评论关闭