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自定义模块

评论关闭