我正在尝试利用位于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"
}
我希望有人对如何在全球范围内设置事实有不同的看法,但要基于本地事实?
答案 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') }}"