他のサーバーのプロンプトにどのようにアクセスして応答できますか?私のマスター:
[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
。
MySQL.yml
ユーザーが応答プロンプトとしてnoと入力すると、がどのサーバーでも実行されないことを願っています。しかし、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
localhostで一時停止を実行する
pause
たとえば、特定のホストでタスクを実行し、localhost
ホスト変数の配列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'