如何在Ansible中为另一个主机使用另一个任务中的一个任务的返回值 [英] How to use return values of one task in another task for a different host in ansible

查看:166
本文介绍了如何在Ansible中为另一个主机使用另一个任务中的一个任务的返回值的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我试图设置一个由2个mysql主机组成的主机组的mysql主从复制.

I was trying to setup mysql master slave replication with ansible for a hostgroup consisting of 2 mysql hosts.

这是我的情况:

我在第一台主机上运行一个任务,并跳过第二台主机,因此第一台任务(即主复制状态)返回一些值,例如Position,File等.

I run one task in the 1st host and skips the 2nd host, so the 1st task (i.e master replication status) returns some values like Position, File etc.

然后,我在第二个主机中运行另一个任务(跳过第一个主机),该任务使用第一个任务的返回值,例如master.Position,master.File等.

Then, I run another task in 2nd host (skips the 1st hosts), This task uses the return values of the 1st task like master.Position, master.File etc.

现在,当我运行剧本时,第一个任务的变量似乎在第二个任务中不起作用

Now, when I run the playbook, the variables of the 1st task does not seem to be working in the 2nd task

库存文件

    [mysql]
    stagmysql01 ansible_host=1.1.1.1 ansible_ssh_user=ansible ansible_connection=ssh
    stagmysql02 ansible_host=1.1.1.2 ansible_ssh_user=ansible ansible_connection=ssh 

Master上的任务

- name: Mysql - Check master replication status.
  mysql_replication: mode=getmaster
  register: master

- debug: var=master

从属任务

- name: Mysql - Configure replication on the slave.
  mysql_replication:
    mode: changemaster
    master_host: "{{ replication_master }}"
    master_user: "{{ replication_user }}"
    master_password: "{{ replication_pass }}"
    master_log_file: "{{ master.File }}"
    master_log_pos: "{{ master.Position }}"
  ignore_errors: True

主输出

TASK [Mysql_Base : Mysql - Check master replication status.] ****************
skipping: [stagmysql02]
ok: [stagmysql01]

TASK [Mysql_Base : debug] ***************************************************
ok: [stagmysql01] => {
    "master": {
        "Binlog_Do_DB": "", 
        "Binlog_Ignore_DB": "mysql,performance_schema", 
        "Executed_Gtid_Set": "", 
        "File": "mysql-bin.000003", 
        "Is_Master": true, 
        "Position": 64687163, 
        "changed": false, 
        "failed": false
    }
}
ok: [stagmysql02] => {
    "master": {
        "changed": false, 
        "skip_reason": "Conditional result was False", 
        "skipped": true
    }
}

从属输出

TASK [Mysql_Base : Mysql - Configure replication on the slave.] *************
skipping: [stagmysql01]
fatal: [stagmysql02]: FAILED! => {"failed": true, "msg": "The task includes an option with an undefined variable. The error was: 'dict object' has no attribute 'File'\n\nThe error appears to have been in '/root/ansible/roles/Mysql_Base/tasks/replication.yml': line 30, column 3, but may\nbe elsewhere in the file depending on the exact syntax problem.\n\nThe offending line appears to be:\n\n\n- name: Mysql - Configure replication on the slave.\n  ^ here\n\nexception type: <class 'ansible.errors.AnsibleUndefinedVariable'>\nexception: 'dict object' has no attribute 'File'"}
...ignoring

如上所述,由于未定义变量,第二个主机的第二个任务失败.但是,所需的变量位于第一主机的第一任务中.

As, you can see above, the 2nd task failed for 2nd host because of undefined variables. However the required variables are there in 1st task of 1st host.

在另一个任务中,如何使用从第二个主机的第一个主机返回的变量?

How do I use the variables returned from 1st host in 2nd host in another task ?

P.S:我已经看到了使用{{hostvars ['inventory_hostname'] ['variable']}}的方法. 但是,我对这种方法感到很困惑,因为需要直接添加ventory_hostname或IP地址.我一直在寻找可用于不同清单文件和剧本的通用模板.

P.S: I have seen the approach of using {{ hostvars['inventory_hostname']['variable'] }}. However I'm quite confused with this approach as the inventory_hostname or IP address needs to be added directly. I was looking for a common template that can be used for different inventory files and playbooks.

推荐答案

我能够通过将变量定义到新的虚拟主机,然后将其与 hostvars .

I was able to solve my problem by defining the variables to a new dummy host and then using it across the playbook with hostvars.

Similar solution was already mentioned in one of the answers in How do I set register a variable to persist between plays in ansible? However I did not notice it until I posted this question.

这是我在忙碌的任务中所做的:

Here is what I did in the ansible tasks:

  • 我创建了一个虚拟主机 master_value_holder 并定义了 必需的变量. (在这里,我需要 master_log_file master_log_Postion )
  • 使用 hostvars ['master_value_holder'] ['master_log_file']
  • 访问变量
  • I have created a dummy host master_value_holder and defined the required variables. (Here I needed master_log_file and master_log_Postion)
  • Accessed the variables using hostvars['master_value_holder']['master_log_file']

Master上的任务

- name: Mysql - Check master replication status.
  mysql_replication: mode=getmaster
  register: master

- name: "Add master return values to a dummy host"
  add_host:
    name:   "master_value_holder"
    master_log_file: "{{ master.File }}"
    master_log_pos: "{{ master.Position }}"

从站任务

- name: Mysql - Displaying master replication status
  debug: msg="Master Bin Log File  is {{ hostvars['master_value_holder']['master_log_file'] }} and Master Bin Log Position is {{ hostvars['master_value_holder']['master_log_pos'] }}"

- name: Mysql - Configure replication on the slave.
  mysql_replication:
    mode: changemaster
    master_host: "{{ replication_master }}"
    master_user: "{{ replication_user }}"
    master_password: "{{ replication_pass }}"
    master_log_file: "{{ hostvars['master_value_holder']['master_log_file'] }}"
    master_log_pos: "{{ hostvars['master_value_holder']['master_log_pos'] }}"
  when: ansible_eth0.ipv4.address != replication_master and not slave.Slave_SQL_Running

输出

TASK [Mysql_Base : Mysql - Check master replication status.] ****************
skipping: [stagmysql02]
ok: [stagmysql01]

TASK [AZ-Mysql_Base : Add master return values to a dummy host] ****************
changed: [stagmysql01]

TASK [AZ-Mysql_Base : Mysql - Displaying master replication status] ************
ok: [stagmysql01] => {
    "msg": "Master Bin Log File  is mysql-bin.000001 and Master Bin Log Position is 154"
}
ok: [stagmysql02] => {
    "msg": "Master Bin Log File  is mysql-bin.000001 and Master Bin Log Position is 154"
}

TASK [AZ-Mysql_Base : Mysql - Configure replication on the slave.] *************
skipping: [stagmysql01]
skipping: [stagmysql02]

从上面的输出中可以看到,现在两个主机都可以使用主复制状态.

As you can see from the above output that the master replication status is available for both the hosts now.

这篇关于如何在Ansible中为另一个主机使用另一个任务中的一个任务的返回值的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