Como posso acessar para responder a um prompt em outro servidor? meus anfitriões:
[dbs]
db1
db2
db3
Eu tenho uma função e a minha 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 eu executo esta função, apenas o primeiro servidor pula MySQL.yml
e para outro servidor executa MySQL.yml
.
Quero que, se o usuário digitar não para o prompt de resposta, MySQL.yml
não seja executado para nenhum servidor. mas quando entro não vai ser instalado de novo!!
[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
Editado-1
Eu uso a primeira solução sua, mas quando eu entrar não 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
Editado-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"
Executar pausa no localhost
Você pode executar a
pause
tarefa em um host específico, por exemplo,localhost
e obter a resposta da matriz hostvarshostvars['localhost']
( roubada daqui ).Você precisa usar um jogo dedicado nesse host para poder acessar a resposta na matriz hostvars. Se você executá-lo uma vez em um grupo de hosts (como em sua solicitação original), precisará adivinhar qual host será processado primeiro e usar
hostvars['firstprocessedhost']
(às vezeshostvars['db1']
).Quando você usa
delegate_to: localhost
a tarefa ainda é executadadb1
e a resposta é armazenada emhostvars['db1']
.Você não deve depender da ordem de seus hosts e o módulo de pausa destina-se a pausar um playbook para não solicitar dados do usuário.
vars_prompt
Se for possível, você deve usar a
vars_prompt
seção do seu jogo: