2016-09-02 5 views
0

私はローカルデータベースとデーモンのための1つの特定のロールを作成し、masterデータベースとして主に使用されていたdbserverグループの最初のサーバからデータベースを削除して再作成します。その後不可能なデリゲートとrun_once

group_vars/dbserver 

[dbserver] 
vagrant1 # master db 
vagrant2 # slave db 

私はデータベースを削除しても、再びデータベースを作成する必要がある場合は、基本的に私はちょうどコマンドは、グループ内の最初のサーバー上で実行されることを必要とします。ここで

- name: drop database 
    mysql_db: name={{ targetdbname }} state=absent 
    when: targetdeploydb == "new" 
    delegate_to: "{{ item }}" 
    with_items: "{{ groups.dbserver }}" 
    run_once: true 

- name: create database 
    mysql_db: name={{ targetdbname }} state=present 
    when: targetdeploydb == "new" 
    delegate_to: "{{ item }}" 
    with_items: "{{ groups.dbserver }}" 
    when: targetdeploydb == "new" 
    run_once: true 

ログは私が脚本

TASK [laravel : drop database] ************************************************* 
changed: [vagrant1 -> vagrant1] => (item=vagrant1) 
changed: [vagrant1 -> vagrant2] => (item=vagrant2) 

TASK [laravel : create database] *********************************************** 
changed: [vagrant1 -> vagrant1] => (item=vagrant1) 
changed: [vagrant1 -> vagrant2] => (item=vagrant2) 

を実行すると私は考えることができるもう一つの方法は、delegate_toに直接マスターDBのホスト名を使用しているが、それは私が別の変数を作成する必要があることを意味しています。もう一方では、変数の数を減らし、より動的にするほうが良いと思います。あなたが唯一の最初のサーバーにあなたのタスクを委任し、一度どんなに多くのサーバーの現在のプレイでそれを実行し、使用する必要がある場合は

答えて

1

を教えてください:

- name: drop database 
    mysql_db: name={{ targetdbname }} state=absent 
    when: targetdeploydb == "new" 
    delegate_to: "{{ groups['dbserver'] | first }}" 
    run_once: true 
+0

パーフェクト!これは実際には現在稼動しており、1台のサーバでしか動作していません。とにかく、私はどこで、可変変数の高度な使い方に関するドキュメントを読むことができますか?私は、あなたが上記のようにパイプを使って配列内の最初の結果を得る方法についても、角かっこや中かっこをいつ使用するかについて本当に慣れていません。またはそれはPythonに基づいていますか? – AlamHo

+0

必要なものはすべて:[変数](http://docs.ansible.com/ansible/playbooks_variables.html)、[危険なフィルタ](http://docs.ansible.com/ansible/playbooks_filters.html)、[ Jinja2 Filters](http://jinja.pocoo.org/docs/dev/templates/#list-of-builtin-filters)を参照してください。中括弧とパイプはJinja2から来ており、角括弧はPythonから来ています。 –

+0

もう一度ありがとう!あなたは最高です – AlamHo

関連する問題