细说Ansible主机清单inventory

Ansible是一个系列文章,我会尽可能以通俗易懂、诙谐幽默的总结方式给你们呈现这些枯燥的知识点,让学习变的有趣一些。python

前言

关于Ansible是什么,我在以前的文章中没有说;固然了,我这里也不会说。当你看到我写的这篇文章时,我想你已经知道了Ansible是什么了,若是您还不知道什么是Ansible是什么,那个人建议是先去百度一下,知道了Ansible是什么了,知道了Ansible能干什么了之后,再回过头来继续阅读我这里的总结。mysql

在Ansible中,有两个很是重要的概念,就是管理主机和被管理远程主机。web

  • 管理主机:就是管理远程主机的主机;说简单点,就是安装Ansible整套软件的主机;全部的Ansible管理命令都是从这台管理主机发出的,经过这台管理主机,从而实现对其它远程主机的管理;
  • 被管理远程主机:顾名思义,就是执行具体动做的主机;Ansible管理主机下达的命令,最终都要到被管理远程主机上去落地执行。

上面也说了,管理主机就是安装Ansible的主机,那被管理远程主机的信息又在哪里配置呢?下面就细说这个被管理远程主机在Ansible中的全套配置和流程。sql

inventory简介

inventory,也就是主机清单。在大规模的配置管理工做中,特别是云服务提供商或者IDC厂家,须要管理不一样业务的不一样机器,这些机器的信息都存放在Ansible的inventory组件里面。在咱们使用Ansible进行远程主机管理时,必须先将主机信息存放在inventory里面,这样才能使用Ansible对它进行操做。默认状况下,Ansible的inventory是一个静态的INI格式的文件,在上一篇《Ansible配置文件ansible.cfg详解》中说到了defaults配置中的inventory选项,这个inventory选项就是配置inventory文件的地方。固然了,咱们还能够经过ANSIBLE_HOSTS环境变量指定或者运行ansible和ansible-playbook的时候用-i参数临时设置。shell

定义主机和主机组

先来看个我在测试环境使用的inventory文件内容。数据库

192.168.1.2
192.168.1.4

[web]
192.168.1.2
192.168.1.4

[mysql-db]
192.168.1.5
192.168.1.6

[east:children]
web
mysql-db

上述就是个人一个简单配置,未来你在生产环境配置inventory的话,大抵上也就是这个样子。下面咱们分别细说一下上面的这个inventory配置文件。编程

  • 前两行咱们定义了两个单独的主机,对于单个主机,咱们能够针对单个主机进行配置,包括变量等;
  • [web][mysql-db]是咱们定义的两个主机组;咱们能够根据业务、地理位置等因素,对主机进行按组划分,这样方便统一批量管理;
  • [east:children]是咱们定义的一个包含其它组的组;分组是支持嵌套的,这样就更加方便了分组的管理。

定义了主机或主机组之后,咱们就能够直接在命令中使用这些主机或主机组,好比这样:json

ansible 192.168.1.2 -m ping
ansible web -m ping
ansible east -m ping

定义inventory列表

默认状况下,Ansible的inventory文件是一个INI的静态文件,其实Ansible还支持多个inventory文件,这样咱们就能够很是方便的管理不一样业务或者不一样环境的机器了。segmentfault

要定义inventory列表,咱们先新建一个存放inventory文件的文件夹,而后将ansible.cfg配置文件中inventory的值修改成这个新建的文件夹的路径。好比我在测试环境新建了一个名为inventory文件夹来存放inventory配置文件。微信

使用tree /home/jelly/ansible/inventory命令输出结果以下:

/home/jelly/ansible/inventory/
|---web
|---db

在这里,我分别定义了两个inventory配置文件,其中web文件中的内容以下:

[web]
192.168.1.2
192.168.1.4

其中db文件中的内容以下:

[mysql-db]
192.168.1.5
192.168.1.6

接下来,咱们就能够正常使用这些inventory中的主机配置信息了,好比能够用如下命令来看看分组下的主机进行配置验证:

ansible mysql-db --list-hosts

之后咱们就可使用这种方式来搞定inventory的配置了,固然了,对于管理主机少,配置简单的环境,使用这种方式彻底是没有问题的。可是对于上千台、上万台的主机,很显然这种方式就大大不方便了,太落后了。对于这种上千台、上万台的主机的环境,咱们就须要动态的从CMDB中拉去主机配置信息了,此时就要说到下面的动态inventory了。

动态inventory

