在之前的文章中,我们提到 Ansible 是通过 inventory 文件来管理资产的,但是一般情况下,一个配置管理系统往往会将资产存储在一个软件系统里,这种情况下该如何处理呢?

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

比如为了结合资产管理系统(CMDB),所以要使用到动态获取 inventory 的方法,这样可以省去配置 ansible 服务端的 hosts,所有的客户端 IP、帐号、密码、端口都可以从 CMDB 中获取到。

只要你的脚本输出格式是满足要求的 JSON,这样就可以成为一个动态的资产生成器。

脚本规约

用于生成 JSON 的脚本对实现语言没有要求,它可以是一个可执行脚本、二进制文件,或者其他任何可以运行文件,但是必须输出为 JSON 格式,同时必须支持两个参数:--list--host <hostname>

  • --list:用于返回所有的主机组信息,每个组所包含的主机列表 hosts、所含子组列表 children、主机组变量列表 vars 都应该是字典形式的,_meta 用来存放主机变量。

示例如下:

{"group1": {"hosts": ["192.168.28.71","192.168.28.72"],"vars": {"ansible_ssh_user": "johndoe","ansible_ssh_private_key_file": "~/.ssh/mykey","example_variable": "value"},"children":['group2']},"_meta": {"hostvars": {"192.168.28.71": {"host_specific_var": "bar"},"192.168.28.72": {"host_specific_var": "foo"}}}
}
  • --host <hostname>:返回指定主机的变量列表,或者返回一个空的字典

如:

{"host_specific_var": "foo"
}

脚本实现

一个参考实现框架如下:

#!/usr/bin/env python3
#coding:utf8
import json
import sysdef all():info_dict = {"all":["10.10.0.109","10.10.0.112"]}print(json.dumps(info_dict,indent=4))def group():host1 = ['10.10.0.112']host2 = ['10.10.0.112','10.10.0.109']group1 = 'test1'group2 = 'test2'hostdata = {group1:{"hosts":host1},group2:{"hosts":host2}}print(json.dumps(hostdata,indent=4))def host(ip):info_dict = {"10.10.0.112": {"ansible_ssh_host":"10.10.0.112","ansible_ssh_port":22,"ansible_ssh_user":"root","ansible_ssh_pass":"123457"},"10.10.0.109": {"ansible_ssh_host":"10.10.0.109","ansible_ssh_port":22,"ansible_ssh_user":"root","ansible_ssh_pass":"xxxx"}}print(json.dumps(info_dict,indent=4))if len(sys.argv) == 2 and (sys.argv[1] == '--list'):group()
elif len(sys.argv) == 3 and (sys.argv[1] == '--host'):host(sys.argv[2])
else:print("Usage: %s --list or --host <hostname>" % sys.argv[0])sys.exit(1)

使用

使用方法和静态 inventory 类似:

# 可以指定组
$ ansible -i dynamic_investory.py all --list-hostshosts (3):127.0.0.110.10.0.11210.10.0.109# 可以指定主机
$ ansible -i dynamic_investory.py 127.0.0.1 --list-hostshosts (1):127.0.0.1

如果觉得有用,欢迎关注我的微信,一起学习,共同进步,不定期推出赠书活动~

最近搜集到慕课网视频,视频内容涵盖 Python、Java、PHP、前端、小程序、算法、架构、数据库等等!关注本公众号,后台回复「慕课网」即可获取下载地址。


参考:

  • https://www.jeffgeerling.com/blog/creating-custom-dynamic-inventories-ansible
  • https://adamj.eu/tech/2016/12/04/writing-a-custom-ansible-dynamic-inventory-script/
  • https://pynet.twb-tech.com/blog/ansible/dynamic-inventory.html
  • http://www.ywnds.com/?p=11701
  • http://www.linuxyw.com/749.html

