首页 > 其他分享 >ansible模块编写

ansible模块编写

时间:2024-09-09 23:15:44浏览次数:11  
标签:modules module ansible usr 模块 plugins 编写

目录

1. 程序为什么能识别模块

Ansible 能识别模块,主要因为以下几个原因:

root@jJkJOt1054298:~# ansible --version 
ansible [core 2.17.3]
  config file = /etc/ansible/ansible.cfg
  configured module search path = ['/root/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
  ansible python module location = /usr/local/lib/python3.10/dist-packages/ansible
  ansible collection location = /root/.ansible/collections:/usr/share/ansible/collections
  executable location = /usr/local/bin/ansible
  python version = 3.10.14 (main, Apr  6 2024, 18:45:05) [GCC 9.4.0] (/usr/bin/python3.10)
  jinja version = 3.1.4
  libyaml = True

configured module search path 是ansible的模块搜索路径,分别是上述列表中的元素,第一个元素/root/.ansible/plugins/modules是用户的本地模块目录,/usr/share/ansible/plugins/modules是系统级别的模块目录,本地模块目录中对应的优先级更高.这两个路径表明ansible运行时,查找模块的位置

也就是如果自定义模块,可以将模块入到/root/.ansible/plugins/modules/usr/share/ansible/plugins/modules,以供ansible到这两个目录中加载模块

ansible python module location 表示ansible python模块位置,指向/usr/local/lib/python3.10/dist-packages/ansible,表明ansible使用的python版本,及ansible的安装位置

ansible collection location表明ansible collection(集合)的目录路径,集合是一种打包和分发ansible内容包括(模块,插件,角色)的方式./root/.ansible/collections 拥有较高优先级,ansible会首先查询家目录下的集合./usr/share/ansible/collections是系统级别的集合目录

a. 模块是独立的脚本

Ansible 模块是 Python、Shell 或其他可执行脚本。Ansible 调用模块时,会在控制节点上将模块传输到目标主机,并在目标主机上执行。模块可以是 Python 文件(默认)或任何其他脚本语言,只要目标主机能够执行该语言。

b. 模块的路径与目录结构

Ansible 会在安装目录(如 /usr/share/ansible/plugins/modules/)中查找模块。此外,Ansible 还支持自定义模块,用户可以将自定义模块放在 library 目录下,Ansible 会自动识别这些模块并加载它们。

2. 模块的工作特性

a. ansible模块执行任务,会ssh到远程主机

b. ansible.module_utils.basic

它简化了模块的开发流程,提供了参数解析、结果处理、错误处理和跨平台兼容性等核心功能,帮助开发者编写模块时更专注于具体业务逻辑

c. 核心模块(Core Modules)与插件(Plugins)的区别

​ 核心模块用于执行常见的自动化任务,如文件操作、软件包管理、服务管理、系统配置等

  • 系统级模块路径

    • /usr/share/ansible/plugins/modules/
    • /usr/lib/pythonX.X/site-packages/ansible/modules/
    • /usr/local/lib/pythonX.X/dist-packages/ansible/modules/(取决于 Python 环境)
  • 用户级模块路径

    • ~/.ansible/plugins/modules/(用户本地自定义模块目录)
  • 自定义模块路径
    如果你定义了自己的模块,可以将其放在自定义路径中,并在 ansible.cfg 中通过 library 选项指定:

    [defaults]
    library = /path/to/custom/modules
    

​ 插件是扩展 Ansible 功能的组件,它们可以执行各种辅助任务,如连接到远程主机、处理数据、过滤结果等.而是影响 Ansible 的执行方式。插件按类型分类,如 callbacklookupconnection 等,并存放在对应的插件路径下

  • 系统级插件路径

    • /usr/share/ansible/plugins/
    • /usr/lib/pythonX.X/site-packages/ansible/plugins/
    • /usr/local/lib/pythonX.X/dist-packages/ansible/plugins/(取决于 Python 环境)
  • 用户级插件路径

    • ~/.ansible/plugins/
  • 自定义插件路径
    用户可以自定义插件路径,并通过 ansible.cfg 中的 plugin 相关选项来指定。例如:

    [defaults]
    callback_plugins = /path/to/callback_plugins
    lookup_plugins = /path/to/lookup_plugins
    filter_plugins = /path/to/filter_plugins
    

3.构建简单模块

#创建目录
mkdir -p /root/.ansible/plugins/modules
cd /root/.ansible/plugins/modules
vim my_module.py

a.模块功能

#!/usr/bin/python
# -*- coding: utf-8 -*-

DOCUMENTATION = '''
---
module: my_module
short_description: This is a test module
description:
    - This module prints a hello message.
options:
    name:
        description:
            - The name to greet.
        required: true
        type: str
author:
    - Your Name (@yourgithubhandle)
'''

EXAMPLES = '''
# Greet Ansible
- name: Test custom module
  my_module:
    name: "Ansible"
'''

RETURN = '''
message:
    description: The greeting message.
    type: str
    returned: always
'''

from ansible.module_utils.basic import AnsibleModule

def main():
    module = AnsibleModule(
        argument_spec=dict(
            name=dict(type='str', required=True),
        )
    )
    name = module.params['name']
    result = dict(
        changed=False,
        message=f"Hello, {name}!"
    )
    module.exit_json(**result)

if __name__ == '__main__':
    main()

b.模块文档

ansible-doc -M /root/.ansible/plugins/modules/ my_module
> MODULE my_module (/root/.ansible/plugins/modules/my_module.py)

  This module prints a hello message.

OPTIONS (red indicates it is required):

   name    The name to greet.
        type: str

AUTHOR: Your Name (@yourgithubhandle)

EXAMPLES:
# Greet Ansible
- name: Test custom module
  my_module:
    name: "Ansible"

RETURN VALUES:

   message  The greeting message.
        returned: always
        type: str


DOCUMENTATION
这是模块的文档块,使用 YAML 格式来定义模块的名称、简短描述、选项参数及其要求等信息。Ansible 会根据这个块生成模块的帮助文档。

EXAMPLES
这是示例块,展示如何在 playbook 中调用这个模块。它通常包含最常见的用法。

RETURN
这个部分定义模块的返回值,以及每个字段的类型和描述。这样,使用者就可以清楚知道模块会返回哪些数据。

c.验证模块功能

ansible all -m my_module -a "name=Ansible"
localhost | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python3.10"
    },
    "changed": false,
    "message": "Hello, Ansible!"
}

