Plugins 使用module param';调用复制模块的正确方法;内容';

Plugins 使用module param';调用复制模块的正确方法;内容';,plugins,ansible,Plugins,Ansible,我有一个自定义操作插件,我需要将控制器上返回的变量数据写入一个文件。我现在正在本地尝试 copy_module_args = dict() copy_module_args["content"] = 'test' copy_module_args["dest"] = dest copy_module_args["owner"] = owner copy_module_args["group"] = group copy_module_args["mode"] = mode try: r

我有一个自定义操作插件,我需要将控制器上返回的变量数据写入一个文件。我现在正在本地尝试

copy_module_args = dict()
copy_module_args["content"] = 'test'
copy_module_args["dest"] = dest
copy_module_args["owner"] = owner
copy_module_args["group"] = group
copy_module_args["mode"] = mode

try:
    result = merge_hash(result, self._execute_module(
            module_name="copy",
            module_args=copy_module_args,
            task_vars=task_vars))
except (AnsibleError, TypeError) as err:
    err_msg = "Failed to do stuff"
    raise AnsibleActionFail(to_text(err_msg), to_text(err))
._execute_模块的结果为

fatal: [localhost]: FAILED! => {"changed": false, "msg": "Source None not found"}
结果的价值是

{'msg': 'Source None not found', 'failed': True, 'invocation': {'module_args': {'content': 'VALUE_SPECIFIED_IN_NO_LOG_PARAMETER', 'dest': '/home/me/testfile', 'owner': 'me', 'group': 'me', 'mode': None, 'backup': False, 'force': True, 'follow': False, 'src': None, '_original_basename': None, 'validate': None, 'directory_mode': None, 'remote_src': None, 'local_follow': None, 'checksum': None, 'seuser': None, 'serole': None, 'selevel': None, 'setype': None, 'attributes': None, 'regexp': None, 'delimiter': None, 'unsafe_writes': None}}, '_ansible_parsed': True}
此调用尝试使用“src”参数,即使我只传递“content”参数。我知道这一点,因为当我添加“src”时,失败消息会发生变化。从文档和阅读复制模块和模板模块源代码中,我认为我的实施至少会导致:

- name: Copy using inline content
  copy:
    content: 'test'
    dest: /home/me/testfile

有人知道我遗漏了什么,或者为什么“src”比“content”更受欢迎,即使它没有被指定

content:参数只是syntactic sugar for,所以我想您需要负责这一点,或者找到一种调用的方法,它显然在之前运行。

我能够看到“content”是在中处理的,而不是在模块中处理的。我已经根据自己的需要调整了我的发现。我调用动作插件,而不是直接调用模块

    copy_module_args = dict()
    copy_module_args["content"] = 'test'
    copy_module_args["dest"] = dest
    copy_module_args["owner"] = owner
    copy_module_args["group"] = group
    copy_module_args["mode"] = mode
    copy_module_args["follow"] = True
    copy_module_args["force"] = False

    copy_action = self._task.copy()
    copy_action.args.update(copy_module_args)
    # Removing args passed in via the playbook that aren't meant for
    # the copy module
    for remove in ("arg1", "arg2", "arg3", "arg4"):
        copy_action.args.pop(remove, None)

    try:
        copy_action = self._shared_loader_obj.action_loader.get('copy',
                                task=copy_action,
                                connection=self._connection,
                                play_context=self._play_context,
                                loader=self._loader,
                                templar=self._templar,
                                shared_loader_obj=self._shared_loader_obj)
        result = merge_hash(result, copy_action.run(task_vars=task_vars))
这使我能够利用它的幂等性和校验和,而不必编写自己的代码,从而利用我最初打算的复制方式

changed: [localhost] => {"changed": true, "checksum": "00830d74b4975d59049f6e0e7ce551477a3d9425", "dest": "/home/me/testfile", "gid": 1617705057, "group": "me", "md5sum": "6f007f4188a0d35835f4bb84a2548b66", "mode": "0644", "owner": "me", "size": 9, "src": "/home/me/.ansible/tmp/ansible-tmp-1560715301.737494-249856394953357/source", "state": "file", "uid": 1300225668}
再运行一次

ok: [localhost] => {"changed": false, "dest": "/home/me/testfile", "src": "/home/me/testfile/.ansible/tmp/ansible-local-9531902t7jt3/tmp_nq34zm5"}

我看到了你链接到的片段。我假设,也许是错误的,以这种方式调用模块的目的是模块应该为我处理这些细节。我需要调用模块,而不是操作插件,因为在测试之后,我希望复制以写入托管服务器。在本地使用f.write()进行测试是第一步,第二步是针对本地主机进行复制。因此,从外观上看,内容不是在中处理的,而是像您在其各自的操作插件中所说的那样。我所做的假设是,模块的调用将调用动作插件,就像ansible playbook一样。如果您使用,它很可能会调用动作插件,这是专门为完成您正在做的事情而设计的(尽管未知,如果它是“可重入的”,您可以从ansible模块中调用它)。不要忘记,
copy
操作是一个插件,因此python本身无法知道您是否覆盖了
copy
插件——这就是拥有插件系统的全部意义,将一件事与另一件事解耦