python ansible模块_使用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执行任务是生成的临时目录

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值