我正在python中编写一个新的自定义ansible模块。
我希望能够解析代码中的路径(以便阅读其内容),就像" file"和"复制"模块在接收" src"中的相对路径时执行。例如,参数(路径相对于root-dir/roles/x/files
)。
有可能这样做吗?如果是这样,怎么样?
更新
目前这似乎是不可能的。我添加了功能请求here。
答案 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_PATH
在Ansible'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 *
我相信,在这些部分到位后,您将触发文件搜索路径,但请告诉我我是否不正确。