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 }}' #打印出我们刚才的输出结果
再次验证如下,没有问题