Ansible 之动态Inventory文件(二)

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

  Ansible 动态Inventory 是经过调用外部脚本生成指定格式的json数据,这里不会限制任何语言,只要能够返回指定格式便可,下面看下咱们须要返回什么样子的格式;web

 {
        "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数据,看下映射关系json

[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程序,这里咱们把本身的数据源定义成为变量,下面咱们来看下例子ssh

#!/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

执行命令之后返回:spa

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

注意:server

  ansible -i 参数表明指定Inventory 文件,可是咱们指定文件之后还须要指定运行的服务器组或者服务器,若是须要全部的服务器都执行那么咱们这里经过all 来实现。blog

相关文章
相关标签/搜索