尝试基于ansible_local事实设置全局Ansible事实

时间:2019-02-13 13:42:59

标签: ansible ansible-facts

我正在尝试利用位于3个数据库主机之一中的本地Ansible事实来设置全局事实,以便其他节点可以利用IP。

3个节点,3组局部事实,将ansible_local.edb.type设置为以下任意一个:

  • 主人
  • 见证人
  • 待机

Node2具有ansible_local.edb.type ==备用,我正在尝试将set_fact全局设置为IP地址。我的问题是要有条件地设置一个事实,那么何时必须是:

何时:ansible_local.edb.type ==“待机”

但这只是在特定节点上设置事实,显然是由于有条件的

我尝试在一个块中阻塞一个任务以获取管道输出,但似乎破坏了语法-如果可能的话,这对Ansible来说确实是很酷的补充。

- debug:
    msg: "{{ ansible_local.edb.type }}"

- name: Set DB standby IP address fact
  set_fact:
    db_standby_node_ip: "{{ hostvars[inventory_hostname][prod_nic]['ipv4']['address'] }}"
  when: ansible_local.edb.type == "standby"

- debug:
    msg: "{{ db_standby_node_ip }}"



TASK [debug] 
*******************************************************************
task path: /path/to/playbook.yml
ok: [Node1] => {
    "msg": "master"
}
ok: [Node2] => {
    "msg": "standby"
}
ok: [Node3] => {
    "msg": "witness"
}

TASK [Set DB standby IP address fact] 
******************************************
task path: /path/to/playbook.yml
ok: [Node2] => {
    "ansible_facts": {
        "db_standby_node_ip": "x.x.x.y"
    },
    "changed": false,
    "invocation": {
        "module_args": {
            "db_standby_node_ip": "x.x.x.y"
        },
        "module_name": "set_fact"
    }
}

TASK [debug]
*******************************************************************
task path: /path/to/playbook.yml
fatal: [Node1]: FAILED! => {
    "failed": true,
    "msg": "the field 'args' has an invalid value,..
}
fatal: [Node3]: FAILED! => {
    "failed": true,
    "msg": "the field 'args' has an invalid value,...
}
ok: [Node2] => {
    "msg": "x.x.x.y"
}

我希望有人对如何在全球范围内设置事实有不同的看法,但要基于本地事实?

1 个答案:

答案 0 :(得分:0)

使用json_query来获取以standby == "true"作为过滤器的主机,无需使用inventory_hostname

- name: Set DB standby IP address fact
  set_fact:
    db_standby_node_ip: {{ hostvars | json_query('* | [?ansible_local.edb.type==`standby`] | [0].'+prod_nic+'.ipv4.address') }}"
相关问题