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

使用python开发ansible自定义模块的简单案例的更多相关文章

  1. python+selenium之自定义封装一个简单的Log类

    python+selenium之自定义封装一个简单的Log类 一. 问题分析: 我们需要封装一个简单的日志类,主要有以下内容: 1. 生成的日志文件格式是 年月日时分秒.log 2. 生成的xxx.l ...

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

    关于vscode如何配置debug的问题: 1.下载安装好python,并且配置好 环境变量 2.https://www.cnblogs.com/asce/p/11600904.html 3.严格按照 ...

  3. Python开发【第一篇】Python基础之自定义模块和内置模块

    为什么要有模块,将代码归类.模块,用一砣代码实现了某个功能的代码集合. Python中叫模块,其他语言叫类库. 类似于函数式编程和面向过程编程,函数式编程则完成一个功能,其他代码用来调用即可,提供了代 ...

  4. python from import 自定义模块

    from douban250.items import Douban250Item python import 自定义模块 (1)主程序与模块程序在同一目录下: 如下面程序结构: `-- src    ...

  5. ansible自定义模块

    参考官网:http://www.ansible.com.cn/docs/developing_modules.html#tutorial 阅读 ansible 附带的模块(上面链接)是学习如何编写模块 ...

  6. Python:导入自定义模块

    在C语言里为了工程文件的主程序main代码简洁的效果,我们经常用include“XXX”的来导入其.h文件 在Python里Import自己的自定义模块需要注意几个坑 以main主函数和需要导入的ha ...

  7. Python开发基础-Day16import模块导入和包的调用

    模块概念 在Python中,一个.py文件就称之为一个模块(Module).使用模块组织代码,最大的好处是大大提高了代码的可维护性 模块一共三种:python标准库.第三方模块.应用程序自定义模块. ...

  8. Python开发基础-Day13模块2

    sys模块 sys模块提供了一系列有关Python运行环境的变量和函数. #重点记忆 sys.argv #命令行参数List,第一个元素是程序本身路径 sys.exit(n) #退出执行的程序未见,正 ...

  9. 【python】导入自定义模块

    一.直接import 1.当执行文件与要导入的py文件在同一目录下时 假设要在wangyi.py中导入weibo.py文件 import weibo 2.当执行文件与要导入的py文件所在文件夹在同一目 ...

随机推荐

  1. 为什么用JS取不到cookie的值?解决方法如下!

    注意:cookie是基于域名来储存的.要放到测试服务器上或者本地localhost服务器上才会生效.cookie具有不同域名下储存不可共享的特性.单纯的本地一个html页面打开是无效的. 明明在浏览中 ...

  2. Nginx安装配置|Nginx反向代理|Nginx支持HTTPS|Nginx重定向

    Nginx安装配置 可以直接看到最下面的HTTPS. Nginx安装 我的系统如下: No LSB modules are available. Distributor ID: Ubuntu Desc ...

  3. 获取类的描述信息 DescriptionAttribute

    static void Main(string[] args) { var attrs = typeof(TestClass).GetCustomAttributes(typeof(System.Co ...

  4. .net Core如何对静态文件的访问进行鉴权操作?

    之前给公司开发了一个文件管理服务,最基本的功能就是文件的上传下载,以及更新删除.预览:负责公司各个子系统的相关附件的管理,所有的接口都通过AOP来进行身份拦截认证了,但是在进行预览的时候,因为采用的是 ...

  5. Java 之 HashMap 集合

    一.HashMap 概述 java.util.HashMap<k,v> 集合 implements Map<k,v> 接口 HashMap 集合的特点: 1.HashMap 集 ...

  6. SAP Marketing Cloud的Contact导入配置和数据合并原理

    SAP很多系统的主数据都支持从外部系统导入,SAP Marketing Cloud也是如此,contact主数据可以来自Hybris Commerce,CRM,ERP或者Twitter,Faceboo ...

  7. 第二章 Django之python安装(1)

    Python 安装 Django 由百分百的纯 Python 代码编写而成,因此必须在系统中安装 Python .Django 需要 2.3 或更高版本的 Python.如果使用的是 Linux 或 ...

  8. windows系统编辑过的脚本文件,在linxu上执行报错 /bin/sh^M: bad interpreter: No such file or directory

    如题! 现象: 当时的场景是这样的:我在IDEA中编辑了项目中的脚本sh,然后利用maven打成zip包.把zip包上传到linux服务器解压运行. 当在linux服务器上运行该sh脚本文件时,提示错 ...

  9. mysql 忘记/修改数据库密码

    window mysql 修改密码 方法1: 用SET PASSWORD命令 mysql -u root mysql> SET PASSWORD FOR 'root'@'localhost' = ...

  10. FreeRTOS任务基础概念

    RTOS系统的核心就是任务管理: 任务的特性 在RTOS中每个任务都有自己的运行环境,不依赖于系统中其他的任务或者调度器,任何一个时间点只能有一个任务运行,具体运行哪个任务是由任务调度器来决定的,而任 ...