zoukankan      html  css  js  c++  java
  • 使用python开发ansible自定义模块的简单案例

    安装的版本ansible版本<=2.7,<=2.8是不行的哦
    安装模块
    pip install ansible==2.7

    先导出环境变量  我们自定义模块的目录.
    我存放的目录 export ANSIBLE_LIBRARY=/home/makeit/mylib/
    把自己写的模块放到这个目录中,ansible在执行的时候会读取ANSIBLE_LIBRARY这个环境变量来查找对应的模块文件.

    例 我们新写的模块文件名 mydownload.py 那么我们的模块名就是mydownload

    这样使用自定义模块:
    ansible all -m mydownload -a 'url=http://test.com/test.png dest=/tmp/test.png'
    url=http://test.com/test.png 把 http://test.com/test.png 传递给 url

    直接上代码吧

    #!/usr/bin/env python
    #!coding:utf-8
    
    from ansible.module_utils.basic import AnsibleModule
    import requests,os
    
    def 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: utf8
    
    from ansible import  __version__ as AV
    if AV>=2.8:
        print('实例代码不支持2.8及以上平台运行')
        exit(1)
    
    import shutil
    from 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 InventoryManager
    from ansible.playbook.play import Play
    # task_queue_manager管理任务队列
    from ansible.executor.task_queue_manager import TaskQueueManager
    import 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 = None
    try:
    #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执行任务是生成的临时目录
    
    
  • 相关阅读:
    从例图中学习思维导图的基本概念
    名企面试官精讲典型编程题之C++篇
    PPT,要你好看(全彩)
    文字即艺术
    MindManager中读图工具的使用
    思维导图的三招十八式
    放之四海皆适用的设计原则(一)
    MindManager的例图资源
    内容营销11金规
    专业嵌入式软件开发——全面走向高质高效编程(含DVD光盘1张)
  • 原文地址:https://www.cnblogs.com/lovesKey/p/10923458.html
Copyright © 2011-2022 走看看