模块是一个独立的, 可以复用的脚本, 它可以被anisible API, Ansible 或者ansible-playbook使用.   在模块退出之前, 它通过输出一个json字符串到标准输出从而反馈信息给ansible.  你可以用任何一种语言去写一个模块. 写好的模块可以放在ANSIBLE_LIBRARY或者--module-path目录下. 通常情况下playbook的目录下的library目录也可以做为模块的默认目录.

1. 模块的基本开发模式

  一个简单的模块, 之所以用这个作为例子, 是因为你可以用任何语言去开发自己的模块, 我们需要了解模块最基本的开发模式

#!/usr/bin/python

import datetime
import json date = str(datetime.datetime.now())
print json.dumps({
"time" : date
})

  模块测试

git clone git://github.com/ansible/ansible.git --recursive
source ansible/hacking/env-setup ansible/hacking/test-module -m ./timetest.py

  模块参数

  ansible会自动的把参数保存到一个参数文件中, 所以我们必须读取并分析这个文件. 这个参数文件只是一个字符串, 所以任何形式的参数都是合法的.

#!/usr/bin/python

# import some python modules that we'll use.  These are all
# available in Python's core import datetime
import sys
import json
import os
import shlex # read the argument string from the arguments file
args_file = sys.argv[1]
args_data = file(args_file).read() arguments = shlex.split(args_data)
for arg in arguments: # ignore any arguments without an equals in it
if "=" in arg: (key, value) = arg.split("=")
if key == "time": rc = os.system("date -s \"%s\"" % value) if rc != 0:
print json.dumps({
"failed" : True,
"msg" : "failed setting the time"
})
sys.exit(1) date = str(datetime.datetime.now())
print json.dumps({
"time" : date,
"changed" : True
})
sys.exit(0) date = str(datetime.datetime.now())
print json.dumps({
"time" : date
})
测试模块
ansible/hacking/test-module -m ./timetest.py -a "time=\"March 14 12:23\""

  二进制模块

  二进制模块的支持会在ansible2.2中加入,  当ansible发现是二进制模块是, 它会提供一个json文件argv[1]来保存参数.

  提供facts的模块

  setup模块可以提供很多系统相关的变量, 然而用户不修改系统模块也可以添加自定义变量, 只需要在模块的返回值中加入ansible_facts这个键值. 例如:

{
"changed" : True,
"rc" : 5,
"ansible_facts" : {
"leptons" : 5000,
"colors" : {
"red" : "FF0000",
"white" : "FFFFFF"
}
}
} 开发一个site_facts的模块并且在所有的playbook之前调用是一个较好的习惯,

2. 通用的模块样板

  如果你使用python来开发自定义模块, ansible提供了很多强大的快捷方式. 模块仍然保存在一个文件当中, 但是我们不需要再去处理参数文件. 最好的学习方法是去学习ansible的核心模块.

from ansible.module_utils.basic import AnsibleModule
if __name__ == '__main__':
main() Note: 对于ansible2.1来说, 上面的导入已经不能工作, 必须使用from ansible.module_utils.basic import *
def main():
module = AnsibleModule(
argument_spec = dict(
state = dict(default='present', choices=['present', 'absent']),
name = dict(required=True),
enabled = dict(required=True, type='bool'),
something = dict(aliases=['whatever'])
)
)
AnsibleModule 提供和很多通用的函数来处理返回值, 分析参数并允许你检查输入
成功返回
module.exit_json(changed=True, something_else=12345)
失败退出
module.fail_json(msg="Something fatal happened")

还有很多其他的基础功能, 课参看lib/ansible/module_utils/basic.py 

  check模式

  模块支持check模式. 如果用户在check模式下运行ansible, 模块会去尝试预判change是否发生. 如果想定义一个check模块, 用户必须在初始化模块的时候设置supports_check_mode=True

module = AnsibleModule(
argument_spec = dict(...),
supports_check_mode=True
) if module.check_mode:
# Check if any changes would be made but don't actually make those changes
module.exit_json(changed=check_if_system_state_would_be_changed())
作为模块的开发者, 你有责任去保证在check模式下没有系统状态被改变?
Remember that, as module developer, you are responsible for ensuring that no system state is altered when the user enables check mode. 如果你的模块不支持check模式, 而用户却在check模式下运行ansible, 你的模块会被自动跳过

  在模块中永远不要使用"print "some status message"".  因为在ansible中输出被假定为一个可用的json.

  Modules must not output anything on standard error, because the system will merge standard out with standard error and prevent the JSON from parsing. Capturing standard error and returning it as a variable in the JSON on standard out is fine, and is, in fact, how the command module is implemented.

ANSIBLE_KEEP_REMOTE_FILES 这个参数会保留在远程服务器上执行的python脚本. 可以用来debug.

