Search code examples
ansibleansible-inventoryansible-facts

Ansible - prompt for a confirmation to run tasks and share the fact by multiple hosts


I have this simple playbook named delete.yml

- hosts: all
  become: false
  tasks:
    - pause:
        prompt: "Are you sure you want to delete \" EVERYTHING \"? Please confirm with \"yes\". Abort with \"no\" or Ctrl+c and then \"a\""
      register: confirm_delete
    - set_fact:
        confirm_delete_fact: "{{ confirm_delete.user_input | bool }}"

- hosts: all
  become: false
  roles:
    - {role: destroy when: confirm_delete_fact }

my inventory is

[my_group]
192.168.10.10
192.168.10.11
192.168.10.12

so I run the playbook with

ansible-playbook delete.yml -i inventoryfile -l my_group

Everything works but only for one host, the others in my_group are skipped because of the conditional check

What is wrong?


Solution

  • you could try that:

    - hosts: all
      become: false
      tasks:
        - pause:
            prompt: "Are you sure you want to delete \" EVERYTHING \"? Please confirm with \"yes\". Abort with \"no\" or Ctrl+c and then \"a\""
          register: confirm_delete
        - name: Register dummy host with variable
          add_host:
            name: "DUMMY_HOST"
            confirm_delete_fact: "{{ confirm_delete.user_input | bool }}"
    
    - hosts: all
      become: false
      vars:
        confirm_delete_fact: "{{ hostvars['DUMMY_HOST']['confirm_delete_fact'] }}"
      roles:
        - {role: destroy when: confirm_delete_fact }
    

    if you dont want error on DUMMY_HOST (try to connect ssh), just do

    - hosts: all,!DUMMY_HOST
    

    explanations:

    if you put your prompt in task, it will be used one time and belongs to hostvars of the first host, so i create a new dummy host and pass variable to other playbook.

    you could avoid that:

    by putting the prompt over the tasks and testing the variable hostvars:

    - hosts: all
      become: false
      vars_prompt:
      - name: confirm_delete
        prompt: "Are you sure you want to delete \" EVERYTHING \"? Please confirm with \"yes\". Abort with \"no\" or Ctrl+c and then \"a\""
        private: no
        default: no 
      tasks:
        - set_fact: 
            confirm_delete_fact: "{{ confirm_delete | bool }}"
    
    - hosts: all
      become: false
      roles:
        - {role: destroy when: hostvars[inventory_hostname]['confirm_delete_fact'] }
    

    you could use the second solution because, you have the same hosts in both playbook. If different, i suggest you to use the first solution.