【发布时间】:2022-05-10 10:56:02
【问题描述】:
我正在运行一个ansible-playbook,其中列出了许多任务。所有这些都用于逐个运行,但我想在特定任务后pause playbook 询问用户是否要继续运行其余任务或退出。我已经看到了 ansible 的 pause module,但看不到任何要求用户选择是或否的示例,然后相应地继续或退出 ansible-playbook。
【问题讨论】:
我正在运行一个ansible-playbook,其中列出了许多任务。所有这些都用于逐个运行,但我想在特定任务后pause playbook 询问用户是否要继续运行其余任务或退出。我已经看到了 ansible 的 pause module,但看不到任何要求用户选择是或否的示例,然后相应地继续或退出 ansible-playbook。
【问题讨论】:
pause 模块实际上就是这样做的。但它没有让您选择回答yes 或no。相反,它希望用户按 Ctrl+C 然后按 a 进行中止。要继续,用户只需按 Enter。
由于这对用户来说不是很明显,您可以在prompt 参数中对其进行描述。
- name: Exterminate mankind
pause:
prompt: Please confirm you want to exterminate mankind! Press return to continue. Press Ctrl+c and then "a" to abort
【讨论】:
with_items: "{{ ansible_play_batch }}",它会分别提示每个主机。因此,您可以提示用户确认每个主机。但是点击Ctrl+C 会杀死整个游戏,而不是让一个主机退出游戏。您可以指示用户改为按C,注册任务输出,然后在单独的任务中检查用户是否输入了C,并使用fail 模块将主机退出游戏。
hostvars 数组访问它。
free 策略会有所帮助。 docs.ansible.com/ansible/2.5/user_guide/… 尚未对此进行测试,但它应该使pause 分别在每个主机的上下文中运行,并且不需要循环。 Ctrl+C 虽然可能仍然会杀死整个游戏,但是很容易访问已注册的 var。
我需要重新启动所有主机,但我不能冒险让用户通过按“Enter”来这样做。
为了在剧本中间进行真正的是/否确认,我搜索了很长时间才找到this post。 Ansible 文档中没有很好地描述如何做到这一点,但这里是代码:
- name: Confirm important file deletion
pause:
prompt: "Are you sure you want to delete backup.db? (yes/no)"
register: confirm_delete
- name: Delete backup file
file:
path: /home/admin/backup.db
state: absent
when: confirm_delete.user_input | bool
【讨论】:
在不修改剧本本身的情况下为每个任务实现提示的好方法是使用ansible-playbook 命令的--step 选项。
这将允许您在运行之前确认每个步骤。您可以在此处选择(N)o/(y)es/(c)ontinue。 N 跳过这一步,y 运行这一步,c 继续剧本的其余部分,而不需要进一步提示(当你在调试并且经过麻烦的地方时很有用。)
请注意,--check 选项也可以正常工作。
官方 Ansible 文档在这里:https://docs.ansible.com/ansible/latest/user_guide/playbooks_startnstep.html#step
【讨论】:
我让它像这样工作,在服务器故障转移剧本上工作,它从运行剧本的用户那里接收几个响应,然后只有在用户输入正确的提示时才继续执行最后一步“回显结果”
---
- hosts: localhost
connection: local
become: yes
become_user: root
vars_files:
- vars/ch.yaml
tasks:
- name: Enter server Role
pause:
prompt: "\nEnter new role for this server: primary or standby\n\n[primary|standby]"
register: role
- name: Enter server Mode
pause:
prompt: "\nEnter the Mode of server: fullstack, trading, data\n\n[full|trading|data]"
register: mode
- name: confirm proceed
pause:
prompt: "\nProceed with failover of {{ansible_hostname|upper}} to become {{ role.user_input|upper }} with {{ mode.user_input|upper }} mode?\n\n[y/n]"
register: proceed
- name: echo results
shell: echo "role {{ role.user_input }}, mode {{ mode.user_input}}" > file
when: (proceed.user_input == "y" or proceed.user_input == "yes") and
(role.user_input in ["primary", "standby"]) and
(mode.user_input in ["full", "data", "trading"])
【讨论】: