正确的调用带有模块参数'content'的复制模块的方法

时间:2019-06-16 14:27:53

标签: 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:
    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_module的结果是

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}

即使我只是传递“ content”参数,此调用仍试图使用“ src”参数。我知道这一点,因为当我添加“ src”时,失败消息会更改。我从文档以及阅读复制模块和模板模块源代码中获得的例外是,我的实现至少会导致:

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

有人知道我丢失了什么吗?为什么未指定“ src”而不是“ content”?

2 个答案:

答案 0 :(得分:0)

content:参数只是writing it to a tempfile的语法糖,所以我想您将需要负责此工作,或者找到一种方法来调用copy action,该方法显然可以运行在copy module之前。

答案 1 :(得分:0)

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

    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"}