我有一个自定义操作插件,我需要将控制器上返回的变量数据写到文件中。我现在正在本地尝试。
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”?
答案 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"}