Ansible临时安排的,剧本API +动态生成库存+结果关注

  

为以后用的方便,记录一下(主要是怕忘,又得折腾半天)

  

直接贴代码,没太多注释,看不懂的看下源码.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 +动态生成库存+结果关注