pula alguma tarefa com prompt em ansible [closed]

1

Como posso acessar para responder a um prompt em outro servidor? meus anfitriões:

[dbs]
db1
db2
db3

Eu tenho uma função e meu tasks/main.yml é:

- pause:
   prompt: "Do you want to install mysql (yes/no)?"
  register: my_pause

- include_tasks: mysql.yml
  when: my_pause.user_input | bool

quando executo essa função, somente o primeiro servidor pula MySQL.yml e para outro servidor executa MySQL.yml .

Eu quero que o usuário insira não para o prompt de resposta, ‍‍ MySQL.yml não é executado para nenhum servidor. mas quando eu entro no ele será instalado novamente !!

 [root@anisble ansible]# ansible-playbook playbooks/test.yml 

PLAY [dbs] 
**************************************************************
    TASK [Gathering Facts] 
*******************
ok: [db1]
ok: [db3]
ok: [db2]

TASK [ssh : pause] ********************************************************************************
[ssh : pause]
Do you want to install mysql (yes/no)?:
no
  ok: [db1]

TASK [ssh : include_tasks] ********************************************************************************
skipping: [db1]
included: /etc/ansible/roles/ssh/tasks/mysql.yml for db2, db3

TASK [ssh : install mysql] ********************************************************************************
ok: [db3]
ok: [db2]

PLAY RECAP ********************************************************************************
db1                        : ok=2    changed=0    unreachable=0    failed=0   
db2                        : ok=3    changed=0    unreachable=0    failed=0   
db3  

Edited-1

Eu uso o primeiro a sua solução, mas quando eu entro no Ele será instalado novamente !!

task/main.yml :

    ---
    - pause:
       prompt: "Do you want to install mysql (yes/no)?"
      register: install_mysql
      delegate_to: localhost

- include_tasks: mysql.yml
  when: hostvars['localhost']['install_mysql']['user_input'] == 'yes'

A saída é:

[root@anisble ansible]# ansible-playbook playbooks/test.yml 
PLAY [dbs] ********************************************************************************
TASK [Gathering Facts] ********************************************************************************
ok: [db2]
ok: [db1]
ok: [db3]

TASK [ssh : pause] ********************************************************************************
[ssh : pause]
Do you want to install mysql (yes/no)?:
no
  ok: [db1 -> localhost]

TASK [ssh : include_tasks] ********************************************************************************
included: /etc/ansible/roles/ssh/tasks/mysql.yml for db1, db2, db3

TASK [ssh : install mysql] ********************************************************************************
  changed: [db1]
changed: [db3]
changed: [db2]

  PLAY RECAP ********************************************************************************
    db1                        : ok=4    changed=1    unreachable=0    failed=0   
    db2                        : ok=3    changed=1    unreachable=0    failed=0   
    db3                        : ok=3    changed=1    unreachable=0    failed=0   

Edited-2

Este método funciona.

- name: confirm
  pause:
    prompt: "Do you want to install mysql (yes/no)?"
  register: install_mysql

- include_tasks: mysql.yml
  when: hostvars[groups['dbs'][0]]['install_mysql']['user_input'] == "yes"
    
por pyramid13 14.02.2018 / 16:06

1 resposta

2

Executar pausa no host local

Você pode executar a tarefa pause em um host específico, por exemplo, localhost e obter a resposta da matriz hostvars hostvars['localhost'] ( roubado daqui ).

- name: Pause prompt on localhost
  hosts: localhost
  tasks:
    - name: Prompt
      pause:
        prompt: "Do you want to install mysql (yes/no)?"
      register: install_mysql

- name: Get the answer from the hostvars array
  hosts: all  
  tasks:
    - name: Include role when you answered 'yes'
      include_tasks: mysql.yml
      when: hostvars['localhost']['install_mysql']['user_input'] == 'yes'

Você precisa usar uma reprodução dedicada nesse host para poder acessar a resposta na matriz hostvars. Se você executá-lo uma vez em um host (como em sua solicitação original), você precisará adivinhar qual host será processado primeiro e usar hostvars['firstprocessedhost'] (às vezes hostvars['db1'] ).

Quando você usa delegate_to: localhost , a tarefa ainda é executada para db1 e a resposta é armazenada em hostvars['db1'] .

Você não deve depender da ordem dos seus hosts, e o módulo de pausa tem a intenção de pausar um livro de reprodução para não solicitar dados do usuário.

vars_prompt

Se for possível, você deve usar a seção vars_prompt do seu jogo:

- name: A play with a vars_prompt section
  hosts: all  
  vars_prompt:
    - name: install_mysql
      prompt: "Do yo want to install mysql (yes/no)?"

  tasks:
    - name: Include role when you answered 'yes'
      include_tasks: mysql.yml
      when: install_mysql == 'yes'
    
por 14.02.2018 / 17:41

Tags