ansible module的更多相关文章

  1. Ansible详解(一)

    简介 Ansible是一个简单的自动化运维管理工具,基于Python语言实现,由Paramiko和PyYAML两个关键模块构建,可用于自动化部署应用.配置.编排task(持续交付.无宕机更新等).主版 ...

  2. ansible配置文件详解

    # ansible配置文件配置 配置项介绍 , 配置文件ansible.cfg, 运行playbook时,默认时在yaml文件所在路径寻找,然后再去/etc/ansible/下寻找 [defaults ...

  3. Ansible安装部署以及常用模块详解

    一.  Ansible 介绍Ansible是一个配置管理系统configuration management system, python 语言是运维人员必须会的语言, ansible 是一个基于py ...

  4. 初探ansible

    Ansible 基于ssh的自动化运维工具 ansible 配置文件详解 ansible.cfg 文件 文件默认放置在/etc/ansible下,ansible读取配置文件的顺序是: 当前命令执行目录 ...

  5. ansible环境部署及常用模块总结 - 运维笔记

    一.  Ansible 介绍Ansible是一个配置管理系统configuration management system, python 语言是运维人员必须会的语言, ansible 是一个基于py ...

  6. 【Ansible】的python api

    [Ansible API] Ansible本身就是由python写成,所有其对python形式的API的支持应该不错. 其API分不同的版本,这个版本也就是ansible本身的版本,可以通过ansib ...

  7. 1、Ansible简介及简单安装、使用

    参考Ansible权威指南:https://ansible-tran.readthedocs.io/en/latest/index.html 以下内容学习自马哥教育 Ansible: 运维工作:系统安 ...

  8. 【Ansible 文档】【译文】网络支持

    Networking Support 网络支持 Working with Networking Devices 使用网络设备 自从Ansible 2.1开始,你现在可以使用成熟模型 - 编写 play ...

  9. 【Ansible 文档】【译文】Windows 支持

    see also:List of Windows Modules Windows Support Windows 支持 Windows: How Does It Work Windows:如何工作 正 ...

随机推荐

  1. jQuery手机对话框插件

    最近,公司一直在做微网站之类的,一直在看别的微网站,发现一些对话框的样式很不错,所以自己就动手把样式剥离出来写成一个简单的插件,方便其他项目中使用到.废话不多说,上插件源码: /* *jQuery简单 ...

  2. Xcode开发和调试总结

    Xcode是iOS开发主要的工具.IDE.关于Xcode的细枝末节,可以参考苹果的官方文档或者众多的说明.此文档主要涉及常用开发和调试注意事项,参考版本为Xcode 5.1.1. 目标设置: 在此,我 ...

  3. rcp(插件开发) 如何查找自己定义的扩展点

    规则: 扩展点所在的插件ID(X)+扩展点的name(Y) 也就是 X.Y 具体代码 Platform.getExtensionRegistry().getExtensionPoint(X.Y).ge ...

  4. C语言变参函数的编写

    1. 引言 一般我们编程的时候,函数中形式参数的数目通常是确定的,在调用时要依次给出与形式参数对应的实际参数.但在某些情况下我 们希望函数的参数个数可以根据需要确定,因此c语言引入可变参数函数.典型的 ...

  5. 分布式搜索ElasticSearch构建集群与简单搜索实例应用

    分布式搜索ElasticSearch构建集群与简单搜索实例应用 关于ElasticSearch不介绍了,直接说应用. 分布式ElasticSearch集群构建的方法. 1.通过在程序中创建一个嵌入es ...

  6. IOS学习之路十九(JSON与Arrays 或者 Dictionaries相互转换)

    今天写了个json与Arrays 或者 Dictionaries相互转换的例子很简单: 通过 NSJSONSerialization 这个类的 dataWithJSONObject: options: ...

  7. 自定义生命周期的设计(iOS篇)

    自定义生命周期的设计(iOS篇) 首先要确定一点,我们的App,要基于XIB文件进行编程,而不是在每个相应的ViewController里面去手动创建页面的每个控件.这样做的好处是,将页面布局与业务逻 ...

  8. .net下简单快捷的数值高低位切换

    .net下简单快捷的数值高低位切换 做网络通讯中数值传输是很普遍的事情,但数值的存储在不平台和硬件上存储方式都不一样,主要有两大类分别是高位和低位存储:而.net平台下是低位存储,通过.net提供的函 ...

  9. C#基础知识回顾--线程传参

    C#基础知识回顾--线程传参 在不传递参数情况下,一般大家都使用ThreadStart代理来连接执行函数,ThreadStart委托接收的函数不能有参数, 也不能有返回值.如果希望传递参数给执行函数, ...

  10. php的sendmail发件人邮箱设定

    以前就碰到过设置发件人后缀的方式,这次迁移服务器居然忘记,从头开始记录下 1:第一种方法,修改/etc/hosts,据说sendmail使用hosts里面的本地设置域名,修复方法如下 127.0.0. ...