Ansible简单实践Dynamic Inventory

Posted 追马Linux

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Ansible简单实践Dynamic Inventory相关的知识,希望对你有一定的参考价值。

写在前面

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

一、整个流程

  • [ ] 从ini文件中读取ip到列表中

  • [ ] 然后组合数据返回符合规范的数据(特定的json串格式)

  • [ ] 测试是否可行

二、需要了解的约定条件

—list

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

—host

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

三、参考文档

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

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

四、代码如下

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# Author: zhuima
# zhuima @ 2017-08-15 15:06:39
# Function: create ansible dynamic inventory from ini file

import json
import sys
import argparse
from ConfigParser import ConfigParser

try:
    import json
except ImportError:
    import simplejson as json

class 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()

五、测试结果

脚本输出

[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测试

[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测试

[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]#

以上是关于Ansible简单实践Dynamic Inventory的主要内容,如果未能解决你的问题,请参考以下文章

Linux系统之Ansible的基本介绍

ansible playbook实践-基础相关命令

Ansible自动化工具的实践

Ansible最佳实践之 AWX 使用 Ansible 与 API 通信

Ansible最佳实践之 AWX 使用 Ansible 与 API 通信

2022亚马逊云科技re:Invent,行业亮点抢先看