ansible动态Inventory主机清单配置遇到的坑


Posted in Python onJanuary 19, 2020

坑1 : 动态主机清单配置,需要按照ansible的要求的格式返回给ansible命令的

源代码如下:

但是在ansible-playbook中使用动态主机配置文件的时候,发生了错误!!!

ansible动态Inventory主机清单配置遇到的坑

提示没有匹配的主机信息

分析: 数据库已配置好,python脚本也能输出,问题在于输出的结果不是ansible想要的格式作为ansible的命令输入,因此排查如下

下面看下我的动态inventory输出的格式吧

[root@ansible fang]# python ansible_inventory.py --list
{
  "all": [
    "192.168.10.104"
  ]
}
[root@ansible fang]# python ansible_inventory.py --host 192.168.10.104
{
  "ansible_ssh_host": "192.168.10.104",
  "ansible_ssh_user": "root",
  "hostname": "clone-node1"
}

在网上找的方法,虽然实现了—list  --host的输出,但是格式不满足ansible格式输出的要求,ansible需求的格式有哪些呢,请看解决办法中….

输出结果:

这是出错的信息,提示还是找不到主机的信息

[root@ansible fang]#
ansible-playbook -i ansible_inventory.py bb.yml运行出错

解决方法:

先说个知识点(ansible所要求的格式):

动态 Inventory 指通过外部脚本获取主机列表,并按照 ansible 所要求的格式返回给 ansilbe 命令的

因此,需要清楚ansible需要那种inventory的格式呢

必须输出为 JSON 格式

同时必须支持两个参数:--list 和 --host <hostname>。

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

正确的输出格式是什么样子的呢,请看下面:

以下的是正确的动态inventory的输出格式,其中就是ansible的第三点要求 每个组所包含的主机列表 hosts、所含子组列表 children、主机组变量列表 vars 都应该是字典形式的,_meta 用来存放主机变量。

[root@ansible fang]# vim tt.py
[root@ansible fang]# python tt.py
{
  "group1": {
    "hosts": [
      "192.168.10.104"
    ]
  },
  "group2": {
    "hosts": [
      "192.168.10.103",
      "192.168.13.5"
    ],
    "vars": {
      "ansible_ssh_port": 22,
      "ansible_connection": "ssh"
    }
  }
}
[root@ansible fang]#

按照以上的格式,来编写我们的输出吧,

SQL表格内容如下:

ansible动态Inventory主机清单配置遇到的坑

我想要输出的json格式是这样的

