Ansible Inventory指北进阶
Ansible的inventory文件定义了它要操作的一些主机,它可以通过inventory对这些主机进行操控。默认的inventory文件是/etc/ansible/hosts
。也可通过-i选项,来指定不同的inventory文件。
Ansible也支持从云中拉取inventory文件执行,拉取的文件可以试YMAL,ini,etc
等格式。 这个是在ansbible 的 2.4版本新引入的功能,Ansible也有inventory的插件来让inventory变的更灵活和自定义化。
inventory的格式一般如下:
mail.example.com
[webservers]
foo.example.com
bar.example.com
[dbservers]
one.example.com
two.example.com
three.example.com
关于inventory的详细描述,参考我早期参与的翻译项目,Ansible 中文权威
动态inventory
静态 Inventory 指的是在文件中指定的主机和组,动态 Inventory 指通过外部脚本获取主机列表,并按照 ansible 所要求的格式返回给 ansilbe 命令的。这部分一般会结合 CMDB 资管系统、云计算平台等获取主机信息。
看到一段很不错的代码,参考下。
#!/usr/bin/python
#!/Users/aihe/.pyenv/shims/python
#coding : utf-8
import json
import sys
def group():
host1 = ['192.168.0.112']
host2 = ['192.168.0.112','192.168.0.109']
group1 = 'test1'
group2 = 'test2'
hostdata = {
group1:{"hosts":host1},
group2:{"hosts":host2}
}
print(json.dumps(hostdata,indent=4))
def host(ip):
info_dict = {
"192.168.0.112": {
"ansible_ssh_host":"192.168.0.112",
"ansible_ssh_port":22,
"ansible_ssh_user":"root",
"ansible_ssh_pass":"123457"
},
"192.168.0.109": {
"ansible_ssh_host":"192.168.0.109",
"ansible_ssh_port":22,
"ansible_ssh_user":"root",
"ansible_ssh_pass":"xxxx"
}
}
# 判断key是否在字典中,在的话打印出来,不在的话打印空字典。
if ip in info_dict:
print(json.dumps(info_dict[ip],indent=4))
else:
print(json.dumps({},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)
-
单独执行的时候
image.png -
结合Ansible执行。虽然连接报错误了,但是这因为主机是随便定义的,如果是可以连接的主机则是正常工作的。
image.png
到这里,其实我们的动态inventory大体框架已经出来了,剩下的则是将代码中的硬编码变为动态获取,数据库或其它持久存储的地方获取即可。
问题
在写这段代码的时候遇到几个问题,很有意思,解决问题的过程就是让我们成长的过程...
另外报的错误实在也是有点迷惑人啊。
inventory插件问题
-
错误截图,看到因为ini的插件无法解析json数据
image.png
查看所有可用的插件列表
ansible-doc -t inventory -l
- 更改ansible的inventory可用插件。启用Ansible插件的配置在/etc/ansible/ansible.cfg文件中,具体是那个文件在起作用,执行执行
ansible --version
命令就可以看到。
image.png
修改插件的位置在。
执行格式问题
错误中还有关于执行格式错误的信息。
- 错误原因
刚开始一直报执行格式错误问题,这个问题有点荒唐,因为我安装了pyenv,python执行的路径在开头写成了
#!/Users/aihe/.pyenv/shims/python
而这个文件是sh文件,普通的可执行文本文件了,导致出错,晕掉...
- 解决方案
将开头的#!修改为python的解释器。然后就执行成功了。
#!/usr/bin/python
最后
要知道inventory的格式,inventory在ansible中可以理解为主机清单。动态的inventory可以给我们提供很多便利的操作,我们可以更灵活的控制主机了。
如果你的数据格式,在已有的inventory插件中,你也可以自己尝试开发一个,具体开发参考下面的参考部分。
参考

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
-
上一篇
网络编程基础篇
传统的BIO编程,服务器的主线程需要先阻塞,然后等待客户端的请求才去创建线程执行。一般分为两个部分,client和server。在网络良好的情况下,一般没有什么问题,但是网络不好的情况,会导致效率很低。 Server.java package bhz.bio; import java.io.IOException; import java.net.ServerSocket; import java.net.Socket; public class Server { final static int PROT = 8765; public static void main(String[] args) { ServerSocket server = null; try { server = new ServerSocket(PROT); System.out.println(" server start .. "); while(true){ //进行阻塞 Socket socket = server.accept(); //新建一个线程执行客户端的任务 new Thread(new S...
-
下一篇
单链表C++
单链表 C++ 题目 1、创建单链表2、初始化单链表3、释放单链表4、获取单链表中元素的数量5、输出单链表中的所有数据6、获取单链表中指定位置的元素7、根据键值查找指定元素8、采用头插法向单链表中插入一个元素9、采用尾插法向单链表中插入一个元素10、向单链表中的指定位置插入一个元素11、删除指定位置的元素 设计类图 文件结构 效果 store.h #pragma once // store.h 储存的结构体 #include "typeRedefinition.h" #define Node_Length 20 /*储存基本的储存结构*/ class Elemtype { private: string num; // 学号 string name; // 姓名 int age; // 年龄 string major; // 专业 int regissterYear; // 入学年份 public: int setNum(string num); string getNum(); int setName(string name); string getName(); int setAg...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- Docker安装Oracle12C,快速搭建Oracle学习环境
- CentOS7,CentOS8安装Elasticsearch6.8.6
- SpringBoot2初体验,简单认识spring boot2并且搭建基础工程
- CentOS8编译安装MySQL8.0.19
- MySQL数据库在高并发下的优化方案
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- MySQL8.0.19开启GTID主从同步CentOS8
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- CentOS7,8上快速安装Gitea,搭建Git服务器