问题描述
在使用Ansible环境中,机器以主机名在清单中列出。偶尔需要在playbook中确定目标机器的IP地址(注意:在这个背景下,我只关心Ansible控制机与客户机之间连接的接口的地址)。
问题是,在操作系统无关的方式下,似乎很难做到这一点:Linux客户端在其hostvars
中定义了字典default_ipv4
,而Windows机器则定义了数组ip_addresses
。
以下是Linux客户端的hostvars
转储中相关部分的样子:
ok: [sampleboxlin] => {"hostvars[inventory_hostname].ansible_facts": { "all_ipv4_addresses": [ "123.234.99.99" ],
而这是Windows客户端的情况:
ok: [sampleboxwin] => {"hostvars[inventory_hostname]": {
// 省略部分内容
"hostname": "sampleboxwin",
"interfaces": [
{
"connection_name": "Ethernet0",
"default_gateway": "123.234.99.1",
"dns_domain": null,
"interface_index": 13,
"interface_name": "Intel(R) 82574L Gigabit Network Connection",
"macaddress": "0b:fu:sc:at:ed:00"
}
],
"ip_addresses": [
"123.234.99.9"
],
因此,在playbook中以鲁棒且操作系统无关的方式,将主机名映射到主机的IP地址[1],是什么最佳实践方法呢?
注意:在接下来的解决方案中,我们将提供两种不同的方法来解决这个问题。
解决方案
方法1:使用Ansible的lookup
插件查找IP地址
步骤
- 确定客户端的IP地址解析,例如在控制器上运行以下命令:
“`yaml - debug:
msg: “{{ lookup(‘community.general.dig’, inventory_hostname) }}”
delegate_to: localhost
“`
这将返回客户端解析出的IP地址。 - 如果play在客户端上运行,将操作委派给本地主机:
“`yaml - debug:
msg: “{{ lookup(‘community.general.dig’, inventory_hostname) }}”
delegate_to: localhost
“`
这将返回解析到本地主机的IP地址。
方法2:使用主机变量中的IP地址信息
步骤
- 在playbook中,使用主机变量获取客户端的IP地址。
- 根据操作系统的类型,提取不同的IP地址信息:
- 对于Linux客户端:
“`yaml- debug:
msg: “{{ hostvars[inventory_hostname].ansible_facts.all_ipv4_addresses[0] }}”
“`
- debug:
- 对于Windows客户端:
“`yaml- debug:
msg: “{{ hostvars[inventory_hostname].ip_addresses[0] }}”
“`
通过以上两种方法中的任何一种,你都可以在playbook中以鲁棒且操作系统无关的方式获得客户端的IP地址。
- debug:
请注意,这些方法都是为了实现在不同操作系统上以相同的方式获取客户端的IP地址。根据你的需求和环境,选择适合你情况的方法即可。
正文完