如何设置 Ansible 额外变量来回答剧本中的暂停提示

How to set a Ansible extra variable to answer a pause prompt in a playbook

我们使用 Ansible 剧本 运行 在目标机器上执行一些命令,例如 version_getdevice_status。我们有意限制 reboot 选项被执行。但有时,我们希望通过在 --extra-vars 选项中设置一些变量来自动回答 yes 提示。

我们的剧本的简单表示在本地主机上最小化为 运行。

---
 - hosts: localhost
   gather_facts: no
   tasks:
   - name: Confirm Execution
     pause:
       prompt: "You are about to execute a '{{cmd}}' command on the device. Enter 'yes' to proceed"
     register: pause_result
     run_once: True
     when: not (cmd|regex_search('(get|status)'))
   - meta: end_play
     when: pause_result.user_input|default('yes') != 'yes'

我知道我可以添加 reboot 作为现有 get|status 列表的一部分,但我不想这样做,因为我希望用户在 运行宁它。因此,使用上面的当前代码,如果我 运行 reboot 我会得到类似

的提示
$ ansible-playbook loc.yml  -e 'cmd=reboot'
 [WARNING]: provided hosts list is empty, only localhost is available. Note that the implicit localhost does not match 'all'


PLAY [localhost] ***********************************************************************************************************************************************************

TASK [Confirm Execution] ***************************************************************************************************************************************************
[Confirm Execution]
You are about to execute a 'reboot' command on this device. Enter 'yes' to proceed:

我只知道如何设置一个变量来自动回答这个提示。尝试将 echo yes | 传递给剧本并看到一个错误

$ echo yes | ansible-playbook loc.yml  -e 'cmd=reboot'

[WARNING]: Not waiting for response to prompt as stdin is not interactive

我也尝试通过 --extra-vars 如下,但其中 none 似乎有效

-e 'cmd=reboot {"pause_result": "yes"}'
-e 'cmd=reboot pause_result=yes'

我会简单地使用另一个 var 并将提示条件设置为这个。有些代码行比长篇大论更有表现力:

  1. 剧本

    ---
    - hosts: localhost
      gather_facts: no
    
      tasks:
        - name: Confirm Execution
          pause:
            prompt: "You are about to execute a '{{cmd}}' command on the device. Enter 'yes' to proceed"
          register: pause_result
          run_once: True
          when:
            - not (cmd | regex_search('(get|status)'))
            - not (skip_confirm | default(false) | bool)
    
        - meta: end_play
          when: pause_result.user_input | default('yes') != 'yes'
    
        - name: dummy task to see if end of play was effective
          debug:
            msg: "In real world, I would play {{ cmd }}"
    
  2. 调用示例:
    $ ansible-playbook test.yml -e cmd=reboot
    $ ansible-playbook test.yml -e cmd=reboot -e skip_confirm=true
    

如果您不想引入新的 var,可以使用现有的 var,但这仍然需要修改当前的 playbook。

提示符的 when 子句应变为:

when:
    - not (cmd | regex_search('(get|status)'))
    - pause_result is not defined

然后调用:

$ ansible-playbook test.yml -e cmd=reboot -e "pause_result={user_input: yes}"