【发布时间】:2019-06-20 21:28:55
【问题描述】:
我有一个从 AWX 运行的 Ansible 剧本。播放使用 Infoblox nios 模块来检索有关 Infoblox 主机注册的信息。
我正在使用 set_fact 模块获取查询的输出,然后定义一些新的事实以在剧本的其他地方使用。
我遇到的问题是查询可以根据注册的格式返回不同数量的变量,这会破坏剧本。
如果只有在原始查询中返回特定变量时我才能设置新事实,那么我要做的是锻炼。
我尝试过使用“如果已定义”,但这似乎不起作用。
在示例 1 中,播放“获取主机记录”返回以下值。主机、ipv4addr 和 mac,因为主机在 Infoblox 中有一个 Mac 地址
ok: [localhost] => {
"ansible_facts": {
"host": {
"ipv4addrs": [
{
"host": "myhost1.test.com",
"ipv4addr": "192.168.30.1",
"mac": "00:22:33:11:44:55"
}
],
"name": "myhost1.test.com",
"view": "Internal"
}
},
"changed": false
}
在示例 2 中,相同的播放仅返回主机和 ipv4addr,因为主机没有注册 Mac 地址。
ok: [localhost] => {
"ansible_facts": {
"host": {
"ipv4addrs": [
{
"host": "myhost2.test.com",
"ipv4addr": "192.168.30.2"
}
],
"name": "myhost2.test.com",
"view": "Internal"
}
},
"changed": false
}
我的剧本包含以下内容,并且仅当主机包含 Mac 地址作为事实主机时才有效,不包含 host.ipv4addrs[0].mac 的值,因此它会崩溃。如果定义了 host.ipv4addrs[0].mac,我想添加一些逻辑来尝试设置 niosmac。
tasks:
- name: fetch host record
set_fact:
host: "{{ lookup('nios', 'record:host', filter={niossearchcatagory: searchcriteria, 'view': 'Internal'}, provider=nios_provider) }}"
- name: Set niosip
set_fact:
niosip: "{{ host.ipv4addrs[0].ipv4addr }}"
nioshostname: "{{ host.name }}"
niosdhcp: "{{ host.ipv4addrs[0].configure_for_dhcp }}"
niosmac: "{{ host.ipv4addrs[0].mac }}"
这是我尝试使用的版本定义
tasks:
- name: fetch host record
set_fact:
host: "{{ lookup('nios', 'record:host', filter={niossearchcatagory: searchcriteria, 'view': 'Internal'}, provider=nios_provider) }}"
- name: Set niosip
set_fact:
niosip: "{{ host.ipv4addrs[0].ipv4addr }}"
nioshostname: "{{ host.name }}"
niosdhcp: "{{ host.ipv4addrs[0].configure_for_dhcp }}"
niosmac: "{{ host.ipv4addrs[0].mac }}"
when: host.ipv4addrs[0].mac is defined
干杯 斯彭斯
【问题讨论】:
-
你能展示你如何尝试使用
if defined以及它失败的输出 -
感谢您的回复,我已经更新了主帖
标签: ansible yaml ansible-facts ansible-awx