Ansible 进阶 | 动态 Inventory相关推荐

  1. python3连接mysql获取ansible动态inventory

    脚本地址:https://github.com/AlbertCQY/scripts/tree/master/ansible 脚本用法:README.txt 1.脚本用法 bestpay用户 cd /t ...

  2. python3连接mysql获取ansible动态inventory脚本

    Ansible Inventory 是包含静态 Inventory 和动态 Inventory 两部分的,静态 Inventory 指的是在文件中指定的主机和组,动态 Inventory 指通过外部脚 ...

  3. Ansible动态Inventory格式

    Ansible可从服务器接口获取动态Inventroy配置 动态Inventory格式如下: {"group1": {"hosts": ["host1 ...

  4. ansible动态inventory里的针对AWS中国的设置

    如果你想使用ansible来动态管理AWS里的机器和设施,不幸的你用的是国内的AWS服务,你会发现一开始怎么用例子里的ec2.py都会报错说 AWS_ACCESS_KEY_ID 和 AWS_SECRE ...

  5. Ansible 五(inventory文件 主机清单)

    Ansible 五(inventory文件  主机清单) Ansible 可同时操作属于一个组的多台主机,组和主机之间的关系通过 inventory 文件配置. 默认的文件路径为 /etc/ansib ...

  6. Ansible主机清单inventory

    前言 关于Ansible是什么,我在之前的文章中没有说:当然了,我这里也不会说.当你看到我写的这篇文章时,我想你已经知道了Ansible是什么了,如果您还不知道什么是Ansible是什么,那我的建议是 ...

  7. 细说Ansible主机清单inventory

    Ansible是一个系列文章,我会尽量以通俗易懂.诙谐幽默的总结方式给大家呈现这些枯燥的知识点,让学习变的有趣一些. 前言 关于Ansible是什么,我在之前的文章中没有说:当然了,我这里也不会说.当 ...

  8. Ansible进阶学习之Playbooks(剧本)的理解使用

    前言 上一篇文章为大家对"Ansible"简单入了个门,介绍了自动化运维发展,Ansible的基本原理以及基本模块的使用.本篇文章,我们将趁热打铁,学习Ansible的核心--pl ...

  9. 37: sudo提权 、 Ansible配置 、 Ansible Playbook 、 Ansible进阶 、 总结和答疑

    Top NSD AUTOMATION DAY02 案例1:配置sudo权限 案例2:修改Ansible配置 案例3:Playbook应用案例 案例4:Playbook应用案例 1 案例1:配置sudo ...

最新文章

  1. ODBC访问EXCEL
  2. SSIM与PSNR的计算方式
  3. flink批流统一​(还没完成)
  4. 在kubernetes 集群内访问k8s API服务
  5. map和hash_map
  6. [转载] java 计算协方差_Java的深度:通过协方差暴露的API泄漏
  7. 工厂模式解耦---控制反转
  8. python numpy 写入、读取 .npz 压缩文件
  9. 【网络小说推荐】纨绔才子
  10. 不可小视的贝叶斯(三)
  11. html span 字体位置,html – 如何强制span在CSS中使用父字体系列
  12. Objective-C 中 NULL、nil、Nil、NSNull 的定义及不同
  13. 自用JavaMail实现
  14. xtrabackup备份mysql实战_Xtrabackup备份mysql实战(做从库全过程)
  15. 集成学习算法策略 Boosting和Bagging
  16. 如何成为很厉害的程序员?- 读《精进》
  17. 用蚕茧表示法写简洁实用的接口文档
  18. 教你如何编写游戏外挂
  19. baiduRanking多站点批量百度排名查询
  20. AVPlayer与AVPlayerViewController媒体播放器

热门文章

  1. 解决:Unknown column ‘id‘ in ‘where clause‘ 问题
  2. 台式计算机启动时 每次按f1,台式机电脑每次开机都要按F1,华硕主板
  3. 组织行为学笔记(4)——人格与价值观
  4. Kotlin: Classifier ‘Demo1‘ does not have a companion object, and thus must be initialized here
  5. Javaweb开发学习笔记(三)
  6. 谷歌李开复:我的传奇人生源于十句箴言
  7. android studio hiera,PL/SQL初学者必读:几十个实用的PL/SQL
  8. 阿卡迪亚大学计算机专业好考吗,考上阿卡迪亚大学有多难?
  9. item2vec--word2vec在推荐领域的使用
  10. 夜间模式 css,网站夜间模式的实现