我有一个从 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
干杯斯宾塞