- 一、自定义模块运行原理
- 二、自定义模块实战
- 2.1 shell方式
- 2.2 python方式
- 2.3 golang方式
- 三、测试验证
- 3.1 shell方式验证
- 3.2 python方式验证
- 3.3 golang方式验证
ansible已经提供了非常多的模块,涵盖了系统、网络、数据库、容器、以及其他的方方面面的领域,几乎可以不用重复造轮子,只要你能想的到的,官方基本上都已经提供了,可以说极大的提高了我们的自动化效率,但是总会有些情况无法满足我们的需求,因此我们需要学会如何去编写一个自定义的模块
在下文的介绍中,会介绍下自定义模块的工作原理,分别以shell, python, golang等来实现自定义模块,通过这三种写法来实现修改主机的hosts文件的功能。
一、自定义模块运行原理
首先我们可以通过修改配置文件来设置自定义模块的位置,默认配置文件位置:/etc/ansible/ansible.cfg,例如如下配置:
[defaults]
# some basic default values...
library = /opt/workspace/ansible/library # 此目录可以随意设置
这里我通过修改ansible的配置文件,来配置我们存放自定义模块的目录,也就是说我们所编写的自定义模块,可以存放至此目录中,在使用自定义模块时就会从此目录进行拷贝,注意是拷贝。
下面我们在/opt/workspace/ansible/library这个目录中编写一个shell脚本,看看ansible在运行时做了什么?
#!/bin/bash
echo "hello world"
保存为文件:test_mod.sh,此时我们的模块名称就叫做:test_mod,接下来我们以ad-hoc的方式运行下这个模块,看看会发生什么?
# ansible localhost -m test_mod -a "name=tom age=18"
localhost | FAILED! => {
"changed": false,
"module_stderr": "",
"module_stdout": "hello world\n",
"msg": "MODULE FAILURE\nSee stdout/stderr for the exact error",
"rc": 0
}
可以看到,我们在通过ad-hoc执行模块时,传入了两个参数:name和age,这两个参数是我随意设置的,执行之后ansible输出了一段结果,看格式应该是一个json,其中module_stdout输出了我们脚本里的命令输出,msg却输出了一段内容:MODULE FAILURE\nSee stdout/stderr for the exact error,关于为什么会输出这个错误,这里先不说明,到后面大家就会明白。
接下来,我们开启debug来看看会发生什么?