• 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 }}'   #打印出我们刚才的输出结果

    再次验证如下,没有问题

  • 相关阅读:
    linux入门_韩顺平_复习版_用户管理
    linux入门_韩顺平_复习版_开启、重启、用户登陆注销
    python入门_老男孩_列表的增删查改
    git入门_尚硅谷_git简介
    码农要求_python豆瓣_2018校招
    python入门_老男孩_数据类型简介_int/bool/str转换_字符串索引和切片_字符串操作_day3
    LeetCode--链表3-经典问题
    LeetCode--链表2-双指针问题
    LeetCode--链表1-单链表
    LeetCode---二叉树3-总结例题
  • 原文地址:https://www.cnblogs.com/fengzi7314/p/13921566.html
Copyright © 2020-2023  润新知