Попытка установить глобальный факт 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') }}"