欢迎关注个人公众号 DailyJobOps
原文地址:Ansible系列-基础篇-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 常规配置
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
存放分组变量,该文件夹下每个文件都是一个分组名称,内容存放需要的分组变量
在实际使用中我们可以如下操作
# 直接 使用对应的主机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
中进行了相关配置
[privilege_escalation]
become=True
become_method=sudo
become_user=root
另外刚才提到 Inventory 中可以给每个主机配置一个别名,建议是配置成对应的主机名,好处就是:在运维操作中,一般会把 主机名和其对应的IP地址解析添加到 /etc/hosts 文件中去,这样的话我们只在inventory中配置主机名即可
如果这个时候默认端口是22,同时操作的用户就是ansible管理节点当前登录的用户,那么 inventory的配置文件就可以简化为
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 文件中同步如下配置即可
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配置。
配置说明
# 主配置文件中通过 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 文件即可
ansible -i /etc/ansible/inventory/dev.hosts xxx-host -m shell -a 'df -h'
还有一种做法就是 inventory 参数配置成目录
,比如
inventory = /etc/ansible/inventory/
这样就不存在通过 -i
参数指定不同的inventory的问题,ansible 会从该目录下所有文件中去查询需要操作的主机或者分组。如果文件太多遍历存在一定的性能消耗,而且一定要清楚操作的目标节点。这就需要清晰的环境主机名规划才可以,
两种方式各有优缺点,大家自行选择即可
动态 Inventory
目的是为了解决超大量主机管理时,维护 inventory 文件成本的问题。ansible通过支持动态Inventory,其文件里的主机列表和变量信息都可以从外部拉取
所以需要一个脚本,配置如下
inventory = /etc/ansible/inventory.py
不过 ansible 对这个脚本是有要求的
- --list 或者 -L 显示所有主机和主机组的信息,JSON格式。
- --host 或者 -H 返回某台主机的信息,JSON格式。
一般静态配置文件方式即可满足大家1K以内主机管理,如果更多就结合运维的CMDB来实现动态,这里先不扩展介绍,在最后的扩展章节,结合运维平台CMDB实现动态inventory
真实案例