Правильный способ вызова модуля копирования с параметром модуля 'content' - PullRequest
0 голосов
/ 16 июня 2019

У меня есть плагин настраиваемого действия, и мне нужно записать возвращенные переменные данные на контроллере в файл.Я пытаюсь это локально прямо сейчас.

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}

Этот вызов пытается использовать параметр "src" дажехотя я только передаю параметр «содержание».Я знаю это, потому что, когда я добавляю «src», сообщение об ошибке меняется.Я исключил из документации и из чтения модуля копирования и источника модуля шаблона, что моя реализация, как минимум, приведет к:

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

Кто-нибудь знает, что мне не хватает, или почему "src"предпочтение над содержанием, даже если оно не указано?

Ответы [ 2 ]

0 голосов
/ 16 июня 2019

Мне удалось увидеть, что «контент» обрабатывается в плагине действия , а не в модуле. Я адаптировал то, что нашел, чтобы соответствовать моим потребностям. Я называю плагин действия вместо модуля напрямую.

    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"}
0 голосов
/ 16 июня 2019

Аргумент content: является просто синтетическим сахаром для записи его в временный файл , поэтому я думаю, вам нужно будет взять на себя ответственность за это или найти способ вызвать copy действие , которое, очевидно, выполняется перед модулем copy .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...