一. Ansible简介
1. 什么是Ansible
Ansible 是一个 IT 自动化工具。它能配置系统、部署软件、编排更复杂的 IT 任务,如连续部署或零停机时间滚动更新。
Ansible 用 python 编写,尽管市面上已经有很多可供选择的配置管理解决方案(例如 Salt,Puppet,Chef等),但它们各有优劣,而Ansible的特点在于它的简洁。让 Ansible 在主流的配置管理系统中与众不同的一点便是,它并不需要你在想要配置的每个节点上安装自己的组件。同时提供的一个优点在于,如果需要的话,你可以在不止一个地方控制你的整个基础架构。
2. Ansible特性
- Agentless:不需要在被管理节点上安装客户端,只要有sshd即可
- Serverless: 在服务端不需要启动任何服务,只需要执行命令就行
- Modules in any language:基于模块工作,可以使用任意语言开发ansible模块
- YAML, not code:使用yaml语言定制playbook
- SSH by default:默认使用ssh控制各节点
- Strong multi-tier solution:可实现多级控制
3. Ansible基本组件
- 核心:ansible
- 核心模块(Core Modules):这些都是ansible自带的模块
- 扩展模块(Custom Modules):如果核心模块不足以完成某种功能,可以添加扩展模块
- 插件(Plugins):完成模块功能的补充
- 剧本(Playbooks):把需要完成的多个任务定义在剧本中
- 连接插件(Connectior Plugins):ansible基于连接插件连接到各个主机上,虽然ansible是使用ssh连接到各个主机的,但是它还支持其他的连接方法,所以需要有连接插件
- 主机群(Host Inventory):ansible在管理多台主机时,可以选择只对其中的一部分执行某些操作
4. Ansible工作机制
Ansible没有客户端,因此底层通信依赖于系统软件,Linux系统基于OpenSSH通信,Windows系统基于PowerShell,管理端必须是Linux系统,使用者认证通过后在管理节点通过Ansible工具调用各个应用模块将指令推送到被管理端执行,并在执行完毕后自动删除产生的临时文件。
根据Ansible使用过程中的不同角色,我们将其分为:1)使用者;2)Ansible工具集;3)作用对象。
1)使用者:
ansible使用者来源于多种维度,图中有四种;
第一种方式:CMDB(Configuration Management Database,配置管理数据库),CMDB存储和管理企业IT架构中的各项配置信息,是构建ITIL项目的核心工具,运维人员可以组合CMDB和ansible,通过CMDB直接下发指令调用Ansible工具集,完成操作者所下达的指令。
第二种方式:PUBLIC/PRIVATE方式,ansible除了丰富的内置模块外,同时提供丰富的api语言接口,如PHP,PYTHON,PERL等当下流行语言,基于PUBLIC(公有云)/PRIVATE(私有云),ansible以调用的方式运行。
第三种方式:USERS直接使用AD-Hoc临时命令集调用ansible工具集来完成任务。
第四种方式:USERS预先编写好ansbile playbook,通过执行playbook中预先编排好的任务集按顺序完成任务执行。
2)ansible工具集:
ansible命令是ansible的核心工具,ansible命令并非自身完成所有的功能集,其只是ansible执行任务的调用入口,所有命令的执行通过其调兵遣将完成最终目标。
3)作用对象:
ansible的作用对象不仅仅是linux和非linux操作系统的主机,同样也可以作用于各类公有云/私有云,商业和非商业设备的网络设施。
根据上图我们可以看出,ansible主要由6个部分组成。
· ansilbe playbook:任务剧本,编排定义ansible任务集的配置文件,由ansible顺序依次执行,通常是json格式的YML文件。
· inventory:ansible管理主机的清单;
· modules:ansible执行命令的功能模块,多数为内置核心模块,可自定义;
· plugins:模块功能的补充,如连接类型插件,循环插件,变量插件,过滤插件等(该功能不常用)
· api:供第三方程序调用的应用程序编程接口;
· ansible:该部分上图显示不明显,组合inverntory,api,modules,plugins的核心执行工具
使用者使用ansible(AD-Hoc)或者Ansible-playbook(读取对应的playbook文件)时,在管理端输入ansible的AD-Hoc命令集或Playbook后,ansible会遵循预先编排的规则将playbook拆解为play,再将Play组织成ansible可识别的任务(task),随后调用任务涉及的所有模块(module)和插件(plugin),根据inventory中定义的主机列表通过ssh将任务集一临时文件或命令的形式传输到远程客户端执行,并返回执行结果,如果是临时文件,执行完毕后会自行删除。
二. Ansible安装
1. pip安装方式
ansible底层是基于Python编写的,所以可以通过PIP方式安装ansible。
1.1 安装python-pip
yum install -y python-pip python-devel
1.2 安装ansible服务
## 安装钱确保gcc,gibc开发环境均已安装,系统几乎所有的软件包编译都基于gcc,如果不确认可以执行以下命令。
yum install gcc glibc-devel zlib-devel openssl-devel rpm-build -y
## 升级本地pip版本
pip install --upgrade pip
##安装ansible
pip install -y ansible
2. YUM安装 方式
2.1 先安装epel源
epel(RHEL 8)
1)安装 epel 配置包
yum install -y https://mirrors.aliyun.com/epel/epel-release-latest-8.noarch.rpm
2)将 repo 配置中的地址替换为阿里云镜像站地址
sed -i 's|^#baseurl=https://download.example/pub|baseurl=https://mirrors.aliyun.com|' /etc/yum.repos.d/epel*
sed -i 's|^metalink|#metalink|' /etc/yum.repos.d/epel*
epel(RHEL 7)
wget -O /etc/yum.repos.d/epel.repo https://mirrors.aliyun.com/repo/epel-7.repo
2.2 yum安装ansible服务
yum install -f ansible
3. apt安装方式
apt-get install software-properties-common
##添加ansible源
apt-add-repository -y ppa:ansible/ansible
## 更新仓库
apt update
##安装ansible
apt-get install -y ansible
三. 配置文件解析
1. 配置文件优先级
ansible的配置文件名为ansible.cfg,它一般会存在于四个地方:
- ANSIBLE_CONFIG:首先,Ansible命令会检查该环境变量,及这个环境变量将指向的配置文件
- ./ansible.cfg:当前工作目录,即当前执行ansible指令的目录,如果ANSIBEL_CONFIG环境变量未定义,则优先使用该配置文件
- ~/.ansible.cfg:当前用户家目录下的一个隐藏文件,如果当前工作目录下不存在ansible.cfg配置文件,则会查找用户家目录下的该隐藏文件
- /etc/ansible/ansible.cfg:默认配置文件,如果上面两个路径下的ansible.cfg都不存在,则使用该文件
需要说明的是,配置文件中所有的配置项都可以通过环境变量的方式来定义,而环境变量定义的配置项具有最高优先级,会覆盖掉所有配置文件中的配置项
2. ansible.cfg配置文件说明
2.1 配置文件分段说明
ansible.cfg的配置默认分为十段:
- [defaults]:通用配置项
- [inventory]:与主机清单相关的配置项
- [privilege_escalation]:特权升级相关的配置项
- [paramiko_connection]:使用paramiko连接的相关配置项,Paramiko在RHEL6以及更早的版本中默认使用的ssh连接方式
- [ssh_connection]:使用OpenSSH连接的相关配置项,OpenSSH是Ansible在RHEL6之后默认使用的ssh连接方式
- [persistent_connection]:持久连接的配置项
- [accelerate]:加速模式配置项
- [selinux]:selinux相关的配置项
- [colors]:ansible命令输出的颜色相关的配置项
- [diff]:定义是否在运行时打印diff(变更前与变更后的差异)
2.2 配置文件默认基础参数
[default]
inventory = /etc/ansible/hosts
remote_user = root
ask_pass = false
log_path = /var/log/ansible.log
[privilege_escalation]
become=True
become_method=sudo
become_user=root
become_ask_pass=False
[ssh_connection]
ssh_args = -C -o ControlMaster=auto -o ControlPersist=60s
host_key_checking = False
inventory:定义默认使用的主机清单
remote_user: ansible在操作远程主机时,使用远程主机上的哪个用户身份,默认是root
ask_pass:ansible在操作远程主机时,获取远程主机上的用户身份,是否交互提示密码验证,默认为true。如果使用密钥认证的话,建议将其设置为false
log_path:默认ansible 执行的时候,并不会输出日志到文件,打开该配置项,所有的命令执行后,都会将日志输出到/var/log/ansible.log文件。
become:如果ansible在操作远程主机时,使用的是远程主机上的普通用户,该普通用户是否允许提权
become_method:如果允许提权,使用何种提权方式,默认是sudo
become_user:提权到哪个用户身份,默认是root
become_ask_pass:提权时,是否交互提示密码验证,默认为False
ssh_args:ansible通过ssh连接远程被管理机,这里用于定义一些ssh连接时的参数,如-C启用压缩传输,ControlPersist用于提升性能。
host_key_checking:通过ssh首次连接远程主机时,由于在本机的~/.ssh/known_hosts文件中并有fingerprint key串,ssh第一次连接的时候一般会提示输入yes/no进行确认将key字符串加入到~/.ssh/known_hosts文件中。将此项设置为False将跳过该确认过程。
2.3 详细配置文件参数
2.3.1 [defaults] 通用配置项
该类型配置下定义常规 的连接类配置,如inventory,library,remote_tmp,local_tmp,forks,poll_interval,sudo_user,ask_user,ask_sudo_pass,ask_pass,transport,remote_port等
[default]
inventory = /etc/ansible/hosts #定义Inventory主机清单文件
library = /user/share/my_modules #自定义lib库存放目录
remote_tmp = $HOME/.ansible/tmp #临时文件远程主机存放目录
local_tmp = $HOME/.ansible/tmp #临时文件本地存放路径
forks = 5 #默认开启的并发数
poll_interval = 15 #默认轮询时间间隔
sudo_user = root #默认sudo用户
ask_sudo_pass = True #是否需要sudo密码
ask_pass = True 是否需要密码
roles_path = /etc/ansible/roles #默认下载的roles存放的目录
host_key_checking = False #首次连接是否需要检查key认证,建议设置为False
timeout = 10 #默认超时时间
log_path = /var/log/ansible.log #执行日志存放文件
module_name = command #默认执行的模块
#action_plugins = /usr/share/ansible/plugins/action #action插件的存放目录
#callback_plugins = /usr/share/ansible/plugins/callback #callback插件的存放目录#connection_plugins = /usr/share/ansible/plugins/connection #connection插件的存放目录
#lookup_plugins = /usr/share/ansible/plugins/lookup #lookup插件的存放目录
#vars_plugins = /usr/share/ansible/plugins/vars #vars插件的存放目录
#filter_plugins = /usr/share/ansible/plugins/filter #filter插件的存放目录
#test_plugins = /usr/share/ansible/plugins/test #test插件的存放目录
#strategy_plugins = /usr/share/ansible/plugins/strategy #strategy插件的存放目录
# fact_caching = memory #getfact缓存的主机信息存放方式
#retry_files_enabled = False
#retry_files_save_path = ~/.ansible-retry #错误重启文件存放目录
上述是日常可能用到的配置,这些多数保持默认即可。
2.3.2 [privilege_escalation]特权升级相关的配置项
处于安全考虑,部分公司不希望直接以root的高级管理员权限直接部署应用,往往会开放普通用户权限并给予sudo的权限,该部分主要是针对sudo用户提权配置。
[peivilege_escalation]
become = True #是否sudo
become_method = sudo #提权方式
become_user = root #提权后变为root用户
become_ask_pass = False #提权后是否严重密码
2.3.3 [paramiko_connection]
使用paramiko连接的相关配置项,Paramiko在RHEL6以及更早的版本中默认使用的ssh连接方式,该配置部分功能不常用。
[paramiko_connection]
record_host_keys = False #不记录新主机的key,以提升效率
pty = False #禁用sudo功能
2.3.4 [ssh_connection]
使用OpenSSH连接的相关配置项,OpenSSH是Ansible在RHEL6之后默认使用的ssh连接方式,该部署主要是ssh连接的一些配置,配置项少,多数默认即可
【ssh_connection】
pipelining = False #管道加速功能,需要配合requiretty使用,方可生效
2.3.5 [accelerate] 加速模式配置项
ansible连接加速相关配置,因为有部分使用者不满意ansible的执行速度,所以ansible的连接和执行速度方面也在不断的优化,该配置项在提升ansible连接熟读时会涉及,多数保持默认
【accelerate】
accelerate_port = 5099 #加速连接端口
accelerate_timeout = 30 #命令执行超时时间,单位秒
accelerate_connect_timeout = 5.0 #连接超时时间,单位秒
accelerate_daemon_timeout = 30 #上一个活动连接的时间,单位分钟
accelerate_multi_key = yes
2.3.6 [selinux] selinux相关的配置项
关于selinux的相关配置几乎不会涉及,保持默认即可
【selinux】
libvirt_lxc_nodeclabel = yes
2.3.7 [colors] ansible命令输出的颜色相关的配置项
ansible对于输出结果的颜色也进行了详细的定义,且可配置,该选项对日常功能应用影响不大,几乎不用修改,保持默认即可。
【colors】
highlight = while
verbose = blue
warn = bright purple
error = red
debug = dark gray
deprecate = purple
skip = cyan
unreachable = red
ok = green
changed = yellow
diff_add = green
diff_remove = red
diff_lines - cyan
上面尽可能全的介绍了运维工作中可能需要修改的配置选项,除了在关闭首次连接提示(host_key_checking = False)或提速调整(accelerate)时可能会做稍微调整,其中绝大多数选项默认即可,ansible安装好后无需任何修改即可使用。