如何转换为全局变量?

时间:2016-10-29 20:00:30

标签: ansible ansible-playbook ansible-2.x

我想用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-masterusme-db-slave

我该怎么办?

版本是2.3.0

1 个答案:

答案 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