自定义模块流程

标签:modules,module,ansible,usr,模块,plugins,编写
From: https://www.cnblogs.com/anyux/p/18405575

相关文章

  • Python 编程:如何巧妙运用 `abc` 模块解锁面向对象设计的新维度?
    引言在软件开发的世界里,面向对象编程(OOP)作为一门艺术,其精髓在于通过封装、继承与多态来构建可维护性高、易于扩展的系统。而在Python这门语言中,abc模块则为我们提供了一种优雅的方式来定义抽象基类(AbstractBaseClasses,ABCs),从而帮助我们更好地实践OOP的核心原则。本文将带......
  • shutil模块详解
    shutil模块提供了一系列高级文件操作功能,包括复制、移动、删除和搜索文件或目录。shutil模块对压缩包的处理是调用ZipFile和TarFile这两个模块来进行的。下面详细介绍并给出示例代码:1. shutil.copy(src,dst)复制文件,但不保留权限和时间戳等元数据。importshutils......
  • 关于schneider施耐德140模块
    SCHNEIDER140模块是施耐德电气(SchneiderElectric)公司生产的一系列工业自动化和控制产品,这些模块通常用于Quantum系列PLC(可编程逻辑控制器)系统中,以实现各种自动化和控制任务。以下是对SCHNEIDER140模块的一些详细介绍:一、模块类型与功能SCHNEIDER140模块包括但不限于以下......
  • 功率单元和功率模块有什么区别?
        功率单元和功率模块在电力电子领域中各自扮演着重要角色,它们之间存在明显的区别,主要体现在以下几个方面:一、定义与构成功率单元:指的是集成在一块PCB(印刷电路板)上的功率转换电路模块,通常由MOSFET、IGBT(绝缘栅双极型晶体管)或SiCMOSFET等功率半导体器件构成。它能够......
  • Unity框架(场景切换模块)
    1、为什么要制作场景切换模块在游戏开发中很多时候可能需要进行场景切换只要存在场景切换,我们往往需要在切换场景时和切换场景结束后进行一些操作2、实现场景切换模块的主要思路1.制作SceneMgr单例模式管理器2.实现同步加载场景的公共方法3.实现异步加载场景的公共......
  • 就这么学Linux 编写Shell脚本
    编写Shell脚本Shell脚本命令的工作方式有下面两种➢交互式:用户每输入一条命令就立即执行➢批处理:由用户事先编写好一个完整的Shell脚本,Shell会一次性执行脚本中诸多的命令.编写简单脚本当前系统已经默认使用Bash作为命令行终端解释器了echo$SHELL如果想查看当前所在工作......
  • 推荐一个Python流式JSON处理模块:streaming-json-py
    每天,我们的设备、应用程序和服务都在生成大量的数据流,这些数据往往大多是以JSON格式存在的。如何高效地解析和处理这些JSON数据流是一大挑战。今天,我要为大家介绍一个能极大简化这一过程的利器:streaming-json-pystreaming-json-py介绍streaming-json-py是一个专为实时......
  • vue打印模版模块,使用vue-plugin-hiprint插件搭建过程
    文章目录概要安装插件引入全局样式引入字体图标库完整demo解析-保存模版解析-左侧的自定义组件解析-视图容器解析-打印文件地址概要项目中,我们可能需要实现打印的需求功能,而打印时,用户可以先去编辑打印模版,这样再其他模版,只需要提供数据,就可以使用模......
  • 模块化IoT平台助力自动售货机大规模部署
    上半年全球知名的自动售货机供应商找到SECO赛柯寻求大批量的智能人机界面(HMI)解决方案。客户希望这些售货机不仅能够提供饮料,还能具备更多智能化功能。面对客户复杂的需求,SECO赛柯交出了一份满分答卷,不仅满足了客户独特的需求,还为其带来了显著的运营效率提升。客户需求● 大......
  • Ascend C算子开发(中级)—— 编写Sinh算子
    AscendC算子开发(中级)——编写Sinh算子文章目录AscendC算子开发(中级)——编写Sinh算子准备工作香橙派与PC连接Add算子调用体验Sinh算子开发(AscendC算子开发中级认证考试内容)准备工作一块香橙派AIpro开发板,一根Type-c口的电源线,一根网线,一个网线转接器,一台......