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

Ansible系列博文直达链接:Ansible入门系列

前言

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

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

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

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

inventory简介

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

定义主机和主机组

先来看个我在测试环境使用的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]是我们定义的一个包含其它组的组;分组是支持嵌套的,这样就更加方便了分组的管理。

定义了主机或主机组以后,我们就可以直接在命令中使用这些主机或主机组,比如这样:

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

定义inventory列表

默认情况下,Ansible的inventory文件是一个INI的静态文件,其实Ansible还支持多个inventory文件,这样我们就可以非常方便的管理不同业务或者不同环境的机器了。

要定义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日,于内蒙古呼和浩特。

细说Ansible主机清单inventory的更多相关文章

  1. Ansible主机清单Inventory文件hosts

    Ansible主机清单Inventory文件hosts 发表于 2017-05-14 | 分类于 运维相关 , Ansible | | 阅读次数 4638 | 字数统计 1,442 | 阅读时长预计 ...

  2. Ansible安装部署和常用命令,及其主机清单inventory(二)

    1.ansible的安装方式 1.1使用yum源安装 yum install ansible -y 1.2使用rpm包安装 https://dl.fedoraproject.org/pub/epel/ ...

  3. Ansible-免密登录与主机清单Inventory

    Ansible的指定用户与密码登录.免密登录.指定ssh端口以及主机清单Inventory配置 在实际使用中并不需要对ansible配置进行修改,或者说只有需要的时候才修改ansible配置. 添加用 ...

  4. (2)ansible主机清单文件inventory

    1)inventory作用 作用:通常用于定义要管理主机的认证信息,例如ssh登录用户名,密码等相关信息 缺省文件:/etc/ansible/hosts 2)定义主机组方式 #vim /etc/ans ...

  5. ansible 主机清单 /etc/ansible/hosts

    主机清单 [webservers] ansible01 ansible02 ansible03 ansible04 [root@ftp:/root] > ansible webservers - ...

  6. inventory file 与hosts patterns (ansible 机器清单 与 主机匹配模式)

    Ansible配置: ansible有两个核心配置文件: ansible.cfg 配置文件和Inventory配置文件 Ansible.cfg配置文件 Inventory机器列表配置 这里介绍Inve ...

  7. Ansible 小手册系列 五(inventory 主机清单)

    Ansible 可同时操作属于一个组的多台主机,组和主机之间的关系通过 inventory 文件配置. 默认的文件路径为 /etc/ansible/hosts 主机清单示例 mail.example. ...

  8. Ansible组件之inventory主机清单

    静态inventory 所有的主机信息都存放在Ansible的inventory组件里面,默认Ansible的inventory是一个静态的ini格式的文件/etc/ansible/hosts,当然还 ...

  9. 【Ansible 文档】【译文】主机清单文件

    Inventory 主机清单文件 Ansible 可以对你的基础设施中多个主机系统同时进行操作.通过选择在Ansible的inventory列出的一部分主机来实现.inventory默认保存在/etc ...

随机推荐

  1. delphi多版本安装方法

    delphi tokyo和其他版本并存的安装方法 1.安装delphi 10.2 tokyo 破解后写入D:\Program Files (x86)\Embarcadero\Studio\19.0\b ...

  2. VC 调用 MinGW 生成的dll good

    首先,如果dll 中导出了C++的类,那么就不要折腾了.不同的编译器编译出来的C++代码是不保证通用的.如果dll中只是一些C 函数,那么是可以互相调用的. MinGW 生成dll时即使生成了 .a  ...

  3. Impala概念与架构

    Impala概念与架构 下面的内容介绍Cloudera Impala的背景资料及特性,以便你更高效的使用它.Where appropriate, the explanations include co ...

  4. kubernetes之使用http rest api访问集群

    系列目录 在Kubernetes集群中,API Server是集群管理API的入口,由运行在Master节点上的一个名为kube-apiserver的进程提供的服务. 用户进入API可以通过kubec ...

  5. Redis---学习笔记(更新中)

    一.基本命令 #查看所有键 keys * #查看指定键 keys key #查看模糊键 keys ke* keys ke? keys ke[a-z] keys ke\? #判断键是否存在 exists ...

  6. 09 audio和vedio标签

    <!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8& ...

  7. .NET平台简介

    前言: 看到一个名词:搜商(SQ),还挺有趣.讲的是在互联网时代,怎么能够快速找到自己所需信息或资源,成为一种能力,并将其提升到类似智商.情商的概念.在以后工作过程中,尽量提高自己获取.辨别.处理信息 ...

  8. Java Collection秋招复习

    抽象类和接口的区别 我们先来看一下抽象类 * @auther draymonder */ public abstract class AbstractClassTest { private int T ...

  9. Java NIO: Non-blocking Server 非阻塞网络服务器

    本文翻译自 Jakob Jenkov 的 Java NIO: Non-blocking Server ,原文地址:http://tutorials.jenkov.com/java-nio/non-bl ...

  10. 【SQL-JOIN】mysql中left joinn、right join、full join以及inner join

    看到这两张图的时候就觉得太棒了,年轻的时候曾经爬了好多坑~~~~~~