Как преобразовать в глобальные переменные?

Я хочу сделать репликацию с 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!"

Может быть Ansible это различать usme-db-master а также usme-db-slave,

Что я должен делать?

Версия 2.3.0

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
Другие вопросы по тегам