在本地主机上运行暂停

在本地主机上运行暂停

如何访问并回答另一台服务器上的提示?我的主人:

[dbs]
db1
db2
db3

我有一个角色,我的角色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

当我执行这个角色时,只有第一个服务器跳过MySQL.yml并到另一个服务器执行MySQL.yml

我希望如果用户输入 no 作为答案提示, MySQL.yml‍‍ 不会对任何服务器执行。但是当我输入 no 时就会再次安装!!

 [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  

已编辑-1

我使用第一个你的解决方案,但是当我输入 no 时它将再次安装!

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'

输出是:

[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   

编辑2

这个方法有效。

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

答案1

在本地主机上运行暂停

您可以pause在特定主机上运行任务,例如localhost并从 hostvars 数组中获取答案hostvars['localhost']从这里被盗)。

- 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'

您必须在该主机上使用专用游戏才能访问主机变量数组中的答案。如果您在主机组上运行一次(就像在原始请求中一样),您必须猜测哪个主机将首先被处理并使用hostvars['firstprocessedhost'](有时hostvars['db1'])。

当您使用时,delegate_to: localhost任务仍然运行db1并且答案存储在hostvars['db1'].

您不应该依赖于主机的顺序,并且暂停模块旨在暂停剧本而不是提示用户数据。

变量提示符

如果可能的话,您应该使用vars_prompt您的戏剧部分:

- 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'

相关内容