上面也说到了,对于那些云服务提供商或者IDC厂家会有大量的主机列表;若是手动维护这些列表将是一个很是繁琐的事情。其实Ansible是支持动态的inventory的,动态inventory就是Ansible全部的inventory文件里面的主机列表和变量信息都是从外部拉取的。好比咱们能够从CMDB系统和Zabbix监控系统拉取全部的主机信息,而后使用Ansible进行管理。这样一来咱们就能够很方便的将Ansible与其它运维系统结合起来。关于引用动态inventory的功能配置起来是很是简单的;咱们只须要把ansible.cfg文件中inventory的定义值改为一个执行脚本便可。这个脚本的内容不受任何编程语言限制,可是这个脚本使用参数时有必定的规范而且对脚本执行的结果也有要求。这个脚本须要支持两个参数:

  • --list或者-l:这个参数运行后会显示全部的主机以及主机组的信息(JSON格式);
  • --host或者-H:这个参数后面须要指定一个host,运行结果会返回这台主机的全部信息(包括认证信息、主机变量等),也是JSON格式。

下面就是我写的一个经过Python脚本动态获取主机列表和主机信息的脚本,因为脚本是用来演示的,因此没有从数据库中获取主机列表和主机配置信息,在实际开发中,咱们能够修改成从数据库获取对应的数据:

#!/usr/bin/env python3
# -*- coding:utf-8 -*-

import argparse
import json

def lists():
    r = {}
    h = ['192.168.1.2', '192.168.1.4']
    hosts = {'hosts':h}
    r['web'] = hosts
    return json.dumps(r, indent=4)

def hosts(name):
    r = {'ansible_ssh_user':'jelly', 'ansible_ssh_pass':'123456'}
    return json.dumps(r)

if __name__ == "__main__":
    parser = argparse.ArgumentParser()
    parser.add_argument('-l', '--list', help='hosts list', action='store_true')
    parser.add_argument('-H', '--host', help='hosts vars')
    args = vars(parser.parse_args())

    if args['list']:
        print(lists())
    elif args['host']:
        print(hosts(args['host']))
    else:
        parser.print_help()

接下来,咱们先不修改ansible.cfg中的inventory配置,直接在命令行指定配置文件进行运行:

ansible -i inventoryDemo.py web -m ping

输出结果以下:

192.168.1.2 | SUCCESS => {
    "changed": false,
    "ping": "pong"
}
192.168.1.4 | SUCCESS => {
    "changed": false,
    "ping": "pong"
}

在生产环境,咱们须要将ansible.cfg中的inventory配置指定为这个python脚本的路径,后续正常执行各个ansible命令便可,好比这样:

ansible web -m ping

inventory内置参数

Ansible inventory中能够配置不少内置的一些参数,这些参数在咱们实际工做中很是有用,咱们能够直接在inventory文件中定义它,也能够在动态的inventory中使用它们。这里对这些经常使用inventory内置参数进行一下简单的总结:

参数名 参数说明
ansible_ssh_host 定义主机的ssh地址
ansible_ssh_port 定义主机的ssh端口
ansible_ssh_user 定义主机的ssh认证用户
ansible_ssh_pass 定义主机的ssh认证密码
ansible_sudo 定义主机的sudo用户
ansible_sudo_pass 定义主机的sudo密码
ansible_sudo_exe 定义主机的sudo路径
ansible_connection 定义主机链接方式;与主机的链接类型.好比:local,ssh或者paramiko;Ansible 1.2之前默认使用paramiko。1.2之后的版本默认使用‘smart’,‘smart’方式会根据是否支持ControlPersist,来判断ssh方式是否可行
ansible_ssh_private_key_file 定义主机私钥文件
ansible_shell_type 定义主机shell类型
ansible_python_interpreter 定义主机python解释器路径

总结

inventory是ansible中一个很是重要的概念,只有彻底掌握了inventory的配置,咱们才会知道咱们须要对哪些主机作哪些事。但愿我这里对inventory的总结可以更好的帮助你理解inventory。由于inventory是如此的重要,因此在后续的文章中,我还会总结到inventory的一些其它用法。最后,若是觉的还不错,能够点击下方的“打赏”哦。

2019年6月16日,于内蒙古呼和浩特。


从最基础的编程语法,到高深的编程技巧;从最简单的学习计划,到长远的职业规划;果冻想分享的不只仅是一篇文章,更多的是对编程的挚爱和执着,对人生的享受和理解;无论你是IT菜鸟,仍是编程老手,“果冻想”都值得你关注。 更多精彩,请关注果冻想微信公众号

相关文章
相关标签/搜索