Ansible与cmdb配合使用动态inventory

郝朝阳 DevOps视角

Ansible之inventory


在生产中使用Ansible进行批量管理的同志们都应该知道,Ansible使用通过inventory文件来对资产进行管理的。在生产中常用的情形就是维护不止一个inventory文件。但是有了资产管理系统之后,再去维护一堆的inventory文件就不是很好的。没法保证每个inventory文件的有效性。
Ansible的inventory是有静态和动态之分的。静态的inventory就是需要人工维护的的文件。动态的inventory不是生成一个inventory文件,而是把获取的结果直接传递给Ansible的相关命令即可。今天和大家分享下,与cmdb配合动态获取inventory的方法。

编写脚本


由于是和公司cmdb(是由本人开发,可以进行交流)配合起来,调用了cmdb的相关API,所以就只给出部分代码。整体思想是要实现必须支持两个参数--list和--host hostname/ip。并且输出格式必须是json格式。
--list:用于返回所有的主机信息,包括每个主机组的主机信息。同时也可以实现支持children、vars、_meta等
--host hostname/ip:用于返回特定的主机列表

# vim gethosts.py#!/usr/bin/env python# -*- coding:utf-8 -*-import requestsimport jsonimport sysimport argparse...以上忽略....if __name__ == '__main__':    parser = argparse.ArgumentParser()    parser.add_argument('--list',action='store_true',dest='list',help='get all hosts')    parser.add_argument('--host',action='store',dest='host',help='get specific host')    args = parser.parse_args()    if len(sys.argv) == 2 and (sys.argv[1] == '--list'):        GroupList()    elif len(sys.argv) == 3 and (sys.argv[1] == '--host'):        HostList(sys.argv[2])

运行脚本


#python gethosts.py --helpusage: gethosts.py [-h] [--list] [--host HOST]optional arguments:  -h, --help   show this help message and exit  --list       get all hosts  --host HOST  get specific host# python gethosts.py --list{    "all": {        "hosts": [            "node1",            "node2",            "node3",            "node4",            "node5",            "node6",            "node7",            "node8",            "node9",            "node10",            "node11",            "node12",            "node13",            "node14"        ]    }}# python gethosts.py --host node14{    "ansible_ssh_host": "node14"}# chmod +x gethosts.py

与Ansible配合获取主机列表


获取特定主机


# ansible -i gethosts.py node6 --list-hosts  hosts (1):    node6 

获取所有主机


# ansible -i gethosts.py all --list-hosts  hosts (14):    node1    node2    node3    node4    node5    node6    node7    node8    node9    node10    node11    node12    node13    node14

Ansible使用动态inventory执行命令


单台主机


# ansible -i gethosts.py node6 -m pingnode6 | SUCCESS => {    "changed": false,    "ping": "pong"}

所有主机


# ansible -i gethosts.py all -m pingnode1 | SUCCESS => {    "changed": false,    "ping": "pong"}node2 | SUCCESS => {    "changed": false,    "ping": "pong"}node3 | SUCCESS => {    "changed": false,    "ping": "pong"}node4 | SUCCESS => {    "changed": false,    "ping": "pong"}node5 | SUCCESS => {    "changed": false,    "ping": "pong"}node6 | SUCCESS => {    "changed": false,    "ping": "pong"}node7 | SUCCESS => {    "changed": false,    "ping": "pong"}node8 | SUCCESS => {    "changed": false,    "ping": "pong"}node9 | SUCCESS => {    "changed": false,    "ping": "pong"}node10 | SUCCESS => {    "changed": false,    "ping": "pong"}node11 | SUCCESS => {    "changed": false,    "ping": "pong"}node12 | SUCCESS => {    "changed": false,    "ping": "pong"}node13 | SUCCESS => {    "changed": false,    "ping": "pong"}node14 | SUCCESS => {    "changed": false,    "ping": "pong"}

在实际运行中并不是这么有序的。

实际运行图


指定主机

所有主机

动态inventory在Ansible的api(虽然不想提Ansible的api)里也可以进行使用。

©著作权归作者所有:来自51CTO博客作者mob604756e75222的原创作品,如需转载,请注明出处,否则将追究法律责任

更多相关文章

  1. Playbook分发Nginx配置文件
  2. Prometheus监控CPU,Memory,Disk
  3. Redis配置文件详细总结
  4. 实战--Playbook批量更改服务器主机名
  5. php运算符、流程控制、文件引入
  6. Spring Boot利用Logback输出日志到指定位置的简单配置及使用方式
  7. Redis这些知识点,是必须知道的!
  8. 30个必知的Linux命令技巧,你都掌握了吗?
  9. Linux基础-18day-Linux系统磁盘管理(du/df/mount命令)

随机推荐

  1. Android之列表对话框
  2. Android图片旋转实例
  3. Android中模拟点击软件的实现原理探究
  4. android微博客户端源代码
  5. Android中的android:layout_weight讲解
  6. android 相对布局
  7. Android获取当前时间
  8. Android ScrollView 去掉 scrollbar 和
  9. 日期和时间(DatePicker、TimePicker)
  10. Android中Json的解析和构建