探索ansible runner的源码及执行api原理

本文探讨Ansible Runner的源码,解释Runner类的核心功能,包括如何初始化模块、处理主机列表、模块参数等。通过示例说明了如何使用Ansible API执行任务,并讨论了inventory参数传递的问题。文章适合对Ansible API有进一步了解需求的读者。
摘要由CSDN通过智能技术生成

前沿:

     ansible的文档说的不清不楚,文档一点也不实在,有些范例都做不通,走不通。今天中午吃饭的时候,和同事 祖天彪(这名够霸道吧),聊了很长时间ansible在实际项目中碰到的问题,尤其是运维平台页面上。  下午的时候,找他去玩耍,这哥们正好在看ansible的api源码,也就是 ansible runner ~    就这样一块交流一两个小时,把runner 这部分的核心代码给过了一遍。 中文的文档真的很少, 我这边就简单的阐述下,看完后的一些总结。 可能有些地方不对,或者是没有说明白,还请大家见谅。


1
2
3
4
5
6
7
8
9
10
11
12
import ansible.runner
runner = ansible.runner.Runner(
    host_list= "/etc/ansible/xiaorui.py"
    module_name= 'command' ,
    module_args= 'ip a' ,
    pattern= 'web' ,                    
)
 
datastructure = runner.run()
print  '\n'
print  '\n'
print  datastructure


    

上面是一个简单的ansible api的执行的例子。 我们可以看到他调用的runner模块。


runner目录下面有个__init__.py文件,__init__.py的作用, 相当于class中的def __init__(self):函数,用来初始化模块。 把所在目录当作一个package处理。不懂的去看,python包相关的基础。 

原文:http://rfyiamcool.blog.51cto.com/1030776/1420147


下面讲解下 Runner这个类。

class Runner(object):

    ''' core API interface to ansible '''


    # see bin/ansible for how this is used...


    def __init__(self,

        host_list=C.DEFAULT_HOST_LIST,      这里不仅可以放 静态的hosts文件,也可以放 inventory的脚本,脚本要777权限。


        module_path=None,               这个是ansible的路径,一般不用写


        module_name=C.DEFAULT_MODULE_NAME,      模块的名字,模块的位置要选定在/usr/share/absible下,不然会识别不到。   要注意下~


        module_args=C.DEFAULT_MODULE_ARGS,  # ex: "src=/tmp/a dest=/tmp/b"   模块的参数


        forks=C.DEFAULT_FORKS,              # parallelism level   进程的数目,他的逻辑是这样,你如果填入了20个进程,他会判断你的list_hosts是否有20个,没有的话,他就会根据主机的数目来派生进程,如果超过20个,那就用multiprocess进程池pool来调度。mulitiprocess本身有个isalive的东西,来判断分离出去进程的存活状态。


        timeout=C.DEFAULT_TIMEOUT,       这个就是超时的时间


        pattern=C.DEFAULT_PATTERN,          # which hosts?  ex: 'all', 'acme.example.org'   这个是做相关的匹配,是关于inventory的匹配


        remote_user=C.DEFAULT_REMOTE_USER,  # ex: 'username'  远端用户的选择


        remote_pass=C.DEFAULT_REMOTE_PASS,  # ex: 'password123' or None if using key 远端密码的选择


        remote_port=None,                   # if SSH on different ports   远端端口的选择


        private_key_file=C.DEFAULT_PRIVATE_KEY_FILE, # if not using keys/passwords  还可以用指定key


        sudo_pass=C.DEFAULT_SUDO_PASS,      # ex: 'password123' or None   sudo之后的密码的推送


        background=0,                       # async poll every X seconds, else 0 for non-async  看字眼就知道他是做什么的了,他非常的像 saltstack的 event, 当派生出了一个任务后,

        产生一个ansible_job_id,然后时不时的去拿数据


        transport=C.DEFAULT_TRANSPORT,      # 'ssh', 'paramiko', 'local'  这里是选择你的链接得到方式,默认是用的 paramiko


        conditional='True',                 # run only if this fact expression evals to true     这个是什么呢?  相当与 puppet saltstack 里面的require,状态的判断。  

                   

        callbacks=None,                     # used for output  回调的输出


        sudo=False,                         # whether to run sudo or not 是否是sudo


        sudo_user=C.DEFAULT_SUDO_USER,      # ex: 'root'  sudo的时候,用到的用户名


        ):




再来关注下这个,我和同事的关注点,不太一样,他以前经常用salt,他不想写hosts文件,或者是inventory文件,想直接 ansible  ip地址 -m shell "ip a" 类似这样的使用,而我的想法是,想给inventory传递参数,  inventory在被ansbile调用的时候,是不能传递参数的, 他后面的那个参数,只是获取 json的那个key。 

简单的说, ansible -i nima.py "bj_nginx" -m shell "dir"  这里的bj_nginx 是不能传递给nima里面的,而是获取nima返回的那片json的。


1
self.inventory        = utils. default (inventory, lambda: ansible.inventory.Inventory(host_list))

咱们进到,inventory的目录

[root@devops-ruifengyun inventory ]$ pwd

/usr/lib/python2.7/dist-packages/ansible/inventory


试图找下,官网支持不支持针对inventory的传递参数,host_list传递给了 Inventory类,他的逻辑也很干练,如果 host_list  如果没有传入的话,默认走的是 /etc/ansible/hosts文件,如果你指定了,他会从你的文件读入的,  首先如果是str,根据逗号来区分并且去除空格,放到list里面。接着是list了,。。。  霹雳拉ye,oh。。


原文:http://rfyiamcool.blog.51cto.com/1030776/1420147


1
2
3
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值