{组名:{
hosts:[‘ip1','ip2'],
vars:{
  “ansible_ssh_port”:22,
“ansilble_connection”:'ssh'
……….
}
}
}

脚本代码列出来了如下:

#_*_coding:utf-8_*_
__author__ = 'fang'
import pymysql
import json
import argparse
import sys
def execude_sql(table): #定义一个执行SQL的函数
  sql = 'select * from {0};'.format(table)
  cur.execute(sql) #args即要传入SQL的参数
  sys_result = cur.fetchall()
  #index = cur.description
  hostlist = {}#放入主机清单的信息
  for i in sys_result:
    hostlist[i[2]] = []
  for i in sys_result:
    hostlist[i[2]].append([i[1], i[5], i[6]])
  host_lists = dict()
  for i in hostlist.iteritems():
    dict_item = dict()
    for index in i[1]:
      dict_item[index[0]] = {'ansible_connection': index[1], 'ansible_ssh_port': index[2]}
    host_lists[i[0]] = dict_item
  # print json.dumps(host_lists, indent=4)
return host_lists
def group(data):
  '''
  all hostip
  :param data:
  :return:
  '''
  count_ip = dict()
  count_ip['all'] = {}
  count_ip['all']['hosts'] = []
  index = []
  for i in data:
    index.extend(data[i].keys())
  count_ip['all']['hosts'].extend(list(set(index)))
  print json.dumps(count_ip, indent=4)
def host(data, ip):
  dict_host = {}
  for i in data:
    if data[i].keys() == [ip]:
      dict_host[i] = {}
      dict_host[i]['hosts'] = [ip]
      dict_host[i]['vars'] = data[i][ip]
      print json.dumps(dict_host, indent=4)
      break
if __name__ == "__main__":
  global file, con, cur #文件对象,连接和游标对象
  #连接数据库
  con = pymysql.connect('127.0.0.1', 'root', '', 'ansible', charset='utf8') # 连接数据库
  cur = con.cursor() # 定义一个游标 
  data = execude_sql('hosts_table')
# parser = argparse.ArgumentParser()#定义参数解析器
#获取参数的方法1:
#以下是参数解析器添加参数格式,有—list和—host dest表示都可以通过args.list或者args.host来获取到可变参数的值,action中store_true表存储的是布尔值,当没有—list的时候默认false,当有—list的时候,但是没有值,默认则为true,help表示帮助时候提示的信息,argparse很好用,在这里恰当好处
  # parser.add_argument('--list',action='store_true',dest='list',help='get all hosts')
  # parser.add_argument('--host',action='store',dest='host',help='get sigle host')
  # args = parser.parse_args()
  # if args.list:
  #   group(data)
  # if args.host:
  #   host(data, args.host)
#获取参数的方法2:
   if len(sys.argv) == 2 and (sys.argv[1] == '--list'):
      group(data)
   elif len(sys.argv) == 3 and (sys.argv[1] == '--host'):
       host(data, sys.argv[2])
   else:
     print "Usage %s --list or --host <hostname>"% sys.argv[0]
     sys.exit(1)

坑 2: 动态inventory脚本要制定python的解释器,否则无法执行

问题分析:

Ansible-playbook ?I ansbile_inventory.py bb.yml执行

提示:无法识别host,还是出现了问题

对比ansible要求的格式,没有差别,最后进行代码的比对,问题出现在脚本没有制定Python解释器,导致出现的问题

解决办法:

添加python解释器的路径

ansible动态Inventory主机清单配置遇到的坑

执行结果:

Yml文件

ansible动态Inventory主机清单配置遇到的坑

命令执行结果:

[root@ansible fang]# ansible-playbook -i ansible_inventory.py bb.yml
PLAY [192.168.10.104] *********************************************************************
TASK [debug] *********************************************************************
ok: [192.168.10.104] => {
  "msg": "this is test block"
}
TASK [file] *********************************************************************
ok: [192.168.10.104]
TASK [debug] *********************************************************************
ok: [192.168.10.104] => {
  "msg": "this is always"
}
PLAY RECAP *********************************************************************
192.168.10.104       : ok=3  changed=0  unreachable=0  failed=0 
[root@ansible fang]# python ansible_inventory.py --host 192.168.10.104
{
  "xiaoming": {
    "hosts": [
      "192.168.10.104"
    ],
    "vars": {
      "ansible_ssh_port": 22,
      "ansible_connection": "ssh"
    }
  }
}

另外注意点:  --list    --host 正是通过yml中的hosts指定的内容,即为脚本中命令行的参数的内容

 总结

以上所述是小编给大家介绍的ansible动态Inventory主机清单配置遇到的坑,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

Python 相关文章推荐
Python time模块详解(常用函数实例讲解,非常好)
Apr 24 Python
详细讲解Python中的文件I/O操作
May 24 Python
Python搭建APNS苹果推送通知推送服务的相关模块使用指南
Jun 02 Python
Python获取时间范围内日期列表和周列表的函数
Aug 05 Python
Pytorch反向求导更新网络参数的方法
Aug 17 Python
python实现静态服务器
Sep 05 Python
Pytorch使用MNIST数据集实现CGAN和生成指定的数字方式
Jan 10 Python
Python tkinter模版代码实例
Feb 05 Python
python实现随机加减法生成器
Feb 24 Python
Selenium及python实现滚动操作多种方法
Jul 21 Python
Python异常处理机制结构实例解析
Jul 23 Python
使用python将HTML转换为PDF pdfkit包(wkhtmltopdf) 的使用方法
Apr 21 Python
python实现五子棋游戏(pygame版)
Jan 19 #Python
Python turtle画图库&amp;&amp;画姓名实例
Jan 19 #Python
python3连接mysql获取ansible动态inventory脚本
Jan 19 #Python
基于Pycharm加载多个项目过程图解
Jan 19 #Python
使用Python脚本从文件读取数据代码实例
Jan 19 #Python
Python安装tar.gz格式文件方法详解
Jan 19 #Python
Python : turtle色彩控制实例详解
Jan 19 #Python
You might like
php统计数组元素个数的方法
2015/07/02 PHP
php实现数组中索引关联数据转换成json对象的方法
2015/07/08 PHP
三个思路解决laravel上传文件报错:413 Request Entity Too Large问题
2017/11/13 PHP
Laravel框架运行出错提示RuntimeException No application encryption key has been specified.解决方法
2019/04/02 PHP
javascript 命名规则 变量命名规则
2010/02/25 Javascript
JS解析XML实例分析
2015/01/30 Javascript
JavaScript获取按钮所在form表单id的方法
2015/04/02 Javascript
延时加载JavaScript代码提高速度
2015/12/27 Javascript
Bootstrap框架的学习教程详解(二)
2016/10/18 Javascript
jQuery Form表单取值的方法
2017/01/11 Javascript
js模态对话框使用方法详解
2017/02/16 Javascript
Vue.js在使用中的一些注意知识点
2017/04/29 Javascript
用户管理的设计_jquery的ajax实现二级联动效果
2017/07/13 jQuery
JS实现利用两个队列表示一个栈的方法
2017/12/13 Javascript
AngularJS实现的自定义过滤器简单示例
2019/02/02 Javascript
vue treeselect获取当前选中项的label实例
2020/08/31 Javascript
[03:49]DOTA2英雄基础教程 光之守卫
2014/01/14 DOTA
Python中如何获取类属性的列表
2016/12/26 Python
解决Spyder中图片显示太小的问题
2018/04/27 Python
python 获取url中的参数列表实例
2018/12/18 Python
python networkx 根据图的权重画图实现
2019/07/10 Python
对YOLOv3模型调用时候的python接口详解
2019/08/26 Python
150行Python代码实现带界面的数独游戏
2020/04/04 Python
python删除某个目录文件夹的方法
2020/05/26 Python
美国畅销的跑步机品牌:ProForm
2017/02/06 全球购物
时尚圣经:The Fashion Bible
2019/03/03 全球购物
C语言中一个结构不能包含指向自己的指针吗
2012/05/25 面试题
三年级数学教学反思
2014/01/31 职场文书
中学学校门卫岗位职责
2014/08/15 职场文书
副乡长群众路线教育实践活动个人对照检查材料
2014/09/19 职场文书
云冈石窟导游词
2015/02/04 职场文书
家长会感言
2015/08/01 职场文书
党风廉政教育心得体会2016
2016/01/22 职场文书
Java Lambda表达式常用的函数式接口
2022/04/07 Java/Android
《杜鹃的婚约》OP主题曲「凸凹」无字幕影像公开
2022/04/08 日漫
使用pd.merge表连接出现多余行的问题解决
2022/06/16 Python