自动化运维工具Ansible之动态inventory文件

去年的时候开发了一个自动化运维的小系统,用的就是Ansible 的python API,其中动态从数据库获取主机组合主机变量的功能,着实费了老大的劲,最后用了个很鸡肋的方法实现了。最近几个月把Ansible的官方文档通看了一遍,哎,想死的心都有了,文档里面已经写的很清楚如何实现动态inventory文件了,就怪当时自己太着急,没仔细看文档。

自己开发的动态inventory脚本文件,只需要支持两个参数即可:

--list 返回所有的主机组信息,每个组都应该包含字典形式的主机列表,子组列表,如果需要的话还应该组变量,最简单的信息是只包含主机列表,返回的数据格式要是JSON格式的。

--host <hostname> 返回该主机的变量列表,或者是返回一个空的字典,JSON格式。

参数--list访问脚本的时候,返回数据结果:

    {
        "databases"   : {
            "hosts"   : [ "host1.example.com", "host2.example.com" ],
            "vars"    : {
                "a"   : true
            }
        },
        "webservers"  : [ "host2.example.com", "host3.example.com" ],
        "atlanta"     : {
            "hosts"   : [ "host1.example.com", "host4.example.com", "host5.example.com" ],
            "vars"    : {
                "b"   : false
            },
            "children": [ "marietta", "5points" ]
        },
        "marietta"    : [ "host6.example.com" ],
        "5points"     : [ "host7.example.com" ]
    }

databses,webservers,atlanta,marietta,5points为主机组名称,hosts为该主机组下的主机列表,vars为主机组的变量,children为该主机组的子组列表。

参数--host <hostname>访问脚本的时候,返回的数据结果,如果没有主机变量则返回一个空的字典:

    {
        "favcolor"   : "red",
        "ntpserver"  : "wolf.example.com",
        "monitoring" : "pack.example.com"
    }

但是如果针对每个主机都调用一次`--host`的话,将会产生大量的资源开销。在Ansible1.3或之后的版本中,如果脚本返回了一个称为`_meta`的顶级元素,该元素中如果包含着`hostvars`关键字,那么就可以将所有主机的变量都返回。脚本也不会再为每个主机都调用一次`--host`,这讲节省大量的资源开销,同时也方便的客户端的缓存。
返回的`_meta`类似如下格式:

    {
    
        # results of inventory script as above go here
        # ...
    
        "_meta" : {
           "hostvars" : {
              "moocow.example.com"     : { "asdf" : 1234 },
              "llama.example.com"      : { "asdf" : 5678 },
           }
        }
    
    }

所返回的变量可以在模板中引用。

示例:

动态脚本内容

[[email protected] ~]# cat /etc/ansible/getHosts.py 
    #!/usr/bin/python
    import argparse
    try:
        import json
    except ImportError:
        import simplejson as json
    
    ‘‘‘这里是模拟数据,工作上一般该数据都是从数据库或者缓存中读取的‘‘‘
    mockData = {
        "webservers":{
            "hosts": ["192.168.1.65"],
            "vars":{
                "http_port":8888,
                "max_clients":789
            }
        },
    
        "databases":{
            "hosts":["192.168.1.65"],
            "vars":{
                "action":"Restart MySQL server."
            }
        }
    }
    ‘‘‘模拟数据结束‘‘‘
    def getList():
        ‘‘‘get list hosts group‘‘‘
        print json.dumps(mockData)
    
    
    def getVars(host):
        ‘‘‘Get variables about a specific host‘‘‘
        print json.dumps(mockData[host]["vars"])
    
    
    if __name__ == "__main__":
    
        parser = argparse.ArgumentParser()
        parser.add_argument(‘--list‘,action=‘store_true‘,dest=‘list‘,help=‘get all hosts‘)
        parser.add_argument(‘--host‘,action=‘store‘,dest=‘host‘,help=‘get all hosts‘)
        args = parser.parse_args()
    
        if args.list:
            getList()
    
        if args.host:
            getVars(args.host)

该脚本支持两个参数--list和--host。

playbook内容:

[[email protected] ~]# cat /etc/ansible/test.yml 
    ---
    - hosts: webservers
      remote_user: root
      tasks:
        - name: config httpd.file
          template: src=/etc/ansible/httpd.j2 dest=/etc/httpd.conf

执行命令:

[[email protected] ansible]# ansible-playbook -i /etc/ansible/getHosts.py /etc/ansible/test.yml
    
    PLAY [webservers] ************************************************************* 
    
    GATHERING FACTS *************************************************************** 
    ok: [192.168.1.65]
    
    TASK: [config httpd.file] ***************************************************** 
    changed: [192.168.1.65]
    
    PLAY RECAP ******************************************************************** 
    192.168.1.65               : ok=2    changed=1    unreachable=0    failed=0   
    
    [[email protected] ansible]# ansible -i /etc/ansible/getHosts.py databases -m shell -a "echo {{ action }}"192.168.1.65 | success | rc=0 >>
    Restart MySQL server.

Python API调用动态inventory:

[[email protected] ~]# cat an.py 
    #!/usr/bin/env python
    
    import ansible.runner
    
    runner = ansible.runner.Runner(
        module_name=‘shell‘,
        module_args=‘echo {{ action }}‘,
        pattern=‘databases‘,
        host_list=‘/etc/ansible/getHosts.py‘,
        forks=10
    )
    
    data = runner.run()
    print data
    [[email protected] ~]# python an.py 
    {‘dark‘: {}, ‘contacted‘: {u‘192.168.1.65‘: {u‘cmd‘: u‘echo Restart MySQL server.‘, u‘end‘: u‘2015-08-07 15:26:02.141350‘, u‘stdout‘: u‘Restart MySQL server.‘, u‘changed‘: True, u‘start‘: u‘2015-08-07 15:26:02.128109‘, u‘delta‘: u‘0:00:00.013241‘, u‘stderr‘: u‘‘, u‘rc‘: 0, ‘invocation‘: {‘module_name‘: ‘shell‘, ‘module_args‘: u‘echo Restart MySQL server.‘}, u‘warnings‘: []}}}

总的来说,只要脚本文件支持--list和--host <hostname>参数,并且返回的结果是文档所指定的格式,就不会出现什么问题。

好吧,就写到这了,赶紧更新自己的运维系统中的动态脚本去.......

时间: 2024-08-08 12:59:29

自动化运维工具Ansible之动态inventory文件的相关文章

3.1 自动化运维工具ansible

自动化运维工具ansible 运维自动化发展历程及技术应用 Iaas 基础设施即服务Pass 平台服务SaaS 软件即服务 云计算工程师核心职能 Linux运维工程师职能划分 自动化动维应用场景 文件传输命令执行 应用部署配置管理任务流编排 企业实际应用场景分析 1 Dev开发环境 使用者:程序员功能:程序员开发软件,测试BUG的环境管理者:程序员123 2 测试环境 使用者:QA测试工程师功能:测试经过Dev环境测试通过的软件的功能管理者:运维说明:测试环境往往有多套,测试环境满足测试功能即可

自动化运维工具Ansible详细部署 (转载)

自动化运维工具Ansible详细部署 标签:ansible 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://sofar.blog.51cto.com/353572/1579894 ========================================================================================== 一.基础介绍 ===========================

自动化运维工具——ansible详解案例分享

自动化运维工具--ansible详解案例分享(一)目录ansible 简介ansible 是什么?ansible 特点ansible 架构图ansible 任务执行ansible 任务执行模式ansible 执行流程ansible 命令执行过程ansible 配置详解ansible 安装方式使用 pip(python的包管理模块)安装使用 yum 安装ansible 程序结构ansible配置文件查找顺序ansible配置文件ansuble主机清单ansible 常用命令ansible 命令集a

自动化运维工具-Ansible基础

目录 自动化运维工具-Ansible基础 自动化运维的含义 Ansible 基础及安装 Ansible的架构 Ansible的执行流程 ansible配置文件 ansible Inventory(主机清单文件) Ansible ad-hoc ansible常用模块 实战 自动化运维工具-Ansible基础 自动化运维的含义 1.手动运维时代 2.自动化运维时代 3.自动化运维工具给运维带来的好处 Ansible 基础及安装 1.什么是Ansible Ansible是一个自动化统一配置管理工具 2

自动化运维工具ansible的基本应用

在很多场景中我们都需要在多个主机上执行相同的命令或者是做相同的配置工作,此时,为了简化操作,我们可以借助一些自动化的工具来完成我们的需求,这种工具我们称之为自动化运维工具.ansible就是其中之一,下面我们就来用ansible来实现一些简单操作. 下面是ansible可以实现很多工具的功能,框架图如下所示:ansible不能实现操作系统的安装 ansible作者就是早期puppet和func的维护者之一,因为ansible充分吸取了puppet和func的优势,又力图避免他们的劣势. OS P

自动化运维工具ansible——安装及模块管理

ansible简介 ?ansible是新出现的自动化运维工具,基于Python开发,集合了众多运维工具(puppet.cfengine.chef.func.fabric)的优点,实现了批量系统配置.批量程序部署.批量运行命令等功能. ?ansible是基于模块工作的,本身没有批量部署的能力.真正具有批量部署的是ansible所运行的模块,ansible只是提供一种框架.主要包括:(1).连接插件connection plugins:负责和被监控端实现通信:(2).host inventory:指

自动化运维工具Ansible详细部署

原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://sofar.blog.51cto.com/353572/1579894 ========================================================================================== 一.基础介绍 =========================================================

自动化运维工具Ansible实战(一)安装部署

1,基本介绍 ansible是新出现的自动化运维工具,基于Python开发,集合了众多运维工具(puppet.cfengine.chef.func.fabric)的优点,实现了批量系统配置.批量程序部署.批量运行命令等功能. ansible是基于模块工作的,本身没有批量部署的能力.真正具有批量部署的是ansible所运行的模块,ansible只是提供一种框架.主要包括: (1).连接插件connection plugins:负责和被监控端实现通信: (2).host inventory:指定操作

自动化运维工具Ansible架构部署应用及playbooks简单应用

在日常服务器运维中,我们经常要配置相同的服务器配置,前期我们都是一台一台的去配置,这种方法操作主要应对于服务器数量不多且配置简单的情况还可以继续这样操作,如果我们后期维护几百服务器或者几万服务器呢? 我应该怎样去快速配置服务器呢?如果需要手动的每台服务器进行安装配置将会给运维人员带来许多繁琐而又重复的工作同时也增加服务器配置的异常,至此自动化运维工具解决我们的瓶颈---Ansible工具. Ansible是新出现的自动化运维工具,基于Python开发,集合了众多运维工具(puppet.cfeng