2016-10-29 4 views
0

私はAnsibleで複製を行いたいです。グローバル変数に変換するには?

しかし、このコードは、エラーを返します:

- name: Semi-synchronous - Get the master status 
    mysql_replication: mode=getmaster 
    register: binlog 
    when: hostname.stdout.find('usme-db-master') == 0 

- name: Debug 
    debug: var=binlog.File 
    when: hostname.stdout.find('usme-db-slave') == 0 

は出力:

ASK [dbtier : Semi-synchronous - Get the master status] *********************** 
skipping: [192.168.30.6] => {"changed": false, "skip_reason": "Conditional check failed", "skipped": true} 
ok: [192.168.30.5 -> 192.168.30.5] => {"Binlog_Do_DB": "", "Binlog_Ignore_DB": "", "Executed_Gtid_Set": "", "File": "usme-db-master-bin.000033", "Is_Master": true, "Position": 154, "changed": false} 

TASK [dbtier : Debug] ********************************************************** 
skipping: [192.168.30.5] => {"changed": false, "skip_reason": "Conditional check failed", "skipped": true} 
ok: [192.168.30.6] => { 
    "binlog.File": "VARIABLE IS NOT DEFINED!" 
} 

TASKマスターを取得し、ファイルと位置を取得することです。
しかし、次のタスクは、"binlog.File": "VARIABLE IS NOT DEFINED!"

はたぶんAnsibleがusme-db-masterusme-db-slave区別であると言います。

どうすればよいですか?

バージョンは2.3.0

+0

使用{{}}変数を使用しています。だからvar = "{{binlog.File}}" – Shasha99

+0

@ Shasha99いいえ、それは正しい構文ではありません。 OPの使用は正しいです。 – techraf

答えて

1

あなたの最初の仕事は、条件が含まれている:あなたはbinlogのみhostname.stdout.find('usme-db-master') == 0を登録定義します。

この条件が満たされていないため、タスクはスキップされます(binlogで、は登録されていません)。

条件when: hostname.stdout.find('usme-db-slave') == 0が満たされた場合、2番目のタスクではbinlogという事実が使用されます。

今回は条件が満たされ、タスクが実行されます。ただし、最初のタスクがスキップされたため、binlogが設定されていないため、Anabilitiesはエラーを報告します。上記のロジックの欠陥の上に


、別の1対1つのホストから事実を使用するには、2つの演劇にあなたのコードを分割し、各ホスト上で順番に実行する必要があります。そして、次のように(あなたは、それをカスタマイズする必要があり、それは単なる例です)でhostvarsを使用して変数にアクセス:デバッグ中

- host: usme-db-master 
    tasks: 
    - name: Semi-synchronous - Get the master status 
     mysql_replication: mode=getmaster 
     register: binlog 

- host: usme-db-slave 
    tasks: 
    - name: Debug 
     debug: var=hostvars.usme-db-master.binlog.File 
関連する問題