第2天:Ansible-Inventory管理
在Ansible中,将可管理的服务器集合成为Inventory。因此,Inventory管理便是服务器管理。
hosts文件位置
我们知道,Ansible在执行操作时,首先需要确定对哪些服务器执行操作。默认情况下,Ansible读取/etc/ansible/hosts文件中的服务器配置,获取需要操作的服务器列表。Ansible定义与获取服务器列表的方式比这个要灵活的多。
在Ansible中,有三种方式指定hosts文件:
1)默认读取/etc/ansible/hosts文件
2)通过命令行参数的 -i 指定hosts文件
3)通过ansible.cfg文件的inventory选项
ansible命令的--list-hosts选项用来显示匹配的服务器列表,我们可以通过该参数验证服务器的匹配情况
[heboan@c1 ~]$ ansible test --list-hosts
hosts (2):
192.168.88.2
192.168.88.3
我们在家目录下创建个hosts,然后用-i指定这个hosts
[heboan@c1 ~]$ cat hosts
[test]
192.168.20.1
192.168.20.2
[heboan@c1 ~]$
[heboan@c1 ~]$ ansible test -i hosts --list-hosts
hosts (2):
192.168.20.1
192.168.20.2
[heboan@c1 ~]$
[heboan@c1 ~]$ ansible test --list-hosts #默认情况
hosts (2):
192.168.88.2
192.168.88.3
我们也可以在ansible.cfg中通过inventory选项指定hosts文件路径
[heboan@c1 ~]$ cat /etc/ansible/ansible.cfg
[defaults]
remote_port = 2202
remote_user = heboan
inventory = /home/heboan/hosts
[heboan@c1 ~]$
[heboan@c1 ~]$ ansible test --list-hosts
hosts (2):
192.168.20.1
192.168.20.2
灵活定义hosts文件内容
Ansible支持更加灵活的方式定义hosts文件,例如将服务器进行分组,以便对不同的服务器类型进行不同的操作, 如下
mail.heboan.com #不属于任何一个组 [webservers]
foo.heboan.com
bar.heboan.com [dbserver]
one.heboan.com
two.heboan.com
three.heboan.com
在服务器匹配时,all或星号是一个特殊的名称,用于匹配所有的服务器
[heboan@c1 ~]$ ansible '*' --list-hosts
hosts (6):
mail.heboan.com
foo.heboan.com
bar.heboan.com
one.heboan.com
two.heboan.com
three.heboan.com
匹配所有服务器
使用组名,匹配该组所有服务器
[heboan@c1 ~]$ ansible dbserver --list-hosts
hosts (3):
one.heboan.com
two.heboan.com
three.heboan.com
匹配组服务器
Ansible也可以定义一个组,这个组下面定义的不是服务器列表,而是包含其他组的名称, 通过":children"的方式来声明
[common:children]
webserver
dbserver
如果我有一批服务器,并且这些服务器有相同的模式,我们可以向下面这样定义服务器
[webservers]
web[1:3].heboan.com
bar.heboan.com [dbservers]
db[a:d].heboan.com
灵活匹配hosts文件内容
| 规则 | 含义 |
| 192.168.88.2或c2.heboan.com | 匹配模板IP地址或服务器名,如果有多个ip或服务器,使用":"分隔 |
| webservers | 匹配目标组为webservers,多个组使用":"分隔 |
| all或'*' | 匹配所有服务器 |
| webservers:!dbservers | 匹配在webservers中,不在dbservers组中的服务器 |
| webservers:&dbservers | 匹配同时在webservers组以及在dbservers组中的服务器 |
| *.example.com或192.168.* | 使用通配符匹配 |
| webservers[0],webservers[1:],webservers[-1] | 使用索引或切片操作的方式匹配组中的服务器 |
| ~(web|db).*example.com | 以~开头的匹配,表示使用正则表达式匹配 |
动态Inventory获取
从前面的介绍可以看到,Ansible提供给你了非常灵活的方式来编写hosts文件,可以节省不必要的时间浪费、提高工作效率。此外,Ansible还可以通过调用云计算服务的API,编写自定义脚本的方式获取服务器列表。如果公司有使用CMDB系统来管理服务器,那么,我们可以通过读取CMDB数据库中的记录得到服务器列表。
既然 我们可以通过调用云计算系统的API,或者读取CMDB系统的数据库获取服务器列表,那么,再将服务器地址写入hosts文件就显得比较冗余,且没有任何必要。
一个动态获取服务器列表的脚本必须支持如下两个命令行参数:
1)--host=<hostname>: 用于列出某台服务器的详细信息
2)--list:用于列出群组以及群组中的服务器
例如,我们才CMDB系统库中包含了一些服务器的信息, 如果将这些服务器信息从数据库中拷贝到hosts文件中,效果如下:
[root@c1 ~]# cat /etc/ansible/hosts
[test]
192.168.88.2 ansible_user=heboan ansible_port=22
192.168.88.3 ansible_user=heboan ansible_port=22 [uat]
192.168.88.4 ansible_user=heboan ansible_port=22
按照Ansible的约定,我们需要编写一个动态脚本来获取服务器的列表,这个脚本必须支持--list选项和--host选项。其中,--list选项以json的格式返回以组名为key,服务器列表为value的数据。--host返回一个字典,该字典中包含了这个服务器的详细信息,如下:
[heboan@c1 ~]$ python hosts.py --list
{
"test": [
"192.168.88.2",
"192.168.88.3"
],
"uat": [
"192.168.88.4"
]
}
[heboan@c1 ~]$
[heboan@c1 ~]$ python hosts.py --host='192.168.88.2'
{
"ansible_port": "",
"asnible_user": "heboan"
}
接下来我们来看下如何编写这样一个动态获取服务器的脚本。假设。我们的CMDB数据库中,存在一张名为hosts的表:
CREATE TABLE hosts(
id int(11) NOT NULL PRIMARY KEY AUTO_INCREMENT,
host varchar(15) DEFAULT NULL,
groupname varchar(15) DEFAULT NULL,
username varchar(15) DEFAULT NULL,
port int(11) DEFAULT NULL
); INSERT INTO hosts values(null, '192.168.88.2', 'test', 'heboan', 22);
INSERT INTO hosts values(null, '192.168.88.3', 'test', 'heboan', 22);
INSERT INTO hosts values(null, '192.168.88.3', 'uat', 'heboan', 22);
下面是动态获取服务器列表的程序
#!/usr/bin/python
#_*_ coding: UTF-8 _*_ import argparse
import json
from collections import defaultdict
from contextlib import contextmanager
import pymysql def to_json(in_dict):
return json.dumps(in_dict, sort_keys=True, indent=4) @contextmanager
def get_conn(**kwargs):
conn = pymysql.connect(**kwargs)
try:
yield conn
finally:
conn.close() def parse_args():
parser = argparse.ArgumentParser(description='Heboan Inventory Module')
group = parser.add_mutually_exclusive_group(required=True)
group.add_argument('--list', action='store_true', help='list active servers')
group.add_argument('--host', help='List details about the specific host')
return parser.parse_args() def list_all_hosts(conn):
hosts = defaultdict(list) with conn as cur:
cur.execute('select * from hosts')
rows = cur.fetchall()
for row in rows:
no, host, group, user, port = row
hosts[group].append(host)
return hosts def get_host_detail(conn, host):
details = {}
with conn as cur:
cur.execute("select * from hosts where host='{}'".format(host))
rows = cur.fetchall()
if rows:
no, host, group, user, port = rows[0]
details.update(asnible_user=user, ansible_port=port)
return details def main():
parser = parse_args()
with get_conn(host='127.0.0.1', user='root', password='root', db='cmdb' ) as conn:
if parser.list:
hosts = list_all_hosts(conn)
print(to_json(hosts))
else:
details = get_host_detail(conn, parser.host)
print(to_json(details)) if __name__ == '__main__':
main()
hosts.py
为了让我们动态获取服务器列表程序能够应用在Ansible中,需要为hosts.py加上可执行权限。其他使用方式和普通的hosts文件一模一样。

