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

Viewed 207

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?

1 Answers

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.

Related