ansible小结(五)Dynamic Inventory

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-host-static

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

ansible-hosts-json

像上面这种复杂的返回格式,一般不会用在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`?




本站的发展离不开您的资助,金额随意,欢迎来赏!

You can donate through PayPal.
My paypal id: itybku@139.com
Paypal page: https://www.paypal.me/361way

  1. 网友
    2017年12月6日20:00 | #1

    -i 后面传参只能以脚本的形式吗

    • admin
      2017年12月8日17:36 | #2

      不是,默认的/etc/ansible/hosts文件也是-i指定的,其就是不是脚本格式,不过由于是默认所以省略了。这里之所以提到脚本,是指其支持通过脚本的方式指定主机列表。

  2. 各奔哈更
    2018年2月2日14:49 | #3

    请教:
    -i 后面能否跟一个url ?
    返回的内容就是json格式的主机列表

    • admin
      2018年2月6日10:49 | #4

      理论上来说,应该是不行的,因为官方文档里未看到有这种用法,具体你可以自己测试下

  1. 2017年6月26日11:15 | #1
  2. 2018年6月16日01:40 | #2