为以后用的方便,记录一下(主要是怕忘,又得折腾半天)
直接贴代码,没太多注释,看不懂的看下源码.Pycharm + b
2.0 Ansible之后的API比2.0之前要复杂,但使用起来的自由度更好,可根据自己需求修改Ansible API的使用方法;还有功能也更强大。
我主要是使用这个API配合Djcelery实现监控系统的数据采集功能,好处是不再需要每中服务器再开发一个代理。这样使用的问题可能主要是程序的负载性能及程序并发性能,我还没测试。
<代码> # - * -编码:use utf8 - * - 进口操作系统 导入系统 导入日志 记录器=logging.getLogger (django) #从进口namedtuple集合 从ansible。库存进口库存 从ansible。var进口VariableManager 从ansible.parsing。dataloader进口dataloader 从ansible.inventory。组导入组 从ansible.inventory。主机进口主机 从ansible.playbook。游戏导入游戏 从ansible.executor。playbook_executor进口PlaybookExecutor 从ansible.executor。task_queue_manager进口TaskQueueManager 从ansible.plugins。回调进口CallbackBase #初始化选项参数 # host_list=C。DEFAULT_HOST_LIST #例:/etc/ansible/hosts遗留使用#执行主机清单,如果不指定文件,会读取ansible。cfg文件的库存=xx字段。 # module_path=None, #例:/usr/share/ansible #模块路径,比如:/usr/share/ansible==交货的例子。 # module_name=C。DEFAULT_MODULE_NAME, #交货:复制#模块的名字。 # module_args=C。DEFAULT_MODULE_ARGS #前:“src=https://www.yisu.com/tmp/a dest=/tmp/b”#模块的参数。 #叉=C。DEFAULT_FORKS #并行性水平并发进程数。 #超时=C。DEFAULT_TIMEOUT #超时# SSH连接超时。 #=C模式。DEFAULT_PATTERN #哪个主机?例:“所有”,“acme.example.org”#主机清单里,匹配的组主机清单。 # remote_user=C。DEFAULT_REMOTE_USER #前:“用户名”#远程登录用户和执行用户。 # remote_pass=C。DEFAULT_REMOTE_PASS, #前:“password123”或没有如果使用键#远程登录用户密码。 # remote_port=None, #如果SSH, 主机=self.host_list, gather_facts=安弧? 任务=[dict (action=dict类型(模块=module_name args=module_args))) ) 戏=()。负载(play_source variable_manager=自我。variable_manager装载机=self.loader) “全面质量管理”=没有 试一试: “全面质量管理”=TaskQueueManager ( 库存=self.inventory, variable_manager=self.variable_manager, 装载机=self.loader, 选择=self.options, 密码=self.passwords, stdout_callback=self.callback ) 结果=tqm.run(玩) 最后: 如果没有没有:全面质量管理 tqm.cleanup () 返回结果 def PrivatePlaybook(自我,剧本): “‘ 运行ansible palybook,得到运行结果 :param剧本:ansible剧本的入口文件的绝对路径 返回:执行状态数 “‘ 试一试: 如果不是os.path.exists(剧本): 记录器。错误(没有这样的文件:% s的%剧本) sys.exit () 自我。遗嘱执行人=PlaybookExecutor(剧本=(剧本,), 库存=self.inventory, variable_manager=self.variable_manager, 装载机=self.loader, 选择=self.options, 密码=self.passwords ) self.executor._tqm。_stdout_callback=self.callback 结果=self.executor.run () 除了例外e: sys.exit (127) 其他: 返回结果 def playbook_result(自我): 主机,result_object self.executor._tqm._stdout_callback.host_ok.iteritems (): 自我。results_raw['成功'][主机]=result_object._result 主机,result_object self.executor._tqm._stdout_callback.host_failed.iteritems (): 试一试: 自我。results_raw['失败'][主机]=result_object._result (stderr的) 除了KeyError: 自我。results_raw['失败'][主机]=result_object._result(“味精”) 主机,result_object self.executor._tqm._stdout_callback.host_unreachable.iteritems (): 自我。results_raw(“的”)(主机)=result_object._result(“味精”) 返回self.results_raw def adhoc_result(自我): “‘ 需要ansible特别执行结果 返回:Dict类型 “‘ 为主机,导致self.callback.host_ok.items (): 自我。results_raw['成功'][主机]=result._result 为主机,导致self.callback.host_failed.items (): 试一试: 自我。results_raw['失败'][主机]=result._result (stderr的) 除了KeyError: 自我。results_raw['失败'][主机]=result._result(“味精”) 为主机,导致self.callback.host_unreachable.items (): 自我。results_raw(“的”)(主机)=result._result(“味精”) 返回self.results_raw if __name__==癬_main__”: #特别的测试 # ad_hoc_example=AnsibleAPI ([ # dict(主机名=10.10.181.132,端口=20003,用户名=案?密码=123456), #)) # ad_hoc_example打印。PrivateAdHoc(“服务”,module_args=name=crond状态=重载) #打印ad_hoc_example.get_result () #剧本测试 playbook_example=AnsibleAPI (dict(内存=dict(主机=[dict(主机名=10.10.181.132,端口=20003,用户名=案?密码=123456), dict(主机名=10.10.181.131,端口=20004,用户名=案?密码=123456)],var=dict ()))) 打印playbook_example.PrivatePlaybook('/用户/fanolee/PycharmProjects/AutoOPPlatform/监控/ansible/剧本/entry_files/内存/memory.yml”) 打印playbook_example.playbook_result()Ansible临时安排的,剧本API +动态生成库存+结果关注