python中的自定义ansible模块 - 如何解析相对角色文件路径?

时间:2015-04-29 08:35:09

标签: python ansible

我正在python中编写一个新的自定义ansible模块。

我希望能够解析代码中的路径(以便阅读其内容),就像" file"和"复制"模块在接收" src"中的相对路径时执行。例如,参数(路径相对于root-dir/roles/x/files)。

有可能这样做吗?如果是这样,怎么样?

更新

目前这似乎是不可能的。我添加了功能请求here

2 个答案:

答案 0 :(得分:1)

我已经在" ansible-devel"上发布了这个问题。小组,他们给了我一个指导我的答案。

您可以编写自定义动作插件并将其放在root-playbook-dir / action_plugins下。文件名必须为" your_mod_name.py"

代码将是这样的:

#!/usr/bin/python

from ansible.runner.lookup_plugins.file import LookupModule as FilePlugin
from ansible import utils

class ActionModule(object):

    def __init__(self, runner):
        self.runner = runner

    def run(self, conn, tmp_path, module_name, module_args, inject, complex_args=None, **kwargs):

        options = {}
        options.update(utils.parse_kv(module_args))

        file_plugin = FilePlugin()
        files_content = file_plugin.run(terms=options.get('myarg'), inject=inject)
        options['myarg'] = files_content[0]

        return self.runner._execute_module(conn=conn, tmp="/tmp", module_name="mymod", args=utils.serialize_args(options), inject=inject)

代码使用"文件"查找插件以读取文件,然后执行自定义模块并返回其结果。

最终,您的自定义模块将在" myarg"中接收文件内容(而非路径)。参数。

答案 1 :(得分:0)

DEFAULT_ROLES_PATHAnsible's constants.py文件中定义:

DEFAULT_ROLES_PATH        = shell_expand_path(get_config(p, DEFAULTS, 'roles_path',       'ANSIBLE_ROLES_PATH',       '/etc/ansible/roles'))

通过导入from ansible.constant import DEFAULT_ROLES_PATH,您的模块将遵循Ansible项目中可能发生的任何路径更改。

utils.py可能是编写模块时应该熟悉的下一个文件,因为它包含路径查找功能(请参阅path_dwim)和其他Ansible特定的交互功能。

如果您希望插件像copy module一样工作,您可以在runner's __init__.py中看到文件路径的逻辑:

if items_plugin is not None and items_plugin in utils.plugins.lookup_loader:

    basedir = self.basedir
    if '_original_file' in inject:
        basedir = os.path.dirname(inject['_original_file'])
        filesdir = os.path.join(basedir, '..', 'files')
        if os.path.exists(filesdir):
            basedir = filesdir

其中self.basedir被定义为utils.default(basedir, lambda: os.getcwd()),其中basedir可选地是playbook目录。

通过为您的模块提供正确的argument spec,您应该能够自动利用这些基础细节。

在模块的底部,添加basic module_utils以挂钩预期存在的方法(' fail_json'等)并为您填充其他defaults

from ansible.module_utils.basic import *

我相信,在这些部分到位后,您将触发文件搜索路径,但请告诉我我是否不正确。