自动化运维利器Ansible-扩展ansible
文章目录
一、使用插件
1 回调插件介绍
1.1 修改默认的回调插件
同时只能有一个回调插件作为主要的管理者,用于输出到屏幕。
在 ansible.cfg
中配置 stdout 插件。
[defaults]
stdout_callback = json # 以 JSON 的格式输出结果
默认 情况下这仅对 playbook 生效,如果想让 ad-hoc 方式生效应该在 ansible.cfg
文件中做如下设置:
[defaults]
bin_ansible_callbacks = True
设置成功后,随意执行之前的一个 playbook 就会看到输出结果是 JSON 格式的数据。
1.2 启用其他内置的回调插件
大部分情况下,无论是内置的回调插件还是自定义的回调插件,都需要在 ansible.cfg
中添加到白名单中,从而才能启用。
callback_whitelist = timer, mail, profile_roles, custom_callback
timer
这个回调插件可以计算整个 playbook 的运行时间mail
这个回调插件可以实现发送邮件的功能profile_roles
这个插件是统计每个任务的用时时间custom_callback
是自定义的插件,稍后会讲
1.3 获取帮助
ansible-doc -t callback -l
可以查看当前可用的回调插件列表
ansible-doc -t callback <callback plugins name>
可查看具体回调插件的帮助文档
比如:
[root@qfedu ~]# ansible-doc -t callback timer
> TIMER (/usr/lib/python2.7/site-packages/ansible/plugins/callback/timer.py)
This callback just adds total play duration to the play stats.
* This module is maintained by The Ansible Community
REQUIREMENTS: whitelist in configuration
CALLBACK_TYPE: aggregate
METADATA:
status:
- preview
supported_by: community
2 回调插件类型
回调插件类型在回调插件类中定义:
class CallbackModule(CallbackBase):
CALLBACK_TYPE = 'notification'
不同的回调类型对于 playbook 的输出有不一样的效果
-
stdout
标准输出类型,用在回调的主管理者 -
aggregate
聚合类型, 把此类型插件处理的结果和stdout
类型插件合并一起输出到标准输出。比如 :timer
,profile_tasks
等。 -
notification
通知类型,不参与标准输出,也不影响标准输出插件的正常输出,只是会把执行 playbook 的返回值写的指定的媒介中。比如:
log_plays
,mail
。假如自定义把执行playbook 的结果输出到数据库中就可以使用此类型。
3 把返回结果输出到日志中
内置的回调插件 log_plays
会将 playbook 的返回信息输出到
/var/log/ansible/hosts
目录中。
可以在 ansible.cfg
中配置指定的目录,使用 log_folder
比如,把日志存到 /tmp/ansible/hosts/
目录下
在 ansible.cfg
文件的最后添加如下配置
配置日志存放的目录
[callback_log_plays]
log_folder=/tmp/ansible/hosts/
配置到白名单
ansible.cfg
callback_whitelist = log_plays
**执行 playbook **
还是按照原来的方式执行任意一个 playbook
查看输出结果
[root@qfedu.com ~]# ls /tmp/ansible/hosts/
172.18.0.3 172.18.0.4 172.18.0.5
[root@qfedu.com ~]# cat /tmp/ansible/hosts/172.18.0.3
Apr 24 2020 06:43:57 - OK - {
"module_args": {
"data": "pong"}} => {
"changed": false, "ping": "pong", "_ansible_no_log": false, "ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"}}
Apr 24 2020 06:45:11 - OK - {
"module_args": {
"warn": true, "executable": null, "_uses_shell": true, "strip_empty_ends": true, "_raw_params": "date +\"%F %T\"", "removes": null, "argv": null, "creates": null, "chdir": null, "stdin_add_newline": true, "stdin": null}} => {
"stderr_lines": [], "cmd": "date +\"%F %T\"", "end": "2020-04-24 06:45:11.110025", "_ansible_no_log": false, "stdout": "2020-04-24 06:45:11", "changed": true, "rc": 0, "start": "2020-04-24 06:45:10.878037", "stderr": "", "delta": "0:00:00.231988", "stdout_lines": ["2020-04-24 06:45:11"], "ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"}}
二、开发自定义插件
1 开发插件规则
插件配置和文档标准
Ansible的在线帮助文档是根据每个模块的源代码中的DOCUMENTATION
模块生成的。该DOCUMENTATION
块必须是有效的YAML。
需要为您的插件定义可配置选项,在python文件的部分 DOCUMENTATION
中对其进行描述。
自Ansible 2.4版以来,回调和连接插件已经开始以这种方式声明配置要求了。现在大多数插件类型都执行相同的操作。这种方法可确保插件选项的文档始终是正确的和最新的。
DOCUMENTATION
块中的所有字段均为小写。除非另有说明,否则所有字段都是必填字段:
DOCUMENTATION = '''
callback: log_plays
type: notification
short_description: write playbook output to log file