2016-10-29 8 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!" 
} 

ЗАДАЧА Получить мастер получить файл и позиции.
Но следующая задача говорит "binlog.File": "VARIABLE IS NOT DEFINED!"

Может анзибль это различие между usme-db-master и usme-db-slave.

Что мне делать?

версия 2.3.0

+0

Использование {{}} в отладке при использовании переменной. Итак, var = "{{binlog.File}}" – Shasha99

+0

@ Shasha99 Нет, это не правильный синтаксис. Использование OP правильное. – techraf

ответ

1

Ваша первая задача включает в себя условное: вы определяете регистр binlogтолько когда hostname.stdout.find('usme-db-master') == 0.

В вашем пробеге это условие не выполняется, поэтому задача пропущена (таким образом, binlog - не).

В вашей второй задаче используется binlog факт, когда выполнено условие when: hostname.stdout.find('usme-db-slave') == 0.

На этот раз условие выполнено и задание выполнено. Однако, поскольку первая задача была пропущена, binlog не установлен, Ansible сообщает об ошибке.


На вершине выше логики изъян, использовать факт с одного хоста на другой, вам нужно разделить свой код на две пьесы и запускать их последовательно на каждом хосте. Затем доступ к переменной, используя 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 
Смежные вопросы