定义服务器变量
...
第2天:Ansible-Inventory管理的更多相关文章
- Ansible状态管理
转载自:http://xdays.me/ansible状态管理.html 简介 就像所有服务器批量管理工具(puppet有DSL,salt有state)一样,ansible也有自己的状态管理组件 ...
- Ansible 批量管理Windows Server服务器
Ansible批量管理Windows Server Ansible是一款为类Unix系统开发的自由开源的配置和自动化工具, 它用Python写成,类似于saltstack和Puppe ...
- ansible批量管理服务 上
1 ansible简介 1.1 ansible批量管理服务概述 (1)是基于python语言开发的自动化软件工具(2)是基于SSH远程管理服务实现远程主机批量管理(3)并行管理,部署简单,应用也简单方 ...
- 使用ansible批量管理远程服务器
使用ansible批量管理远程服务器 背景 本地需要管理远程的一批服务器,主要执行以下任务: 1) 将本地的文件复制到远端所有服务器: 2) 需要在远程服务器中执行一个个命令: 远端服务器路径并非完全 ...
- 六.ansible批量管理服务
期中集群架构-第六章-ansible批量管理服务介绍====================================================================== 01. ...
- Django + Ansible 主机管理(有源码)
本文给大家介绍如何利用 Django + Ansible 进行 Web 项目管理. Django介绍 一个可以使 Web 开发工作愉快并且高效的 Web 开发框架,能够以最小的代价构建和维护高质量 ...
- Linux系统——Ansible批量管理工具
批量管理工具: (1)ansible 操作简单(适用于500台以下服务器) (2)saltstack 比较复杂(一般适用于1000-4w台服务器) (3)puppet超级复杂 systemctl(统一 ...
- Linux(11):期中架构(3)--- SSH远程管理服务 & ansible 批量管理服务
SSH远程管理服务 1. 远程管理服务知识介绍 # 1.1 SSH远程登录服务介绍说明 SSH是Secure Shell Protocol的简写,由 IETF 网络工作小组(Network Worki ...
- ansible批量管理常见的配置方法
第7章 ansible的管理 7.1 ansible概念的介绍 ansible-playbook –syntax 检查语法 ansible-playbook -C ...
- linux运维、架构之路-ansible批量管理
一.ansible软件 1.介绍 ①ansible是一个基于Python开发的自动化运维工具 ②其功能实现基于SSH远程连接服务 ③ansible可以实现批量系统配置.批量软件部署.批量文件拷贝.批量 ...
随机推荐
- 「模板」 线段树——区间乘 && 区间加 && 区间求和
「模板」 线段树--区间乘 && 区间加 && 区间求和 原来的代码太恶心了,重贴一遍. #include <cstdio> int n,m; long l ...
- 【BZOJ3875】【AHOI2014】骑士游戏 [Spfa][DP]
骑士游戏 Time Limit: 30 Sec Memory Limit: 256 MB[Submit][Status][Discuss] Description 在这个游戏中,JYY一共有两种攻击 ...
- [BZOJ2946][Poi2000]公共串解题报告|后缀自动机
鉴于SAM要简洁一些...于是又写了一遍这题... 不过很好呢又学到了一些新的东西... 这里是用SA做这道题的方法 首先还是和两个字符串的一样,为第一个字符串建SAM 然后每一个字符串再在这个SAM ...
- 【BZOJ】1014 [JSOI2008]火星人prefix
[算法]splay [题解]对于每个结点维护其子树串的hash值,前面为高位,后面为低位. sum[x]=sum[L]*base[s[R]+1]+A[x]*base[s[R]]+sum[R],其中su ...
- python学习笔记(六)之操作符
python中算术操作符: + - * / % ** // 注意: /:为真实除法,即对应数学中的除法,通常返回一个浮点数 //:取整除法,即取商 %:求模,即取余数 **:幂运算,这里需要注意的一点 ...
- bzoj 1503 平衡树
我们可以用一颗平衡树维护每个人的工资,因为工资的变化会影响到后面所有的人,所以我们打一个标签,向平衡树里插入的时候减去这个标签的值,这样代表改变了之后的零点,,这样维护这个标签就好了,输出的时候要加上 ...
- Vue 双向绑定原理
Vue.js最核心的功能有两个,一是响应式的数据绑定系统,二是组件系统. 一.访问器属性:Object.defineProperty ECMAScript 262v5带来的新东西,FF把它归入为jav ...
- 2017-2018-1 20179205《Linux内核原理与设计》第四周作业
<Linux内核原理与分析> 视频学习及实验操作 Linux内核源代码 视频中提到了三个我们要重点专注的目录下的代码,一个是arch目录下的x86,支持不同cpu体系架构的源代码:第二个是 ...
- mysql not null default / default
not null default 说明不能是NULL, 并设置默认值 default 设置默认值 , 但值也可能是NULL mysql> create table test (id int, n ...
- 使用PTGui软件将全景图变成鱼眼图
把全景图变成鱼眼图.方法一部分是自己研究的,一部分是参考学妹街景合成鱼眼照片的方法. 需要使用的软件是PTGui.是个收费软件,价格还不便宜.操作一下,安装完后就可以开始合成鱼眼图了. 加载图像 打开 ...