前言
版本:CentOS Linux release 7.9.2009 (Core) ansible 2.9.27 python 2.7.5
什么是Ansible
随着Linux的运维的飞速发展,目前市场上出现了很多自动化运维工具,Ansible就是其中一款非常出色的自动化运维工具,ansible是基于Python开发的以及基于SSH远程管理,Ansible集合了众多运维工具(puppet、cfengine、chef、func、fabric)
的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能。
ansible是基于模块工作的,本身没有批量部署的能力。真正具有批量部署的是ansible所运行的模块,ansible只是提供一种框架。主要包括:
(1)、连接插件connection plugins:负责和被监控端实现通信;
(2)、host inventory:指定操作的主机,是一个配置文件里面定义监控的主机;
(3)、各种模块核心模块、command模块、自定义模块;
(4)、借助于插件完成记录日志邮件等功能;
(5)、playbook:剧本执行多个任务时,非必需可以让节点一次性运行多个任务
Ansible自动化运维工具的优点:
(1)、轻量级,更新时只需要在操作机上做一次更新即可;
(2)、采用SSH协议;
(3)、不需要客户端安装agent;
(4)、批量任务执行可以写成脚本;
(5)、只有Python编写,维护更简单;
(6)、支持sudo普通用户命令;
(7)、去中心化;
(8)、具备幂等性(idempotence),所谓幂等性,指的是多次操作或多次执行不影响结果。
ansible常用术语
控制节点(Control node):指安装了Ansible的主机,也叫Ansible服务器端,管理机,主控机,主控端。 Ansible控制节点主要用于发布运行任
务,执行控制命令。Ansible的程序都安装在控制节点上,控制节点需要安装Python和Ansible所需的各种依赖库。
受控节点(Managed nodes):也叫客户机,被控机,被控端,就是Ansible执行任务的目标服务器。
Inventory:主机清单,一个写有被控服务器IP的host文件,清单列表通常保存在一个名为host文件中。在host文件中,可以使用IP地址或者主机名来
表示具体的管理主机和认证信息,并可以根据主机的用户进行分组。默认hosts文件为:/etc/ansible/hosts,在执行ansible命令是还可以通过-i指定
自定义的host文件。
模块(Modules):模块是Ansible执行特定任务的代码块。比如:添加用户,上传文件和对客户机执行ping操作等。Ansible现在默认自带450多个模
块,,Ansible Galaxy公共存储库则包含大约1600个模块。
任务(Task):是Ansible客户机上执行的操作。可以使用ad-hoc单行命令执行一个任务,所谓ad-hoc就是指在窗口直接执行ansible命令。
剧本(Playbook):一种利用yaml标记语言编写的可重复执行的任务的列表文件,playbook实现任务的更便捷的读写和执行。
角色(roles):角色是Ansible 1.2版本引入的新特性,用于层次性、结构化地组织playbook。roles能够根据层次型结构自动装载变量文件、tasks
以及handlers等内容,其实roles就是相当于把剧本解耦了,一个剧本能编写hosts、tasks、handlers等各个步骤,为了让剧本不那么冗余,为了更好
的解耦,把这些步骤单独抽解出来,形成有层次结构分明的组织,这称之为角色。
Linux下安装ansible
安装完的ansible就是一个命令行工具,没有后台服务进程,无需启动任何后台进程。
注意:ansible需要Python2.7及以上版本。
# 1、有外网直接yum安装
yum install epel*
yum install ansible -y
# 2、没有外网,可以先在有外网的Linux服务器上下载rpm安装包,再传到服务器上安装
# yum下载rpm包到指定目录,只下载不安装
yum install --downloadonly --downloaddir=/tmp/ ansible
配置受控端免密登陆
ansible是基于ssh协议的,也就是说,ansible执行命令的时候登陆被控主机是需要账号密码进行认证了,为了方便管理,我们一般会做ssh免密登陆,如下所示:
#在ansible服务器上生成密钥对,下面的选项按回车默认即可
ssh-keygen -t rsa
#分发公钥给受控服务器
ssh-copy-id -i /root/.ssh/id_rsa.pub root@192.168.1.101
ssh-copy-id -i /root/.ssh/id_rsa.pub root@192.168.1.102
ssh-copy-id -i /root/.ssh/id_rsa.pub root@192.168.1.103
ansible主配置文件ansible.cfg讲解
yum安装好后的ansible配置文件默认在/etc/ansible/
下,如下所示:
[root@master ~]# cd /etc/ansible/
[root@master ansible]# ll
-rw-r--r-- 1 root root 19985 Jan 16 05:55 ansible.cfg #ansible的主配置文件
-rw-r--r-- 1 root root 1016 Jan 16 05:55 hosts #主机清单文件
drwxr-xr-x 2 root root 6 Jan 16 05:55 roles #角色目录
[root@master ansible]#
[root@master ansible]# cat ansible.cfg #下面讲解大部分配置选项的含义
[defaults] #默认配置
inventory = /etc/ansible/hosts #默认的主机清单文件为/etc/ansible/hosts
library = /usr/share/my_modules/ #库文件存放位置
module_utils = /usr/share/my_module_utils/ #默认模块文件目录
remote_tmp = ~/.ansible/tmp #ansible执行时被控主机脚本临时存放目录
local_tmp = ~/.ansible/tmp #管理节点脚本临时存放目录 ~/.ansible/tmp
plugin_filters_cfg = /etc/ansible/plugin_filters.yml #插件的配置文件
forks = 5 #ansible执行时的并发数,默认为5
poll_interval = 15 #ansible异步任务查询间隔 15
sudo_user = root #ansible sudo用户root
ask_sudo_pass = True #sudo 时是否要密码
ask_pass = True #sudo 时是否要密码
transport = smart #ansible远程传输模式 smart
remote_port = 22 #远程主机SSH端口22
module_lang = C #ansible模块运行默认语言环境C
module_set_locale = False #是否运行在Ansible playbook中使用模块来设置系统语言环境
roles_path = /etc/ansible/roles #默认role存放路径
host_key_checking = False #是否进行主机key检查,默认是检查,建议取消注释,如果你是第一
#次ssh登陆目标服务器默认会进行登陆检查,输出一大串字符,让你输
#入yes,当很多目标服务器时此项就会异常麻烦,所以建议取该注释
timeout = 10 #SSH连接超时时间,默认10s
log_path = /var/log/ansible.log #ansible默认日志记录文件,建议取消该项注释来启用日志记录
remote_user = root #使用playbooks未指定远程用户则默认是root,使
#用/usr/bin/ansible命令时默认当前登录的用户
module_name = command #指定ansible的默认模块
hosts主机清单文件讲解
ansible默认主机清单文件是/etc/ansible/hosts
,用于配置远程主机IP。
vim /etc/ansible/hosts
[db] #定义一个db组,这个组下有2个服务器,默认做了免密登陆
192.168.118.131
192.168.118.132
[nfs] #定义一个nfs组,这个组下有2个服务器,默认做了免密登陆
192.168.118.133
192.168.118.134
[backup] #定义一个backup组,这个组下有2个服务器,默认做了免密登陆
192.168.118.136
192.168.118.137
[master:children] #定义一个master组,这个master组下面有db、nfs、backup 3个组,使用children关键字,如下
db
nfs
backup
指定连接时使用的用户名和密码的设置3种方式:
1、在上面的例子中,直接写了ip地址,并没有指定用户名和密码,是因为我们在ansible主控端和受控主机之间做了免密登陆,而且直接使用ansible命令时默认远程主机的执行用户就是和当前管理端登录的用户一样
2、当在hosts文件中指定了受控主机的sshd端口则使用该端口,为指定则默认是配置文件里面的remote_port参数配置的端口
3、手动在组中指定连接用户名和密码和ssh端口,如下所示
#定义一个lb组,这个lb组的服务器如果没有做免密登陆,所以需要写上用户名和密码
[lb]
192.168.118.138 ansible_ssh_port=22 ansible_ssh_user=root ansible_ssh_pass="admin123"
192.168.118.139 ansible_ssh_port=22 ansible_ssh_user=root ansible_ssh_pass="admin123"
3、指定组或所有组都使用相同的用户名和密码
[lb]
192.168.118.138
192.168.118.139
[lb:vars] #vars是一个变量,前面lb是组名,表示lb组使用下面这些变量,这样就能实现lb组使用相同的用户名密码
ansible_ssh_port=22
ansible_ssh_user=root
ansible_ssh_pass="admin123"
[all:vars] #vars是一个变量,all表示全部的组使用下面这些变量,这样就能实现全部的组使用相同的用户名密码
ansible_ssh_port=22
ansible_ssh_user=root
ansible_ssh_pass="admin123"
我们比较推荐使用免密登陆的方式。