如何设置 Ansible 额外变量来回答剧本中的暂停提示
How to set a Ansible extra variable to answer a pause prompt in a playbook
我们使用 Ansible 剧本 运行 在目标机器上执行一些命令,例如 version_get
、device_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 并将提示条件设置为这个。有些代码行比长篇大论更有表现力:
剧本
---
- 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 }}"
- 调用示例:
$ 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}"
我们使用 Ansible 剧本 运行 在目标机器上执行一些命令,例如 version_get
、device_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 并将提示条件设置为这个。有些代码行比长篇大论更有表现力:
剧本
--- - 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 }}"
- 调用示例:
$ 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}"