Ansible playbook 中的交互式输入

问题描述

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

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

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

解决方法

这是来自 https://gist.github.com/confiks/6d7b0ee3e137df01b758action plugin。全部归功于其原作者。复制到这里一样,有时外部链接会坏。请注意,这是基本版本,可以根据需求进行广泛调整。

重要提示: 将此脚本放在您的剧本目录的 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