设为首页 收藏本站
查看: 1087|回复: 0

[经验分享] ansible Developing Plugins

[复制链接]

尚未签到

发表于 2018-1-2 15:18:26 | 显示全部楼层 |阅读模式
  

  #stdout_callback = mycallbackplugin  

Developing Callback Plugins
  回调插件是通过以Base(Callbacks)类作为父类创建一个新类创建的:
  

from ansible.plugins.callback import CallbackBase  
from ansible import constants as C
  

  
class CallbackModule(CallbackBase):
  pass
  从那里,覆盖您要为其提供回调的CallbackBase中的特定方法。 对于要与可复制版本2.0及更高版本一起使用的插件,您应该仅覆盖以v2开头的方法。 有关可以覆盖的方法的完整列表,请参阅lib / ansible / plugins / callback目录中的__init__.py 。
  以下示例显示了如何实现Ansible的计时器插件:
  

# Make coding more python3-ish  
from __future__ import (absolute_import, division, print_function)
  
__metaclass__ = type
  

  
from datetime import datetime
  

  
from ansible.plugins.callback import CallbackBase
  

  

  
class CallbackModule(CallbackBase):
  """
  
    This callback module tells you how long your plays ran for.
  
    """
  CALLBACK_VERSION = 2.0
  CALLBACK_TYPE = 'aggregate'
  CALLBACK_NAME = 'timer'
  CALLBACK_NEEDS_WHITELIST = True
  

  def __init__(self):
  

  super(CallbackModule, self).__init__()
  

  self.start_time = datetime.now()
  

  def days_hours_minutes_seconds(self, runtime):
  minutes = (runtime.seconds // 60) % 60
  r_seconds = runtime.seconds - (minutes * 60)
  return runtime.days, runtime.seconds // 3600, minutes, r_seconds
  

  def playbook_on_stats(self, stats):
  self.v2_playbook_on_stats(stats)
  

  def v2_playbook_on_stats(self, stats):
  end_time = datetime.now()
  runtime = end_time - self.start_time
  self._display.display("Playbook run took %s days, %s hours, %s minutes, %s seconds" % (self.days_hours_minutes_seconds(runtime)))
  请注意,对于Ansible> = 2.0正常运行的插件,需要使用CALLBACK_VERSION和CALLBACK_NAME定义。
  

Connection Plugins
  默认情况下,Ansys提供了一个'paramiko'SSH,本机ssh(简称'ssh'),'本地'连接类型,还有一些小的玩家,如'chroot'和'jail'。 所有这些都可以用于剧本和/ usr / bin / ansible来决定如何与远程机器通话。 这些连接类型的基本知识将在“ 入门”部分中介绍。 如果您想扩展Ansible以支持其他传输(SNMP,消息总线等),就像复制其中一个现有模块的格式并将其放入连接插件目录一样简单。 连接的“smart”值允许基于系统功能选择paramiko或openssh,如果OpenSSH支持ControlPersist,则在Ansible 1.2.1和更高版本中选择“ssh”。 以前的版本不支持“smart”。
  关于编写连接插件的更多文档正在等待,尽管您可以轻松地跳转到lib / ansible / plugins / connection中

Lookup Plugins
  Lookup插件用于从外部数据存储中提取数据。 可以在Playbook中使用Lookup插件,playbooks - 通过查找插件实现“with_fileglob”和“with_item”等手册语言结构,并将值返回到变量或参数中。
  这是一个简单的查找插件实现 - 此查找将文本文件的内容作为变量返回:
  

from ansible.errors import AnsibleError, AnsibleParserError  
from ansible.plugins.lookup import LookupBase
  

  
try:
  from __main__ import display
  
except ImportError:
  from ansible.utils.display import Display
  display = Display()
  

  

  
class LookupModule(LookupBase):
  

  def run(self, terms, variables=None, **kwargs):
  

  ret = []
  

  for term in terms:
  display.debug("File lookup term: %s" % term)
  

  # Find the file in the expected search path
  lookupfile = self.find_file_in_search_path(variables, 'files', term)
  display.vvvv(u"File lookup using %s as file" % lookupfile)
  try:
  if lookupfile:
  contents, show_data = self._loader._get_file_contents(lookupfile)
  ret.append(contents.rstrip())
  else:
  raise AnsibleParserError()
  except AnsibleParserError:
  raise AnsibleError("could not locate file in lookup: %s" % term)
  

  return ret
  

---  
- hosts: all
  vars:
  contents: "{{ lookup('file', '/etc/foo.txt') }}"
  

  tasks:
  

  - debug: msg="the value of foo.txt is {{ contents }} as seen today {{ lookup('pipe', 'date +"%Y-%m-%d"') }}"
  执行过程中遇到的错误应该通过用描述错误的消息来提升AnsibleError()来返回。 任何可能包含非ASCII字符的查找插件实现返回的任何字符串都必须转换为Python的unicode类型,因为这些字符串将通过jinja2运行。 为此,您可以使用:
  

  

  from ansible.module_utils._text import to_text  
result_string = to_text ( result_string )
  

  

  有关更多示例查找插件,请查看此处包含的查找插件的源代码: lib / ansible / plugins / lookup 。
  有关查找插件的使用示例,请参阅使用查找 。

Vars Plugins
  过滤器插件用于操纵数据。 它们是Jinja2的功能,也可以在模板模块使用的Jinja2模板中使用。 与所有插件一样,它们可以轻松扩展,而不是为每个插件提供一个文件,您可以拥有多个每个文件。  Ansible随附的大多数过滤插件位于core.py中 。
  有关详细信息,请参阅lib / ansible / plugins / filter 。

测试插件
  测试插件用于验证数据。 它们是Jinja2的功能,也可以在模板模块使用的Jinja2模板中使用。 与所有插件一样,它们可以轻松扩展,而不是为每个插件提供一个文件,您可以拥有多个每个文件。  Ansible随附的大多数测试插件都驻留在core.py中 。 这些特别适用于一些过滤器插件,如map和select ; 它们也可用于条件指令,如: 。
  有关详细信息,请参阅lib / ansible / plugins / test 。

Distributing Plugins
  插件从库安装路径和配置的插件目录加载(检查您的ansible.cfg )。 该位置可能因安装Ansible(pip,rpm,deb等)或OS / Distribution / Packager的方式而异。 如果您有以下子文件夹之一与您的Playbook相邻或在角色中自动加载插件:
  

  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-430842-1-1.html 上篇帖子: ansible模块学习 下篇帖子: Ansible中playbook
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表