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 相关文章推荐
在 Django/Flask 开发服务器上使用 HTTPS
Jul 03 Python
基于Django模板中的数字自增(详解)
Sep 05 Python
Android分包MultiDex策略详解
Oct 30 Python
Python 字符串转换为整形和浮点类型的方法
Jul 17 Python
win7+Python3.5下scrapy的安装方法
Jul 31 Python
Python中正则表达式的用法总结
Feb 22 Python
python使用tkinter库实现五子棋游戏
Jun 18 Python
计算pytorch标准化(Normalize)所需要数据集的均值和方差实例
Jan 15 Python
Python 批量读取文件中指定字符的实现
Mar 06 Python
python调用API接口实现登陆短信验证
May 10 Python
Python读取xlsx数据生成图标代码实例
Aug 12 Python
Python获取指定日期是"星期几"的6种方法
Mar 13 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
中国的第一台收音机
2021/03/01 无线电
要会喝咖啡也要会知道咖啡豆
2021/03/03 咖啡文化
收藏的一个php小偷的核心程序
2007/04/09 PHP
完美解决phpexcel导出到xls文件出现乱码的问题
2016/10/29 PHP
利用php实现一周之内自动登录存储机制(cookie、session、localStorage)
2016/10/31 PHP
ThinkPHP中获取指定日期后工作日的具体日期方法
2018/10/14 PHP
Laravel 手动开关 Eloquent 修改器的操作方法
2019/12/30 PHP
JavaScript原生对象之Date对象的属性和方法详解
2015/03/13 Javascript
jQuery时间轴插件使用详解
2015/07/16 Javascript
jQuery ajax全局函数处理session过期后的ajax跳转问题
2016/06/03 Javascript
Nodejs下DNS缓存问题浅析
2016/11/16 NodeJs
原生JS实现幻灯片
2017/02/22 Javascript
jQuery插件zTree实现获取当前选中节点在同级节点中序号的方法
2017/03/08 Javascript
Vue2.0实现将页面中表格数据导出excel的实例
2017/08/09 Javascript
简单谈谈vue的过渡动画(推荐)
2017/10/11 Javascript
vue 全选与反选的实现方法(无Bug 新手看过来)
2018/02/09 Javascript
Vue2.x通用编辑组件的封装及应用详解
2019/05/28 Javascript
Vue.js数字输入框组件使用方法详解
2019/10/19 Javascript
如何使用 vue-cli 创建模板项目
2020/11/19 Vue.js
js实现简单的轮播图效果
2020/12/13 Javascript
[00:55]深扒TI7聊天轮盘语音出处3
2017/05/11 DOTA
PYTHON压平嵌套列表的简单实现
2016/06/08 Python
常见的python正则用法实例讲解
2016/06/21 Python
Django查询数据库的性能优化示例代码
2017/09/24 Python
Python3 利用requests 库进行post携带账号密码请求数据的方法
2018/10/26 Python
PyQt QCombobox设置行高的方法
2019/06/20 Python
python numpy生成等差数列、等比数列的实例
2020/02/25 Python
俄罗斯购买剧院和演唱会门票网站:Parter.ru
2019/11/09 全球购物
绿色环保家庭事迹材料
2014/08/31 职场文书
2016年12月份红领巾广播稿
2015/12/21 职场文书
2019年干货:自我鉴定
2019/03/25 职场文书
仅用一句SQL更新整张表的涨跌幅、涨跌率的解决方案
2021/05/06 MySQL
python 学习GCN图卷积神经网络
2022/05/11 Python
SQL Server中T-SQL标识符介绍与无排序生成序号的方法
2022/05/25 SQL Server
vue中data里面的数据相互使用方式
2022/06/05 Vue.js
SpringBoot接入钉钉自定义机器人预警通知
2022/07/15 Java/Android