首页 » 运维 » 正文

如何创建自己的ansible module

 

什么是 ansible module?

Ansible modules 是一种使用python写成的一些功能块,可以在yaml文件中调用,也就是playbook中可以调用的模块,例如常见的模块 copy , debug

Ansible 本身就提供了很多很多的模块 地址

什么时候和什么情况下我们会需要自己写module?

绝大多数情况下,我们不需要创建自己的模块module,然而,有些时候官方提供的模块无法提供我们需要的功能,我们只能通过自己的模块来处理一些代码

通常,module和哪些提供了丰富api接口的服务对接起来会更加流畅,例如Github 或者 Pivotal , 当然我们可以通过url来和这些服务进行交互,但是,有时候这个方法太不cool 了,我们要牛B的方法

创建一个简单的例子

幸运的是创建一个ansible module是非常容易的

我们将创建一个简单的例子:从github上删除或者创建一个repo

我们先来一个简单的输出的例子

创建如下文件:

library/github_repo.py

Python

 

Notes

  • main() 是你的程序入口
  • #!/usr/bin/python is 这个是必须的,就和些shell脚本一样
  • AnsibleModule 是从 ansible.module_utils.basic 总导入的,import * 必须是导入全部的 *
  • AnsibleModule 有一些已经写好的方法让我们调用,例如exit_json

play.yml

YAML

 

上边是一个非常简单的例子,调用了我们的module: github_repo, 并注册到一个变量result中,并打印这个变量的值

我们来跑一下:

(note:  命令中未指定 -i , 所以旧的版本可能需要你手动指定一个host文件-i).

输出:

Bash

 

非常漂亮,运行成功了

加入一些变量

当然,一个好的模块一定会有输入的,因为我们要创建repo,所以我们直接拿来一些代码复用 (其实就是创建一个repo需要的参数)

YAML

 

好,然后我们在代码中添加如下内容:

Python

 

注意:

  • 输入的变量是字典形式错在的
  • 参数类型: str, bool, dict, list, …
  • 我们可以指定一些default,required之类的.

上边的例子,我们什么都没有做,只是把传递的值有传递到了exit_json

如果这时候跑一下的话,输出结果将会是我们传递的字典内容

好的,我们现在将一下如何处理这些传递进module的参数

在pythyon的头部我们添加两个函数(函数名称随意,但是要和下变的对应)

Python

 

These are the functions that will actually do the work. Back in our main()method, let’s add some code to call the desired function:

这两个方法是真正用来处理数据的地方,让我们在main还数中添加如何调用这两个函数的部分

Python

 

We use a map to map the state provided to a function that will handle that state.

我们通过map来控制这两个函数

最后的事情就是,让我们的函数真正具有创建和删除的功能(就是调用github的接口,原理还是通过url来访问接口)

Python

 

我们再添加一块来删除刚刚创建的repo:

YAML

 

 最后一步,我们来添加一些主事,和测试的例子

Python

 

结论:

你已经成功的创建了你第一个module.

完整代码:

翻译原文地址:http://blog.toast38coza.me/custom-ansible-module-hello-world/

 

Zhiming Zhang

Senior devops at Appannie
一个奔跑在运维路上的胖子
Zhiming Zhang

Latest posts by Zhiming Zhang (see all)

本文共 3 个回复

  • 2017/03/12 10:11

    不错~~~~

  • kevin 2018/08/05 11:24

    博主,您好~ 刚接触ansible,我想请教一下,如何在ansible里面导入已经开发好的第三方模块lib,忘不吝赐教~

    • Zhiming Zhang

      Zhiming Zhang 博主 2018/08/06 07:28

      @ kevin 第三方和你自己写的其实是一样的,最简单的方法应该就是和本文写的一样放到指定目录下

Comments are closed.