使用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执行任务是生成的临时目录
使用python开发ansible自定义模块的简单案例的更多相关文章
- python+selenium之自定义封装一个简单的Log类
python+selenium之自定义封装一个简单的Log类 一. 问题分析: 我们需要封装一个简单的日志类,主要有以下内容: 1. 生成的日志文件格式是 年月日时分秒.log 2. 生成的xxx.l ...
- vscode如何配置debug,python正则表达式如何匹配括号,关于python如何导入自定义模块
关于vscode如何配置debug的问题: 1.下载安装好python,并且配置好 环境变量 2.https://www.cnblogs.com/asce/p/11600904.html 3.严格按照 ...
- Python开发【第一篇】Python基础之自定义模块和内置模块
为什么要有模块,将代码归类.模块,用一砣代码实现了某个功能的代码集合. Python中叫模块,其他语言叫类库. 类似于函数式编程和面向过程编程,函数式编程则完成一个功能,其他代码用来调用即可,提供了代 ...
- python from import 自定义模块
from douban250.items import Douban250Item python import 自定义模块 (1)主程序与模块程序在同一目录下: 如下面程序结构: `-- src ...
- ansible自定义模块
参考官网:http://www.ansible.com.cn/docs/developing_modules.html#tutorial 阅读 ansible 附带的模块(上面链接)是学习如何编写模块 ...
- Python:导入自定义模块
在C语言里为了工程文件的主程序main代码简洁的效果,我们经常用include“XXX”的来导入其.h文件 在Python里Import自己的自定义模块需要注意几个坑 以main主函数和需要导入的ha ...
- Python开发基础-Day16import模块导入和包的调用
模块概念 在Python中,一个.py文件就称之为一个模块(Module).使用模块组织代码,最大的好处是大大提高了代码的可维护性 模块一共三种:python标准库.第三方模块.应用程序自定义模块. ...
- Python开发基础-Day13模块2
sys模块 sys模块提供了一系列有关Python运行环境的变量和函数. #重点记忆 sys.argv #命令行参数List,第一个元素是程序本身路径 sys.exit(n) #退出执行的程序未见,正 ...
- 【python】导入自定义模块
一.直接import 1.当执行文件与要导入的py文件在同一目录下时 假设要在wangyi.py中导入weibo.py文件 import weibo 2.当执行文件与要导入的py文件所在文件夹在同一目 ...
随机推荐
- 第四讲,数据目录表之导入表,以及IAT表
一丶IAT(地址表) 首先我们思考一个问题,程序加载的时候会调用API,比如我们以前写的标准PE 那么他到底是怎么去调用的? 它会Call 下边的Jmp位置 而Jmp位置则是对一个全局变量取内容. 看 ...
- poj 1837 天平问题(01背包变种)
题意:给你n个挂钩,m个砝码,要求砝码都用上,问有多少中方案数 题解:对于这道题目的状态,我们定义一个变量j为平衡度,当j=0的时候,表明天平平衡.定义dp[i][j]表达的含义为使用前n个砝码的时候 ...
- (三)Struts之Action类基础(一)
一.Action的类型 A.使用普通的类 必须有public的execute且返回值为String的方法. ActionType.java package com; public class Acti ...
- 雷达无线电系列(二)经典CFAR算法图文解析与实现(matlab)
一,CFAR基础知识介绍 简介 恒虚警检测技术是指雷达系统在保持虚警概率恒定条件下对接收机输出的信号与噪声作判别以确定目标信号是否存在的技术. 前提 由于接收机输出端中肯定存有噪声(包括大气噪声.人为 ...
- Python练习_购物车_day6
第一次代码 (1) 输出商品列表,用户输入序号,显示用户选中的商品. 页面显示 序号 + 商品名称,如: 1 手机 2 电脑 (2): 用户输入选择的商品序号,然后打印商品名称 (3):如果用户输入的 ...
- Eigen 学习笔记
1. 初始化 //外部指针初始化 ]={...}; ] = ...; kernels[].mu = Vector3d(_mu0); kernels[].sigma_inv = Matrix3d(_s ...
- 如何画svg路径图
在画路径图之前,首先得在package.json引入2个依赖 废话不多说,直接上代码 <style> .green { position: absolute; } .blue { posi ...
- CSS3自定义滚动条样式方法
该代码收集于网上资源,非原创 /*定义滚动条宽高及背景,宽高分别对应横竖滚动条的尺寸*/ ::-webkit-scrollbar { width: 10px; /*对垂直流动条有效*/ height: ...
- 彻底弄懂HTTP缓存机制及原理-转载
首先附上原文地址,非常感谢博主大神的分享彻底弄懂HTTP缓存机制及原理 前言 Http 缓存机制作为 web 性能优化的重要手段,对于从事 Web 开发的同学们来说,应该是知识体系库中的一个基 ...
- (转载)小白的linux设备驱动归纳总结(一):内核的相关基础概念---学习总结
1. 学习总结 小白的博客讲的linux内核驱动这一块的东西比较基础,因此想通过学习他的博客,搭配着看书的方式来学习linux内核和驱动.我会依次更新在学习小白的博客的过程的感悟和体会. 2.1 内核 ...