白日依山尽,黄河入海流。欲穷千里目,更上一层楼。 -- 唐·王之涣

Ansible系列-基础篇-Ansible Inventory的合理化配置

欢迎关注个人公众号

原文地址: Ansible Inventory的合理化配置


Ansible 是对主机进行管理,可以对主机进行分组等配置,默认配置存放在 /etc/ansible/hosts 文件

Ansible Inventory内置参数

在进行配置之前,我们先了解下 Inventory都有哪些内置的参数

参数 参数说明
ansible_ssh_host ssh 连接的主机IP
ansible_ssh_user ssh 连接的主机user
ansible_ssh_port ssh 连接的主机端口,默认是22
ansible_ssh_pass ssh 连接的主机用户密码;建议采用–ask-pass 或者SSH秘钥登录
ansible_ssh_sudo sudo 用户
ansible_sudo_pass sudo 用户对应的密码; 建议采用 –ask-sudo-pass
ansible_sudo_exe sudo 路径 (version 1.8 以上支持)
ansible_connection 与主机连接的方式;Anisble1.2以上采用paramiko;1.2之后采用smart
ansible_ssh_private_key_file ssh连接使用的私钥文件地址,可以有多个
ansible_shell_type 目标系统的shell类型,默认是’sh’,也可以配置’csh’ 后者 ‘fish’ 等
ansible_python_interpreter 目标主机的 python 路径,如果目标主机有多个Python,则非常有用

Inventory 常规配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
ansible_ssh_host=192.168.1.2 ansible_ssh_user=devops ansible_ssh_port=9555

[dbgroup]
db-master ansible_ssh_host=192.168.1.3 ansible_ssh_user=devops ansible_ssh_port=9555
db-slave ansible_ssh_host=192.168.1.4 ansible_ssh_user=devops ansible_ssh_port=9555

[web_group]
ansible_ssh_host=192.168.1.[5:7] ansible_ssh_user=devops ansible_ssh_port=9555 http_port=9090

[website:children]
dbgroup
web_group

[web_group:vars]
domain=www.colinspace.com

结合Inventory内置参数和上面的配置Demo,来逐步说明解析

  • 可以单独配置一些主机,比如第一行记录,同时执行了端口和用户,IP地址
  • 可以把某些具有共性的主机放到一个分组中,比如上面的两个数据库和三个web主机;主机名放到[]中,另外建议主机名采用下划线分割,不然会有warnning
  • 可以给配置的主机 配置别名 比如上面的 db-master 和 db-slave ,其实这个别名可以配置成对应的主机名,这里可以思考下,配置成主机名有什么优势?
  • 在配置一些主机的时候,如果主机出现的有规律,可以类似第8行配置进行简写
  • 分组可以嵌套,比如 website 分组包含了dbgroup 和 web_group
  • 另外可以定义分组的变量,如 14 和 15行配置
  • 第8行最后的 http_port 是定义的主机变量

这里不管是主机变量还是分组变量都是为了在后续的 playbook 中使用,当然这种把变量配置到 Inventory配置文件中的做法不是最优解,官方给出的建议是单独配置

扩展:分文件定义 Host 和 Group 变量

注意:inventory文件格式是 ini ;但是这里分文件之后的Host或者Group变量存放文件的格式是 yaml

  • /etc/ansible/host_vars/xxx 存放主机变量,该文件夹下每个文件都是一个主机名称,内容存放需要的主机变量
  • /etc/ansible/group_vars/yyy 存放分组变量,该文件夹下每个文件都是一个分组名称,内容存放需要的分组变量

在实际使用中我们可以如下操作

1
2
3
4
5
6
7
8
9
10
# 直接 使用对应的主机IP来访问
ansible 192.168.1.2 -m ping
# 也可以使用别名
ansible db-master -m shell -a 'ps -ef|grep mysql'
# 可以针对分组操作
ansible dbgroup -m shell -a 'ps -ef|grep mysql'
# 上面分组操作等同于
ansible db-master:db-slave -m ping
# 或者使用 * 通配符
ansible db-* -m ping

