前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Ansible简单实践Dynamic Inventory

Ansible简单实践Dynamic Inventory

作者头像
追马
发布2020-07-02 22:10:06
1.3K0
发布2020-07-02 22:10:06
举报
文章被收录于专栏:一日一工具一日一工具

写在前面

虽然Ansible用了几年了,但是动态主机清单还真的没接触过,今天演示下如何从文件中获取ip列表相关信息,脚本很简单,主要是要理顺整个约定条件

一、整个流程

  • [ ] 从ini文件中读取ip到列表中
  • [ ] 然后组合数据返回符合规范的数据(特定的json串格式)
  • [ ] 测试是否可行

二、需要了解的约定条件

—list

当我们向脚本输入—list参数时,脚本必须将要管理的所有组以json编码的形式输出到标准输出stdout。每个组的值应该是包含每个主机/ip的列表以及定义的变量。下面给出一个简单示例

—host

当我们向脚本输入 —host参数时,脚本必须输出一个空的json字符串或一个变量的列表/字典,以便temlates和playbook可以使用。输出变量是可选的,如果脚本不希望输出,那输出一个空的列表/字典也是可以的

三、参考文档

[Ansible 开发插件之【动态主机清单】](http://www.jianshu.com/p/706c98215c02)

[代码参考地址](https://www.jeffgeerling.com/blog/creating-custom-dynamic-inventories-ansible)

[官方文档](http://docs.ansible.com/ansible/latest/intro_dynamic_inventory.html)

四、代码如下

代码语言:javascript
复制
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# Author: zhuima
# zhuima @ 2017-08-15 15:06:39
# Function: create ansible dynamic inventory from ini fileimport json
import sys
import argparse
from ConfigParser import ConfigParsertry:
   import json
except ImportError:
   import simplejson as jsonclass AnsibleInventoryFILE(object):
   def __init__(self):
       """
       Arguments:
       --list
       resp:
           {
               "group": {
                   "hosts": [
                       "192.168.28.71",
                       "192.168.28.72"
                   ],
                   "vars": {
                       "ansible_ssh_user": "zhuima",
                       "ansible_ssh_port": 22,
                       "ansible_ssh_pass": "zhuimaTestfornode",
                   }
               },
               "_meta": {
                   "hostvars": {
                       "192.168.28.72": {
                           "host_specific_var": "bar"
                       },
                       "192.168.28.71": {
                           "host_specific_var": "foo"
                       }
                   }
               }
           }       --host
       resp:
           {
               "ansible_ssh_host": "127.0.0.1",
               "_meta": {
                   "hostvars": {}
               },
               "ansible_ssh_port": 22,
               "ansible_ssh_pass": "zhuimaTestfornode",
               "ansible_ssh_user": "zhuima"
           }
       """       # Tempfile for store iplist
       self.ipfile = "/tmp/hosts.man"
       self.host_list = []       # Parse arguments passed at cli
       self.parse_arguments()       # Init process
       self.ip_from_file()       #print self.args.host       if self.args.list:
           self.inventory = self.group_info()       # Called with `--host [hostname]`.
       elif self.args.host:
           # Not implemented, since we return _meta info `--list`.
           self.inventory = self.host_info()
       # If no groups or vars are present, return an empty inventory.
       else:
           self.inventory = self.host_info()       print json.dumps(self.inventory, indent=4)   def ip_from_file(self):
       """get iplist from ini file create by shell"""
       config = ConfigParser(allow_no_value=True)
       config.read(self.ipfile)
       secs = config.sections()
       for sec in secs:
           self.host_list.extend(config.options(sec))   def group_info(self):
       """resp for --list or -l"""
       return {
           'hlists': {
               'hosts': self.host_list,
               'vars': {
                   "ansible_ssh_port": 22,
                   "ansible_ssh_pass": "zhuimaTestfornode",
                   "ansible_ssh_user": "zhuima"
               },
           },
           '_meta': {
               'hostvars': {
               },
           },
       }   def host_info(self):
       """resp for --host or -h"""
       return {'_meta': {'hostvars': {}}}   def parse_arguments(self):
       """CLI interface"""
       parser = argparse.ArgumentParser(description='Populate ansible inventory from Tempfiles.')
       args_hostlist = parser.add_mutually_exclusive_group()
       args_hostlist.add_argument('--list', help='List all nodes from Tempfile.', action="store_true")
       args_hostlist.add_argument('--host', help='Not implemented.', action="store")
       self.args = parser.parse_args()if __name__ == '__main__':
   # Instantiate the inventory object
   AnsibleInventoryFILE()

五、测试结果

脚本输出

代码语言:javascript
复制
[root@zhuima ansible_inventory]# python /var/www/dynamic_inventory.py --list

{    "hlists": {        
        "hosts": [
            "192.168.100.200",            
            "192.168.100.180"
       ],        
        "vars": {            
            "ansible_ssh_port": 22,            
            "ansible_ssh_pass": "zhuimaTestfornode",            
            "ansible_ssh_user": "zhuima"
       }
   },    
    "_meta": {        
        "hostvars": {}
   }
}
[root@zhuima ansible_inventory]#

Ad-Hoc测试

代码语言:javascript
复制
[root@zhuima ansible_inventory]# ansible -i /var/www/dynamic_inventory.py hlists -mping

192.168.100.180 | SUCCESS => {    "changed": false,    "ping": "pong"}
192.168.100.200 | SUCCESS => {    "changed": false,    "ping": "pong"}
[root@zhuima ansible_inventory]#

Playbook测试

代码语言:javascript
复制
[root@zhuima ansible_inventory]# ap -i /var/www/dynamic_inventory.py /var/www/iplist.yml

PLAY [hlists] ******************************************************************TASK [ls /tmp] *****************************************************************
changed: [192.168.100.180]
changed: [192.168.100.200]PLAY RECAP *********************************************************************
192.168.100.180              : ok=1    changed=1    unreachable=0    failed=0

192.168.100.200              : ok=1    changed=1    unreachable=0    failed=0

[root@zhuima ansible_inventory]#
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2017-11-04,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 链上追马 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 写在前面
  • 一、整个流程
  • 二、需要了解的约定条件
  • 三、参考文档
  • 四、代码如下
  • 五、测试结果
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档