python开发ansible自定义模块

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-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执行任务是生成的临时目录

原文地址:https://www.cnblogs.com/lovesKey/p/10923458.html

时间: 2024-10-29 19:07:21

python开发ansible自定义模块的相关文章

vscode如何配置debug,python正则表达式如何匹配括号,关于python如何导入自定义模块

关于vscode如何配置debug的问题: 1.下载安装好python,并且配置好 环境变量 2.https://www.cnblogs.com/asce/p/11600904.html 3.严格按照上面进行操作的话,用vscode直接打开  文件夹即可 (.vscode文件中的launch.json文件其实就是指导软件在debug时如何做,可以自己生成,不用自定义设置) python正则表达式如何匹配括号,中括号一类的问题: 给括号加上[ ] 例如:abc(123)def  要匹配括号中的数字

Python中引用自定义模块

学习了一小段时间的Python,始终停滞在简单的语法上,不能真正体会到Python的强大之处.今天学习了自定义模块的引用方法.当引用模块时,编译器会先在当前目录,接着去sys.path.Python的安装目录去寻找你引用的模块,如果没有的话,就会报错. 第一种情况,你的模块和你要使用的模块在同一目录下.Hello.py是一个模块,里面有一个打印Hello, World的方法Hello().test.py是一个测试程序,它将引用Hello.py中的hello()方法.因为它和模块在同一目录,所以可

Python开发基础 day12 模块2

sys模块 sys模块提供了一系列有关Python运行环境的变量和函数. 1 #重点记忆 2 sys.argv #命令行参数List,第一个元素是程序本身路径 3 sys.exit(n) #退出执行的程序未见,正常退出时exit(0),不同于循环用的break跳出循环 4 sys.path #返回模块的搜索路径,初始化时使用PYTHONPATH环境变量的值 5 6 #一般 7 sys.platform #返回操作系统平台名称 8 sys.version #获取Python解释程序的版本信息 9

windows 下Python import 导入自定义模块

周末在家研究这个东西,则找到解决方案. 费话少说,上代码 1 #定义一个自定义的函数,如下 2 #函数的名称必须是字母和数字的组合,不能用数字开头 3 #函数名后用小括号括住入参,可以用逗号分隔多个 4 #如果有返回值用return ,如果没有返回值,默认返回None 5 6 def PanDuanFenShu(score): 7 if 100 >= score >= 90: 8 print("A") 9 if 90 > score >= 80: 10 prin

python引入导入自定义模块和外部文件

参考:http://blog.csdn.net/devil_2009/article/details/15816237 项目中想使用以前的代码,或者什么样的需求致使你需要导入外部的包 如果是web 下,比如说django ,那么你新建一个app,把你需要导入的说用东东,都写到这个app中,然后在setting中的app也配上基本就ok了 如果是本地代码,可以有几种方式, 1.这种最简单,也可能最不实用,将你的外部文件放到跟需要调用外部文件的文件同一个包下,同一目录 folder ------to

Python开发基础 day11 模块1

time模块 在Python中,通常有这三种方式来表示时间:时间戳.元组(struct_time).格式化的时间字符串: (1)时间戳(timestamp) :通常来说,时间戳表示的是从1970年1月1日00:00:00开始按秒计算的偏移量.我们运行"type(time.time())",返回的是float类型. (2)格式化的时间字符串(Format String): '1988-03-16' (3)元组(struct_time) :struct_time元组共有9个元素共九个元素:

python开发concurent.furtrue模块:concurent.furtrue的多进程与多线程&协程

一,concurent.furtrue进程池和线程池 1.1 concurent.furtrue 开启进程,多进程&线程,多线程 1 # concurrent.futures创建并行的任务 2 # 进程池 ProcessPoolExecutor,ThreadPoolExecutor 3 # 下面例子是Io密集型,所以时间上比叫多 4 from concurrent.futures import ProcessPoolExecutor 5 import os,time,random 6 def t

hadoop streaming 中跑python程序,自定义模块的导入

今天在做代码重构,以前将所有python文件放到一个文件夹下,上传到hadoop上跑,没有问题:不过随着任务的复杂性增加,感觉这样甚是不合理,于是做了个重构,建了好几个包存放不同功能的python文件,历程如下: 1. 刚开始的时候,在IDE里搞,点击运行,正确.非常赞: 2. 然后搬到服务器上搞,出现了这样的问题: ImportError: no module named XXX 啊,看样子是包引用中路径不对,于是找文章解决: python中,每个py文件被称之为模块,每个具有__init__

python构建发布自定义模块

如何在python中构建发布自己的模块呢? 首先新建一个文件夹,如x99,里面放入__init__.py,setup.py,x99.py三个模块, 其中init空着,setup.py里面写入: from distutils.core import setup setup( name='nineXnine', version='1.1.1', py_modules =['x99'], #这个要跟发布的模块名一致 author='wangyi', author_email='[email prote