上述命令行操作是ansible ad-hoc 方式,-m 后面接模块名称 -a 后面接模块需要的参数

Inventory 优化配置

比如,常规ansible操作是通过普通账号操作,有时候需要sudo权限,上面 Inventory中没有配置sudo相关,是因为我们在 主配置文件/etc/ansible/ansible.cfg 中进行了相关配置

1
2
3
4
[privilege_escalation]
become=True
become_method=sudo
become_user=root

另外刚才提到 Inventory 中可以给每个主机配置一个别名,建议是配置成对应的主机名,好处就是:在运维操作中,一般会把 主机名和其对应的IP地址解析添加到 /etc/hosts 文件中去,这样的话我们只在inventory中配置主机名即可

如果这个时候默认端口是22,同时操作的用户就是ansible管理节点当前登录的用户,那么 inventory的配置文件就可以简化为

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
devops-demo-vpc 

[dbgroup]
db-master-vpc
db-slave-vpc

[web_group]
web-01-vpc
web-02-vpc
web-03-vpc

[website:children]
dbgroup
web_group

[web_group:vars]
domain=www.colinspace.com

在每个主机的 /etc/hosts 文件中同步如下配置即可

1
2
3
4
5
6
192.168.1.2 devops-demo-vpc
192.168.1.3 db-master-vpc
192.168.1.4 db-slave-vpc
192.168.1.5 web-01-vpc
192.168.1.6 web-02-vpc
192.168.1.7 web-03-vpc

/etc/hosts 的管理可以通过后续介绍的playbook管理同步,结合cmdb就可以实现内部域名(可以是内部定义的有意义的域名或者主机名)解析

这个有个前提就是ansible管理是通过公私钥对来进行ssh免密登录连接,这里引申出几个运维规范:

1、Linux主机禁止root登录

2、Linux主机禁止密码登录

3、Linux用户通过公私钥对登录

4、Linux主机最小化SA账号开通sudo权限

多Inventory配置

一般都会存在多个环境,为了有效管理,就可以为不同的环境配置不同的inventory配置。

配置说明

1
2
3
4
5
6
7
8
9
10
# 主配置文件中通过 inventory 参数指定一个默认
inventory = /etc/ansible/inventory/prod.hosts

# 在 inventory目录下分别存放各环境的 inventory文件

| - /etc/ansible/inventory/
| - - /etc/ansible/inventory/prod.hosts
| - - /etc/ansible/inventory/gamma.hosts
| - - /etc/ansible/inventory/test.hosts
| - - /etc/ansible/inventory/dev.hosts

默认是管理生产环境主机,如果需要管理其他环境主机,只需要通过 -i 参数指定不同的 inventory 文件即可

1
ansible -i /etc/ansible/inventory/dev.hosts xxx-host -m shell -a 'df -h'

还有一种做法就是 inventory 参数配置成目录,比如

1
inventory = /etc/ansible/inventory/

这样就不存在通过 -i 参数指定不同的inventory的问题,ansible 会从该目录下所有文件中去查询需要操作的主机或者分组。如果文件太多遍历存在一定的性能消耗,而且一定要清楚操作的目标节点。这就需要清晰的环境主机名规划才可以,

两种方式各有优缺点,大家自行选择即可

动态 Inventory

目的是为了解决超大量主机管理时,维护 inventory 文件成本的问题。ansible通过支持动态Inventory,其文件里的主机列表和变量信息都可以从外部拉取

所以需要一个脚本,配置如下

1
inventory = /etc/ansible/inventory.py

不过 ansible 对这个脚本是有要求的

  • –list 或者 -L 显示所有主机和主机组的信息,JSON格式。
  • –host 或者 -H 返回某台主机的信息,JSON格式。

一般静态配置文件方式即可满足大家1K以内主机管理,如果更多就结合运维的CMDB来实现动态,这里先不扩展介绍,在最后的扩展章节,结合运维平台CMDB实现动态inventory 真实案例

作者

Colin

发布于

2021-06-01

许可协议