zoukankan      html  css  js  c++  java
  • Ansible 之动态Inventory文件(二)

      上篇主要讲解了Ansible 的安装和配置,并且根据不同的业务场景将服务器的信息存放在Ansible的Inventory中,其实存放这样的数据每次更新都需要我们自动的添加和删除,这样对于我们维护起来很不方便,而Ansible 提供了支持动态的从外部获取主机列表和主机组数据;一般情况动态获取主机信息都会结合CMDB、Zabbix、Cpbbler、云主机管理平台(如AWS、阿里云)在一起使用;

      Ansible 动态Inventory 是通过调用外部脚本生成指定格式的json数据,这里不会限制任何语言,只要可以返回指定格式即可,下面看下我们需要返回什么样子的格式;

     {
            "webserver":  # 定义webserver组
                {
                "hosts": ["39.105.0.244"],  # webserver 组内主机
                "vars": {  # 参数
                    "ansible_ssh_pass": "123456",  # Inventory 内置变量
                    "ansible_port": "61821"
                    }
                },
            "dbserver":
                {
                "hosts": ["47.104.149.180"],
                "vars": {
                    "ansible_ssh_pass": "123456",
                    "ansible_port": "61821"
                        }
                }
            }

      切记上面的hosts,vars还有children这些变量是固定的,我们不能在返回的json格式里面随意的定义,如果定义成为其他的这里就会出现报错,下面我们把上面的json数据转换为静态的Inventory数据,看下映射关系

    [webserver]
        39.105.0.244
    
    [dbserver]
        47.104.149.180
    
    [webserver:vars]
        ansible_ssh_pass: "123456",
         ansible_port: "61821"
    
    [dbserver:vars]
         ansible_ssh_pass: "123456",
         ansible_port: "61821"

      通过映射关系我们可以把对/etc/ansible/hosts 数据 和动态获取Inventory数据的对比下,动态的只是通过其他的地方获取数据组合成为Ansible Inventory 可识别的数据而已;

    下面我们通过python语言来实现一个demo程序,这里我们把自己的数据源定义成为变量,下面我们来看下例子

    #!/usr/bin/env python
    # -*- coding:utf-8 -*-
    import json
    
    
    def inventory_groups():
        groups = 
            {
            "webserver":  # 定义webserver组
                {
                "hosts": ["39.105.0.244"],  # webserver 组内主机
                "vars": {  # 参数
                    "ansible_ssh_pass": "123456",  # Inventory 内置变量
                    "ansible_port": "61821"
                    }
                },
            "dbserver":
                {
                "hosts": ["47.104.149.180"],
                "vars": {
                    "ansible_ssh_pass": "123456",
                    "ansible_port": "61821"
                        }
                }
            }
    
        return json.dumps(groups, indent=4)
    
    
    if __name__ == '__main__':
        print(inventory_groups())

    我们在Ansible 运行下我们写好的脚本,首先我们指定webserver 执行ping操作

        ansible -i inventory.py webserver -m ping

    执行命令以后返回:

    这里返回的结果集与我们在/etc/ansible/hosts配置服务器组返回结果一致,其实动态只是让你更加便利的维护服务器组数据。

    注意:

      ansible -i 参数代表指定Inventory 文件,但是我们指定文件以后还需要指定运行的服务器组或者服务器,如果需要所有的服务器都执行那么我们这里通过all 来实现。

  • 相关阅读:
    最大堆的实现
    更新Android SDK Manager Mac下修改hosts
    快速排序
    含有通配符的字符串匹配(递归)
    geopandas安装问题记录:ImportError,DLL load failedwindows10
    silveright 5.0 搜索代码生成系统
    Insert xml to DB Column
    Enter/Esc Hot Key Silverlight
    Silverlight 页面保存为html出现乱码的问题
    Use dynamic SQL to fix openrowset parameter and Insert xml files into database under given folder
  • 原文地址:https://www.cnblogs.com/mengyu/p/8922053.html
Copyright © 2011-2022 走看看