Ansible
- 几种常用运维工具比较
Puppet
— 基于 Ruby 开发,采用 C/S 架构,扩展性强,基于 SSL,远程命令执行相对较弱
SaltStack
— 基于 Python 开发,采用 C/S 架构,相对 puppet 更轻量级,配置语法使用 YAML,使得配置脚本更简单
Ansible
— 基于 Python paramiko 开发,分布式,无需客户端,轻量级,配置语法使用YAML 及 Jinja2模板语言,更强的远程命令执行操作
- Ansible简介
Ansible 基于Python开发,集合了众多运维工具(puppet、cfengine、chef、func、fabric)的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能。ansible是基于模块工作的,本身没有批量部署的能力。真正具有批量部署的是ansible所运行的模块,ansible只是提供一种框架。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dzMDS8Nk-1655895760176)(D:\笔记图片\image-20220615215149735-16553011111181-16553011122763.png)]
connection plugins:连接插件,负责和被管理端实现通信,有SSH,ZEROMQ等,默认使用SSH连接
host inventory:主机清单,是一个配置文件里面定义管控的主机
modules : 模块,核心模块、command模块、自定义模块等
plugins : modules功能的补充,包括连接插件,邮件插件等
playbook:编排,定义 Ansible 多任务配置文件,非必需
- Ansible特性
1)、no agents:不需要在被管控主机上安装任何客户端,更新时,只需在操作机上进行一次更新即可
2)、no server:无服务器端,使用时直接运行命令即可
3)、modules in any languages:基于模块工作,可使用任意语言开发模块
4)、yaml,not code:使用yaml语言定制剧本playbook
5)、ssh by default:基于SSH工作
6)、strong multi-tier solution:可实现多级指挥
- Ansible工作原理:
在ANSIBLE 管理体系中,存在"管理节点" 和 “被管理节点” 两种角色。被管理节点通常被称为"资产".
在管理节点上,Ansible将 AdHoc 或 PlayBook 转换为Python脚本,并通过SSH将这些Python 脚本传递到被管理服务器上。
在被管理服务器上依次执行,并实时的将结果返回给管理节点。
- Ansible执行过程:
1). 加载自己的配置文件,默认/etc/ansible/ansible.cfg;
2). 查找对应的主机配置文件,找到要执行的主机或者组;
3). 加载自己对应的模块文件,如 command;
4). 通过ansible将模块或命令生成对应的临时py文件(python脚本), 并将该文件传输至远程服务器;
5). 对应执行用户的家目录的.ansible/tmp/XXX/XXX.PY文件;
6). 给文件 +x 执行权限;
7). 执行并返回结果;
8). 删除临时py文件,sleep 0退出;
Ansible安装
nsible安装常用两种方式,yum 安装 和 pip 程序安装。
yum 安装
- 配置EPEL网络yum源
- 安装ansible
# yum install ansible -y
pip 安装
# yum install python-pip
# pip install ansible
Ansible配置文件
ansible与我们其他的服务在这一点上有很大不同,这里的配置文件查找是从多个地方找的,顺序如下:
- 检查环境变量ANSIBLE_CONFIG指向的路径文件(export ANSIBLE_CONFIG=/etc/ansible.cfg);
- /.ansible.cfg,检查当前目录下的ansible.cfg配置文件;
- /etc/ansible.cfg检查etc目录的配置文件。
主配置文件简介
通过yum安装的ansible 主配置文件为 /etc/ansible/ansible.cfg,下面我们列出一些常见的参数:
inventory = /etc/ansible/hosts # 这个参数表示资源清单inventory文件的位置
library = /usr/share/ansible # 指向存放Ansible模块的目录,支持多个目录方式,只要用冒号隔开就可以
forks = 5 # 并发连接数,默认为5
sudo_user = root # 设置默认执行命令的用户
remote_port = 22 # 指定连接被管节点的管理端口,默认为22端口
host_key_checking = False # 设置是否检查SSH主机的密钥,值为True/False。
timeout = 60 # 设置SSH连接的超时时间,单位为秒
log_path = /var/log/ansible.log # 指定一个存储ansible日志的文件(默认不记录日志)
Inventory 主机清单
inventory文件通常用于定义要管理主机的认证信息,例如ssh登录用户名、密码以及key相关信息。
/etc/ansible/hosts [缺省]
主机清单文件配置:
webservers]
192.168.10.128
Bar.example.com
up.example.com:5309 # 指定 SSH 端口 5309
web1 ansible_ssh_host=192.168.1.50 # 设置主机别名为 web1
www[01:50].example.com # 支持通配符匹配www01,www02,...,www50
db-[a:f].example.com # 通配符匹配db-a,db-b,...,db-f
# 为每个主机单独指定一些变量,这些变量可以在 playbooks 中使用:
[atlanta]
host1 http_port=80 maxRequestsPerChild=808
host2 http_port=303 maxRequestsPerChild=909
为一个组指定变量,组内每个主机都可以使用该变量:
[atlanta:vars]
ntp_server=ntp.atlanta.example.com
proxy=proxy.atlanta.example.com
组可以包含其他组:
[atlanta]
host1
host2
[raleigh]
host3
host4
[southeast:children]
atlanta
raleigh
[southeast:vars]
some_server=foo.southeast.example.com
halon_system_timeout=30
hosts文件内置变量: