设为首页 收藏本站
查看: 1703|回复: 0

[经验分享] 自动化运维工具Ansible之动态inventory文件

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2015-8-12 09:21:10 | 显示全部楼层 |阅读模式
去年的时候开发了一个自动化运维的小系统,用的就是Ansible 的python API,其中动态从数据库获取主机组合主机变量的功能,着实费了老大的劲,最后用了个很鸡肋的方法实现了。最近几个月把Ansible的官方文档通看了一遍,哎,想死的心都有了,文档里面已经写的很清楚如何实现动态inventory文件了,就怪当时自己太着急,没仔细看文档。

自己开发的动态inventory脚本文件,只需要支持两个参数即可:
--list 返回所有的主机组信息,每个组都应该包含字典形式的主机列表,子组列表,如果需要的话还应该组变量,最简单的信息是只包含主机列表,返回的数据格式要是JSON格式的。
--host <hostname> 返回该主机的变量列表,或者是返回一个空的字典,JSON格式。

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
    {
        "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>访问脚本的时候,返回的数据结果,如果没有主机变量则返回一个空的字典:

1
2
3
4
5
    {
        "favcolor"   : "red",
        "ntpserver"  : "wolf.example.com",
        "monitoring" : "pack.example.com"
    }





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

1
2
3
4
5
6
7
8
9
10
11
12
13
    {
     
        # results of inventory script as above go here
        # ...
     
        "_meta" : {
           "hostvars" : {
              "moocow.example.com"     : { "asdf" : 1234 },
              "llama.example.com"      : { "asdf" : 5678 },
           }
        }
     
    }



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

动态脚本内容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
[iyunv@web1 ~]# 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内容:
1
2
3
4
5
6
7
[iyunv@web1 ~]# 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



执行命令:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[iyunv@web1 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   
     
    [iyunv@web1 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:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
[iyunv@web1 ~]# 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
    [iyunv@web1 ~]# 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>参数,并且返回的结果是文档所指定的格式,就不会出现什么问题。
好吧,就写到这了,赶紧更新自己的运维系统中的动态脚本去.......

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-97760-1-1.html 上篇帖子: 自动化运维工具Ansible之Python API 下篇帖子: CentOS5.8 升级python至2.6.6 并安装ansible 动态
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表