ansible开发篇

ansible自带模块多达上千种,但生产环境比较复杂时,我们可以自定义模块,让ansible按照我们自己定制的动作来执行,下面介绍一下如何自定义ansible模块

第一步,首先需要在git上下载ansible所必须的开发工具

git clone https://github.com/ansible/ansible.git

第二步,cd到刚才下载下来的目录

cd ansible

第三步,创建虚拟环境

pip install virtualenv
python3 -m venv venv
virtualenv venv

第四步,进入到虚拟环境

. venv/bin/activate

第五步,在我们下载好的ansible目录里面有一个requestment.txt文件,这个文件是开发ansible所必须的python包,我们按照指定下载

pip install -r requirements.txt

第六步,设置环境变量的脚本

. hacking/env-setup

补充:以后每次开发都要执行,否则会报各种你看不懂的错误

. venv/bin/activate && . hacking/env-setup

第七步,我们在指定目录下创建文件my_test.py,这里放到ansible/modules或者plugins/modules/都可以

第八步,在my_test.py文件中写入我们要执行的代码

[root@VM-0-15-centos modules]# cat my_test.py 
#!/usr/bin/python
from __future__ import (absolute_import, division, print_function)
__metaclass__ = type
from ansible.module_utils.basic import AnsibleModule
def run_module():
#定义一个字典格式的参数,其中name定义为必须参数而且必须为str类型,new定义为非必须参数类型为bool类型,默认为False module_args
= dict( name=dict(type='str', required=True), new=dict(type='bool', required=False, default=False) ) #定义输出结果为字典类型,在后面执行完毕成功的时候会以字典形式返回这些结果 result = dict( changed=False, original_message='', message='' ) #实例化ansible模块中的AnsibleModule类名称为module module = AnsibleModule( argument_spec=module_args, supports_check_mode=True ) #判断module的check_mode属性是否为真,如果为真直接退出不返回任何东西 if module.check_mode: module.exit_json(**result) #定义result字典的key和value,当作执行成功后返回的信息 result['message1'] = module.params['name'] result['message2'] = 'goodbye' #判断new是否有值,如果有值,将changed状态改为True,否则为默认的False if module.params['new']: result['changed'] = True #加入name的值为fail me,那么调用fail_json错误方法返回错误 if module.params['name'] == 'fail me': module.fail_json(msg='You requested this to fail', **result)
#最后直接退出,不做返回 module.exit_json(
**result) def main(): run_module() if __name__ == '__main__': main()

第九步,我们在/tmp/args.json文件中定义两个json格式的变量

(venv) [root@VM-0-15-centos ansible]# cat /tmp/args.json 
{
    "ANSIBLE_MODULE_ARGS": {
        "name": "hello",
        "new": true
    }
}

第十步,测试,可以看到如下结果,代表ok

第十一步,接下来我们可以写yaml文件来调用我们自定义的模块了

(venv) [root@VM-0-15-centos ansible]# cat testmod.yml 
- name: test my new module
  hosts: localhost
  tasks:
  - name: run the new module
    my_test:
      name: 'hello' #这里是我们刚才定义的两个变量
      new: True
    register: testout  #这个是注册变量,代表我们执行的结果赋值给testout
  - name: dump test output  
    debug:             #启用debug调试模式,
      msg: '{{ testout }}'   #打印出我们刚才的输出结果

再次验证如下,没有问题

原文地址:https://www.cnblogs.com/fengzi7314/p/13921566.html