【问题标题】:Interactive input in Ansible playbookAnsible playbook 中的交互式输入
【发布时间】:2021-06-11 07:17:00
【问题描述】:

我正在尝试从 Ansible 自动化卫星和胶囊升级。除了以下两个命令外,我能够将命令转换为 ansible plybook,没有任何问题,需要您的帮助才能将这些命令合并到 playbook 中:

satellite-maintain upgrade check --target-version 6.8
satellite-maintain upgrade run --target-version 6.8

但问题是这个命令会期望用户输入YES / NO / CANCEL 多次。使用“shell 模块”不会帮助我们提供用户输入。我们是否有任何其他选项可以在屏幕中查看命令执行输出并根据我们的用户要求提供输入。

【问题讨论】:

标签: module ansible redhat satellite


【解决方案1】:

这是来自https://gist.github.com/confiks/6d7b0ee3e137df01b758action plugin。所有学分归其原作者所有。复制到这里就像有时外部链接坏了一样。请注意,这是基本版本,可以根据需要进行大量调整。

重要提示: 将此脚本放在 playbook 目录的 action_plugins 目录中。

用法

 - name: "Ask the user if we should continue."
   action: ask_key prompt="Continue? Yes / No / Random (y/n/r)?" accepted_keys="['y', 'n', 'r']"
   register: answer

名为 ask_key.py 的脚本

from __future__ import (absolute_import, division, print_function)
__metaclass__ = type

from ansible import constants as C
from ansible.errors import AnsibleError
from ansible.module_utils.parsing.convert_bool import boolean
from ansible.plugins.action import ActionBase

try:
    from __main__ import display
except ImportError:
    from ansible.utils.display import Display
    display = Display()

class ActionModule(ActionBase):
    TRANSFERS_FILES = False

    def run(self, tmp=None, task_vars=None):
        result = super(ActionModule, self).run(tmp, task_vars)

        result.update(
            dict(
                changed=False,
                failed=False,
                msg='',
                skipped=False
            )
        )

        self._supports_check_mode = True
        self._supports_async = False

        setup_module_args=dict(
            gather_subset='all',
            gather_timeout=10
        )

        setup_result = self._execute_module(
            delete_remote_tmp=True,
            module_name='setup',
            module_args=setup_module_args,
            persist_files=False,
            task_vars=task_vars,
            tmp=tmp,
            wrap_async=self._task.async
        )

        if setup_result['ansible_facts']['ansible_system'] != 'Linux':
            result['failed'] = True

        return result

【讨论】:

  • 我需要在我的 shell 模块之后提及动作插件吗?或者在哪里合并命令:satellite-maintain upgrade check --target-version 6.8 satellite-maintain upgrade run --target-version 6.8
  • 我在上面的答案中提供了使用任务。该任务将提示输入 y 或 n。用户响应将存储在名为 answer 的寄存器中。您可以对其进行评估以做出决定
  • 其实你可以在收到n/N时修改插件(python代码)为sys.exit(1).....
猜你喜欢
  • 2022-06-10
  • 1970-01-01
  • 2020-05-16
  • 1970-01-01
  • 2016-09-07
  • 2022-01-22
  • 1970-01-01
  • 2023-03-23
  • 1970-01-01
相关资源
最近更新 更多