Ansible modules自定义开发指南
一、ansible介绍
1、ansible简介
官方的title是“Ansible is Simple IT Automation”——简单的自动化IT工具。
Ansible跟其他IT自动化技术的区别在于其关注点并非配置管理、应用部署或IT流程工作流,而是提供一个统一的界面来协调所有的IT自动化功能,因此Ansible的系统更加易用,部署更快。
Ansible可以让用户避免编写脚本或代码来管理应用,同时还能搭建工作流实现IT任务的自动化执行。IT自动化可以降低技术门槛及对传统IT的依赖,从而加快项目的交付速度。
2、ansible架构及工作原理
andible基本架构如下图所示

l ansible core : ansible 自身核心模块
l host inventory: 主机库,定义可管控的主机列表
l connection plugins: 连接插件,一般默认基于 ssh 协议连接
l modules:core modules ( 自带模块 ) 、 custom modules ( 自定义模块 )
l playbooks :剧本,按照所设定编排的顺序执行完成安排任务
二、ansible自定义模块编写
1 ansible自定义模块本质
模块是Ansible代表您在本地或远程运行的可重用的独立脚本。模块与本地计算机,API或远程系统进行交互,以执行特定的任务,例如更改数据库密码或启动云实例。每个模块都可以由Ansible API一起使用,或由ansible或ansible-剧本程序。模块提供了一个已定义的接口,通过在退出之前将JSON字符串打印到stdout来接受参数并将信息返回给Ansible。Ansible附带了数千个模块,您可以轻松编写自己的模块。如果要编写供本地使用的模块,则可以选择任何编程语言并遵循自己的规则。如果要为Ansible贡献模块,则必须使用Python编写模块,并遵循以下描述的标准格式。
2、ansible自定义模块添加文档说明
用Python编写的每个Ansible模块必须以特定顺序从七个标准部分开始,然后是代码。按顺序排列的部分是:
Python shebang & UTF-8 coding: Python shebang和UTF-8编码
Copyright and license: 版本和许可
ANSIBLE_METADATA block: ANSIBLE_METADATA
DOCUMENTATION block: 文档块
EXAMPLES block: 示例块
RETURN block: 返回块
Python imports: python导入
Testing module documentation: 测试模块文档
l Python shebang和UTF-8编码:
每个Ansible模块都必须以#!/usr/bin/python- 开头的“ shebang” ansible_python_interpreter开始工作。紧随其后的是要说明文件是UTF-8编码的。# -*- coding: utf-8 -*-
l 版权和许可:在shebang和UTF-8编码之后,应该有与原始版权持有人的版权行和许可证声明。许可证声明只能是一行,而不是完整的GPL前缀。
对模块的主要添加(例如,重写)可能会添加其他版权行。任何法律审查都将包括源代码管理历史记录,因此不需要详尽的版权标头。当为重要功能添加第二条版权行或进行重写时,请将较新的行添加到较旧的行上方:
l 定义ANSIBLE_METADATA,该变量描述有关其他工具使用的模块的信息
l 定义EXAMPLES,该变量用来描述模块的一个或多个示例使用
l 定义RETURN,该变量用来描述模块的返回数据信息
添加参数source和dest返回信息
l Python导入
以上文档说明在脚本中编写完成后可以通过ansible-doc 来查看这些信息
3 ansible自定义模块配置
Ansible组成:
tree /etc/ansible/
/etc/ansible/
├── ansible.cfg # ansible的配置文件
├── hosts # ansible的主仓库 用来存储需要管理的远程主机的相关信息
└── roles
首先先创建一个存放ansible自定义模板的路径:
mkdir /usr/share/ansible 自定义可以根据自己的环境进行选择或创建
然后在ansible配置文件/etc/ansible/ansible.cfg开放自定义模板路径的配置:
Library=/usr/share/ansible
4 ansible自定义模块编写
l Ansible提供了许多模块实用程序,它们提供了在开发自己的模块时可以使用的辅助功能。 basic.py模块为程序提供访问Ansible库的主要入口点,所有Ansible模块必须至少从basic.py导入:
from ansible.module_utils.basic import *
l AnsibleModule 提供和很多通用的函数来处理返回值, 分析参数并允许你检查输入:
成功返回
module.exit_json(changed=True,
something_else=12345)
失败退出
module.fail_json(msg="Something fatal happened")
平时我们使用别人的模块,会发现changed字段,有的时候是true,有的时候是false,其实changed并不代表什么,ansible里面一致认为的是对系统进行了更改的changed为true,未更改的为false,它呢其实只是一个记录的值而已,
要改变chnged的值,返回的字典里面只要changed=Fasle就好了
result = dict(changed=False, echo = ‘success’)l Ansible自定义模块参数的设定方法
|
参数类型 |
方法 |
|
必填项 |
arg=dict(required=True) |
|
默认项 |
arg=dict(default='yes') |
|
选择项 |
arg=dict(defalut='yes',choices['yes','no']) |
|
布尔值 |
arg=dict(type='bool') |
|
字符型 |
arg=dict(type='str') |
|
任选变量 |
arg1=dict(aliaes=['arg2','arg3']) |
任选变量的说明,即以下的命令是一样的效果
ansible xxx -m echopong -a 'arg1='xxx'
ansible xxx -m echopong -a 'arg2='xxx'
ansible xxx -m echopong -a 'arg3='xxx'
---
1、无参数ansible自定模块实例:an_demo.py
from ansible.module_utils.basic import *
module = AnsibleModule(argument_spec = dict())
result = dict(echo=‘pong’)
module.exit_json(**result)
2、带参ansible自定义模块实例:an_param_demo.py
from ansible.module_utils.basic import *
module = AnsibleModule(argument_spec = dict(arg = dict(required = True)))
param = module.params[‘arg’]
if param == ‘1’:
result = dict(echo = ‘success’)
module.exit_json(**result)
else:
result = dict(echo = ‘failed’,msg = 0)
module.fail_json(**result)
软件分发demo:安装tomcat