【问题标题】:pause ansible playbook for user confirmation, whether to run rest taskspause ansible playbook 供用户确认,是否运行休息任务
【发布时间】:2022-05-10 10:56:02
【问题描述】:

我正在运行一个ansible-playbook,其中列出了许多任务。所有这些都用于逐个运行,但我想在特定任务后pause playbook 询问用户是否要继续运行其余任务或退出。我已经看到了 ansible 的 pause module,但看不到任何要求用户选择是或否的示例,然后相应地继续或退出 ansible-playbook。

【问题讨论】:

    标签: ansible ansible-playbook


    【解决方案1】:

    pause 模块实际上就是这样做的。但它没有让您选择回答yesno。相反,它希望用户按 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
    

    【讨论】:

    • 您可以将其扩展为也注册一个变量,然后可以根据“user_input”键的值执行后续任务。更多信息。可以在这里找到:docs.ansible.com/ansible/devel/modules/pause_module.html
    • 您知道一种方法可以为每个主机而不是整个组执行此操作吗?
    • 这很复杂 :) 你可以添加一个with_items: "{{ ansible_play_batch }}",它会分别提示每个主机。因此,您可以提示用户确认每个主机。但是点击Ctrl+C 会杀死整个游戏,而不是让一个主机退出游戏。您可以指示用户改为按C,注册任务输出,然后在单独的任务中检查用户是否输入了C,并使用fail 模块将主机退出游戏。
    • 但更棘手的是,因为 pause 模块是在 first 主机的上下文中运行的。因此,注册的 var 不会在所有主机上都可用,您需要通过全局 hostvars 数组访问它。
    • 也许使用free 策略会有所帮助。 docs.ansible.com/ansible/2.5/user_guide/… 尚未对此进行测试,但它应该使pause 分别在每个主机的上下文中运行,并且不需要循环。 Ctrl+C 虽然可能仍然会杀死整个游戏,但是很容易访问已注册的 var。
    【解决方案2】:

    我需要重新启动所有主机,但我不能冒险让用户通过按“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
    

    【讨论】:

    • 我认为这是一个更好的解决方案
    • 我发现这个解决方案的唯一问题是它将“yes”以外的任何内容(包括任何垃圾输入,例如“jaksfd”)解释为“false”。对于我的用例,我宁愿垃圾输入引发异常/错误,因为用户的意图不清楚。也许可以调整 when 子句中的过滤器以包含此行为?我会做实验。
    • 我最终使用“断言”任务来验证用户输入是否完全是“是”或“否”之一。
    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

      我让它像这样工作,在服务器故障转移剧本上工作,它从运行剧本的用户那里接收几个响应,然后只有在用户输入正确的提示时才继续执行最后一步“回显结果”

      ---
      - 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"])
      

      【讨论】:

        猜你喜欢
        • 2023-02-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-07-19
        • 2021-06-21
        • 1970-01-01
        • 2017-05-08
        相关资源
        最近更新 更多