暂停ansible playbook以进行用户确认,是否运行休息任务

Aje*_*han 17 ansible ansible-playbook

我正在运行ansible-playbook其中列出了许多任务.所有这些都用来逐个运行,但我想pause在特定任务之后向剧本询问用户是否要继续运行其余任务或退出.我已经看到了pause moduleansible但是看不到任何询问用户是或否的示例,而这些示例依次继续或退出ansible-playbook.

udo*_*dan 31

该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'
Run Code Online (Sandbox Code Playgroud)

  • 这很复杂:)你只需添加一个 `with_items: "{{ ansible_play_batch }}"` ,它就会分别提示每个主机。因此您可以提示用户确认每个主机。但是按“Ctrl+C”会杀死整个游戏,而不是从游戏中删除单个主机。您可以指示用户改为按“C”,注册任务输出,然后在单独的任务中检查用户是否输入“C”并使用“fail”模块使主机退出游戏。 (2认同)
  • 但这更棘手,因为暂停模块是在 _first_ 主机的上下文中运行的。因此,注册的变量并非在所有主机上都可用,您需要通过全局“hostvars”数组来访问它。 (2认同)

小智 6

我需要重新启动所有主机,但我不能冒险让用户通过按“Enter”来这样做。

为了在剧本中间进行真正的是/否确认,我在找到这篇文章之前搜索了很长时间。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
Run Code Online (Sandbox Code Playgroud)

  • 我认为这是一个更好的解决方案 (2认同)
  • 我认为这仅在您定义单个主机时才有效。否则,它将将该变量注册到运行该命令的第一个主机的主机变量,然后 when 条件将仅跳过针对该主机运行的任务。由于找不到“confirm_delete”变量,其余主机的任务将彻底失败。您可以通过使用 `delegate_to: localhost` 并查找 localhost 的主机变量来解决这个问题,但是,嗯。 (2认同)

小智 5

在不修改剧本本身的情况下为每个任务实现提示的一个好方法是使用命令--step选项ansible-playbook。这将允许您在运行前确认每个步骤。您可以在此处选择(N)o/(y)es/(c)ontinue。N跳过这一步,y运行该步骤并c继续剧本的其余部分,而无需进一步提示(当您进行调试并通过麻烦的地方时很有用。) 请注意,该--check选项也可以正常工作。

官方 Ansible 文档在这里:https ://docs.ansible.com/ansible/latest/user_guide/playbooks_startnstep.html#step