Попытка установить глобальный факт Ansible на основе факта ansible_local

Я пытаюсь использовать локальный факт Ansible, расположенный на 1 из 3 хостов БД, чтобы установить глобальный факт, чтобы другие узлы могли использовать IP.

3 узла, 3 набора локальных фактов, устанавливающих ansible_local.edb.type либо:

  • мастер
  • свидетель
  • ожидание

У Node2 есть ansible_local.edb.type == режим ожидания, и я пытаюсь глобально установить 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 ответ

Использование 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') }}"
Другие вопросы по тегам