ansible自定义模块开发指南

3,409 阅读5分钟

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