Ansible Plugins

910 阅读6分钟

Ansible Plugins

Ansible插件简介

Ansible插件是单独可用的函数,用于与Ansible模块一起工作。这些代码的开发是为了在远程目标主机上工作时给Ansible模块提供额外的支持。尽管Ansible包中有很多插件,但我们也可以编写自己的自定义插件。在Ansible中,插件是以一种架构准备的,为功能集增加了更多的灵活性和可扩展性。最重要的是,插件与模块不同,只在Ansible进程中的Ansible控制器节点上本地运行。此外,插件为Ansible的核心功能提供了额外的选项和扩展,如输出日志、库存连接、数据转换。

Ansible插件的工作原理

Ansible插件在Ansible控制器节点上进行本地工作,这意味着一些数据被交给了插件,而插件会处理这些数据。模块使用这些处理过的数据,在远程目标机上执行一些任务。这看起来很容易,但在选择或使用插件时,人们很容易感到困惑,因为其语法不是JSON的YAML。插件遵循一种独特的语法,不同的插件有不同的语法。

当你开发了一个插件,它必须驻留在Ansible默认的插件目录下,这个目录的名称是根据插件的类型而定的。这些目录是/usr/share/ansible/plugins/和~/.ansible/plugins/。在这些目录下,你可以创建一个以插件类型命名的目录,如lookup、callback等,然后把插件文件放在它下面。另外,ANSIBLE_plugin_type_PLUGINS环境变量(如ANSIBLE_VARS_PLUGINSANSIBLE\_VARS\_PLUGINS和ANSIBLE_INVENTORY_PLUGINS)可以用来设置本地插件的位置。一旦你的插件文件位于这些位置下,那么你就可以对任何playbook、任务、角色或本地模块使用它们。如从这些目录中,Ansible可以加载插件。

为了确认你的插件是否工作或加载。你可以使用ansible-doc来检查插件,运行下面的命令。

ansible-doc -t <plugin_type><plugin_name>

在某些情况下,你可能只想把一个插件用于某些玩法或角色;那么,你可以把插件文件复制到包含玩法的目录下或该角色内的一个名为<plugin_type>的目录下。另外,获得一个插件的最简单的方法是从其他地方或来源复制它,并在你的环境中使用它;同样,你可以分享你的插件。这与模块的工作方式相同。插件被嵌入到角色中进行共享。

Ansible包里有一系列的插件,包括Action、Callback、Cache、成为、连接、库存、查询、Shell、Vars、过滤器、测试。同时,你可以通过编写不兼容的Python版本来添加你的自定义插件,代码应该有错误报告,返回字符串为Unicode,并符合Ansible文档和配置标准。 在下一节中,我们将通过例子来了解一些默认的插件类型。

Ansible插件列表

下面是Ansible包提供的插件类型列表,但你必须注意,这个列表并不详尽,可以在未来的版本中扩展或在当前版本中更新。此外,这些插件类型还进一步有可以在我们的游戏手册中使用的插件。关于最新的插件类型列表,你可以参考下面的Ansible官方社区页面。

docs.ansible.com/ansible/lat…

要获得一个插件类型的可用插件列表,可以使用下面的命令。

ansible-doc -t <plugin_type> -l

另外,为了实用,这里我们有一个名为ansible-controller的Ansible控制服务器和两个名为host-one和host-two的远程主机。我们将创建playbooks,在ansible-controller节点上运行Ansible命令,并在远程主机上看到结果。这些例子中的使用方式完全是为了向你展示如何使用这些,但你现实生活中的用法/要求可能与这些不同。

1.1.行动

这些插件在前端工作,在调用任何模块之前在本地控制器节点执行。这些插件与一些模块相关联,在使用这些模块时默认执行。因此,你不能列出动作插件。

2.成为

这些插件是默认启用的,这些插件用于确保Ansible在运行此类需要更高权限的命令时可以在远程机器上使用某些权限。插件列表包括sudo、su、doas、runas。这些插件与playbook中的become_methodkeyword一起使用。例如,我们有一个内容如下的playbook,这里我们以root用户运行这个playbook,但正如我们提到的成为playbook中的参数。我们正试图以ec2-user的身份运行该命令。在输出中,我们将看到命令以ec2-用户身份运行。

请注意,这个用户必须存在于目标机器上,否则游戏手册会失败。

--- - hosts: all become: yes become_user: ec2-user become_method: sudo tasks: - name: here we are chekcing the user id by which command is running. shell: id register: id_var - debug: var: id_var['stdout_lines']

像下面这样运行这个游戏手册。

ansible-playbook ansible_sudo.yaml

我们得到的输出如下。

Ansible Plugins output 1

3.查询

这些插件用于从外部来源获取数据。这使用了Jinja2。其中一个重要的插件是文件,它用来读取文件的内容。例如,我们将从Ansible控制机上的一个本地文件中获取内容,并使用一个插件文件显示其输出,这是一个查找插件类型。为此,我们创建一个playbook,如下所示。

--- - hosts: localhost tasks: - name: here we will display contents of /tmp/samplefile debug: msg: These are the contents of /tmp/samplefile - {{lookup('file', '/tmp/samplefile')}}

代码。

ansible-playbook ansible_lookup_file.yaml

我们得到的输出如下。

Ansible Plugins output 2

4.Vars

这些插件为Ansible plays提供了库存、playbook和命令行上提供的参数所没有的额外数据。这些插件会自动启用,并与 host_vars 和 group_vars 等关键字一起使用。

5.缓存

这些插件用于存储Ansible事实的缓存,这样我们就不必一次又一次地收集这些事实;这对节约成本很有帮助,因为I/O被测量并产生成本。

6.过滤器

这些允许你在控制器节点内过滤数据,并将其提供给playbooks和模板。这使用了Jinja2。在这种类型中,插件的种类也很繁多;有一些数学相关的插件,如abs、int、pow、root。为了检查其中一些,我们可以制作一个内容如下的playbook。-

--- - hosts: localhost vars: var_one: -2.5 tasks: - set_fact: var_abs: "{{ var_one | abs }}" var_pow: "{{ var_one | pow(5) }}" - debug: msg: Absolute value -2.5 is "{{ var_abs }}" - debug: msg: Fifth power of -2.5 is "{{ var_pow }}"

代码。

ansible-playbook filter_math.yaml

输出结果将如下。

output 3

总结

正如我们在本文中所看到的,Ansible插件可以在Ansible playbook中发挥重要作用,特别是当我们有数据转换、过滤等需求时。如果你有多个环境,并且你的需求是在控制器节点上本地处理数据,你必须有很好的使用插件的知识。所以要先学习,然后再使用。

推荐文章

这是一个关于Ansible插件的指南。这里我们讨论了Ansible软件包提供的工作和插件类型列表。你也可以看看下面的文章来了解更多------。

  1. Ansible查询
  2. Ansible事实
  3. Ansible同步化
  4. 掌握了这一点,你就可以在你的工作中发挥你的作用了。