阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

Ansible Dynamic Inventory 介绍

17次阅读
没有评论

共计 2610 个字符,预计需要花费 7 分钟才能阅读完成。

Ansible Inventory 实际上是包含静态 Inventory 和动态 Inventory 两部分,静态 Inventory 指的是在文件 /etc/ansible/hosts 中指定的主机和组,Dynamic Inventory 指通过外部脚本获取主机列表,并按照 ansible 所要求的格式返回给 ansilbe 命令的。这部分一般会结合 CMDB 资管系统、zabbix 监控系统、crobble 安装系统、云计算平台等获取主机信息。由于主机资源一般会动态的进行增减,而这些系统一般会智能更新。我们可以通过这些工具提供的 API 或者接入库查询等方式返回主机列表。

一、最简单示例

由于 Ansible 在接受脚本动态获取主机信息时支持的是 json 格式,这里我也不从其他系统中取了,向通过一段代码打印一个段 json 格式的主机信息:

#!/usr/bin/env python
# coding=utf-8
import json
host1ip = ['10.212.52.252','10.212.52.14']
host2ip = ['10.212.52.16']
group = 'test1'
group2 = 'test2'
hostdata = {group:{"hosts":host1ip},group2:{"hosts":host2ip}}
print json.dumps(hostdata,indent=4)

注:

1、主机部分必须是列表格式的;

2、hostdata 行,其中的 ”hosts” 部分可以省略,但如果使用时,必须是 ”hosts”,不能是其他如‘‘hostlist’’等字符串。

省略后可以这样写:

hostdata = {group:host1ip,group2:host2ip}

直接执行该段代码结果如下:

[root@361way.com ~]# python twogroup.py
{
"test1": {
"hosts": [
"10.212.52.252",
"10.212.52.14"
]
},
"test2": {
"hosts": ["10.212.52.16"]
}
}

上面定义了两个主机组,test1 组内包含主机 10.212.52.252、10.212.52.14,test2 组内包含主机 10.212.52.16。ansible 可以通过如下方法调用:

[root@361way.com ~]# ansible -i twogroup.py test1 -m command -a 'uptime' -k
SSH password:
10.212.52.252 | success | rc=0 >>
23:01pm up 24 days 8:24, 2 users, load average: 0.21, 0.35, 0.39
10.212.52.14 | success | rc=0 >>
23:08pm up 332 days 5:23, 2 users, load average: 0.00, 0.01, 0.05
[root@361way.com ~]# ansible -i twogroup.py test2 -m command -a 'uptime' -k
SSH password:
10.212.52.16 | success | rc=0 >>
23:09pm up 332 days 6:00, 2 users, load average: 0.08, 0.06, 0.05
二、复杂示例

在静态主机配置文件示例中,会有组变量(vars),组之间的包含,如下图:

Ansible Dynamic Inventory 介绍

如果以上部分想要,通过脚本获取实现,实现后返回的 json 格式应该如下图:

Ansible Dynamic Inventory 介绍

像上面这种复杂的返回格式,一般不会用在 ad-hoc 环境中,多数会用在 ansible-playbook 中,应为 playbook 文件中有时假会涉及到 vars 参数的传参。

三、从第三方平台获取主机示例

这个在本篇一开头就提到了,我们从如 cobbler、cmdb 等平台上获取的示例。由于 ansible 的发起者(作者)同时又是 cobbler 软件的创建者,所以官方文档给了我们 cobbler 的示例,同时给出了一个从 AWS 去上获取主机信息的示例。如下:

cobbler 上获取主机信息代码

aws 云上获取主机信息代码

关于如何从 aws 上获取主机信息并入库,这个我之前也写过相关的篇章,具体也可以参看我之前的博文----AWS 主机资产管理(该篇也是纯 python 实现的)。

通过 zabbix api 获取主机信息,我也写过一篇 zabbix 小结(八)Zabbix api,想要通过 zabbix 平台上获取主机列表信息也可以参考下。

四、其他

1、ansible -i 参数后调用的脚本并非一定是 py 文件 ,也可以是其他脚本输出的结果,这里做了个简单的测试:

[root@361way.com yaml]# ansible -i group.sh test1 -m command -a 'uptime' -k
SSH password:
10.212.52.16 | success | rc=0 >>
00:18am up 332 days 7:10, 2 users, load average: 0.00, 0.01, 0.05
10.212.52.14 | success | rc=0 >>
00:17am up 332 days 6:32, 2 users, load average: 0.01, 0.03, 0.05
10.212.52.252 | success | rc=0 >>
00:11am up 24 days 9:33, 2 users, load average: 0.49, 0.42, 0.41
[root@localhost yaml]# cat group.sh
#!/bin/bash
groups='''{"test1": {"hosts": ["10.212.52.252","10.212.52.14","10.212.52.16"]
}
}
'''
echo $groups

2、-i 参数指定的脚本需要有可执行权限 ,不然会报错,如下:

[root@361way.com yaml]# ansible -i hostjson.py AA -a 'uptime'
ERROR: The file hostjson.py looks like it should be an executable inventory script, but is not 
marked executable. Perhaps you want to correct this with `chmod +x hostjson.py`?

阿里云 2 核 2G 服务器 3M 带宽 61 元 1 年,有高配

腾讯云新客低至 82 元 / 年,老客户 99 元 / 年

代金券:在阿里云专用满减优惠券

正文完
星哥说事-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2024-08-28发表,共计2610字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中