一. Ansible 介绍
Ansible是一个配置管理系统configuration management system, python 语言是运维人员必须会的语言, ansible 是一个基于python 开发的(集合了众多运维工具 puppet、cfengine、chef、func、fabric的优点)自动化运维工具, 其功能实现基于ssh远程连接服务, ansible 可以实现批量系统配置,批量软件部署,批量文件拷贝,批量运行命令等功能, 除了ansible之外,还有saltstack 等批量管理软件.
Ansible能做什么?
ansible可以帮助运维人员完成一些批量任务,或者完成一些需要经常重复的工作。
比如:同时在100台服务器上安装nginx服务,并在安装后启动服务。
比如:将某个文件一次性拷贝到100台服务器上。
比如:每当有新服务器加入工作环境时,运维人员都要为新服务器部署某个服务,也就是说运维人员需要经常重复的完成相同的工作。
这些场景中运维人员都可以使用到ansible。
Ansible软件特点?
ansible不需要单独安装客户端,SSH相当于ansible客户端。
ansible不需要启动任何服务,仅需安装对应工具即可。
ansible依赖大量的python模块来实现批量管理。
ansible配置文件/etc/ansible/ansible.cfg。
Ansible是一种agentless(基于ssh),可实现批量配置、命令执行和控制,基于Python实现的自动化运维工具。Ansible的两个特性:
- 模块化:通过调用相关模块,完成指定任务,且支持任何语言编写的自定义模块;
- playbook:剧本,可根据需要一次执行完剧本中的所有任务或某些任务;
Ansible 架构
a.连接插件(connectior plugins) 用于连接主机 用来连接被管理端。
b.核心模块(core modules) 连接主机实现操作, 它依赖于具体的模块来做具体的事情。
c.自定义模块(custom modules) 根据自己的需求编写具体的模块。
d.插件(plugins) 完成模块功能的补充。
e.剧本(playbooks)ansible的配置文件,将多个任务定义在剧本中,由ansible自动执行。
f.主机清单(host inventory)定义ansible需要操作主机的范围。
最重要的一点: ansible是模块化的, 它所有的操作都依赖于模块, 不需要单独安装客户端(no agents),基于系统自带的sshd服务,sshd就相当于ansible的客户端, 不需要服务端(no sever),需要依靠大量的模块实现批量管理, 配置文件 /etc/ansible/ansible.cfg (前期不用配置)。
Ansible架构图核心组件说明:
Ansible:Ansible的核心程序
Host Lnventory:记录了每一个由Ansible管理的主机信息,信息包括ssh端口,root帐号密码,ip地址等等。可以通过file来加载,可以通过CMDB加载
Playbooks:YAML格式文件,多个任务定义在一个文件中,使用时可以统一调用,“剧本”用来定义那些主机需要调用那些模块来完成的功能.
Core Modules:Ansible执行任何管理任务都不是由Ansible自己完成,而是由核心模块完成;Ansible管理主机之前,先调用core Modules中的模块,然后指明管理Host Lnventory中的主机,就可以完成管理主机。
Custom Modules:自定义模块,完成Ansible核心模块无法完成的功能,此模块支持任何语言编写。
Connection Plugins:连接插件,Ansible和Host通信使用
二、 Ansible 安装
环境准备
1
2
3
4
5
|
IP地址 主机名 角色 系统版本 172.16.50.68 ansible-server 主控节点 centos7.5 172.16.50.65 ansible-node01 受控节点1 centos7.5 172.16.50.66 ansible-node02 受控节点2 centos7.5 172.16.50.67 ansible-node03 受控节点3 centos7.5 |
进行主机名修改:命令:hostnamectl set-hostname XXX (hostnamectl set-hostname ansible-server)
1
2
3
4
|
[root@ansible-server ~] # hostnamectl set-hostname ansible-server [root@ansible-node01 ~] # hostnamectl set-hostname ansible-node01 [root@ansible-node02 ~] # hostnamectl set-hostname ansible-node02 [root@ansible-node03 ~] # hostnamectl set-hostname ansible-node03 |
设置主控节点到受控节点的
ssh
无密码信任关系 (ansible应用环境下, 主控节点必须要设置
ssh
无密码跳转到受控节点的信任关系)
1
2
3
4
5
6
7
|
添加主控节点到受控节点的认证! 首先主控节点必须要生成公私密钥对, 否则不能进行免密信任关系设置! [root@ansible-server ~] # ssh-keygen -t rsa //一直回车即可 [root@ansible-server ~] # ssh-copy-id -i /root/.ssh/id_rsa.pub -p22 root@172.16.50.65 //回车, 输入远程登录的密码即可 [root@ansible-server ~] # ssh-copy-id -i /root/.ssh/id_rsa.pub -p22 root@172.16.50.66 [root@ansible-server ~] # ssh-copy-id -i /root/.ssh/id_rsa.pub -p22 root@172.16.50.67 如果受控节点数量比较多的话, 可以使用expect进行远程 ssh 连接的免密信任关系, 具体可参考: https: //www .cnblogs.com /kevingrace/p/5900303 .html |
[root@ansible-server ~]# ssh-keygen -t rsa [root@ansible-server ~]# cat fenfa_pub_key.sh #批量处理 #!/bin/bash for ip in {111,112,114,115,116} do echo "================host 10.192.27.$ip pub-key start fenfa ==============" sshpass -p123123 ssh-copy-id -i /root/.ssh/id_rsa.pub root@10.192.27.$ip "-o StrictHostKeyChecking=no" &>/dev/null echo -e "host 10.192.27.$ip fenfa success." echo "================host 10.192.27.$ip fenfa end =========================" done [root@ansible-server ~]# bash fenfa_pub_key.sh
Ansible安装部署
Ansible有两种安装方式: yum 和 pip 安装方式。
1、yum方式安装
Ansible在epel的yum中有提供,所以配置好epel源,直接使用yum命令安装即可,CentOS系统, 可以使用默认的yum源直接安装ansible。
1
2
3
4
5
6
7
|
[root@ansible-server ~] # yum install -y ansible 配置文件目录: /etc/ansible/ 执行文件目录: /usr/bin/ Lib库依赖目录: /usr/lib/pythonX .X /site-packages/ansible/ Help文档目录: /usr/share/doc/ansible-X .X.X/ Man文档目录: /usr/share/man/man1/
/etc/ansible/ansible.cfg #ansible服务配置文件 |
[root@ansible-server ~]# vim /etc/ansible/hosts ... # Here's another example of host ranges, this time there are no # leading 0s: ## db-[99:101]-node.example.com 172.16.50.65 172.16.50.66 172.16.50.67 172.16.50.68 [root@ansible-server ~]# ansible all -a "hostname" 172.16.50.65 | CHANGED | rc=0 >> ansible-node01 172.16.50.66 | CHANGED | rc=0 >> ansible-node02 172.16.50.67 | CHANGED | rc=0 >> ansible-node03 172.16.50.68 | CHANGED | rc=0 >> ansible-server
2、pip方式安装
1
2
|
# yum -y install python-pip python-devel # pip install ansible |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
ansible程序文件 /usr/bin/ansible : 命令行工具 ansible命令通用格式: ansible <host-pattern> [options] [-m module_name] [-a args] /usr/bin/ansible-doc : 帮助文档 /usr/bin/ansible-playbook : 剧本执行工具 /etc/ansible/ansible .cfg: 主配置文件 /etc/ansible/hosts : 管理的主机清单 /etc/ansible/roles : 角色存放处 查看ansible命令帮助 [root@ansible-server ~] # ansible -h 查看支持的模块 [root@ansible-server ~] # ansible-doc -l [root@ansible-server ~] # ansible-doc -l|grep copy #查看copy模块 查看ansible的支持的模块个数 [root@ansible-server ~] # ansible-doc -l |wc -l 2080 查看ansible版本 [root@ansible-server ~] # ansible --version ansible 2.7.8 config file = /etc/ansible/ansible .cfg configured module search path = [u '/root/.ansible/plugins/modules' , u '/usr/share/ansible/plugins/modules' ] ansible python module location = /usr/lib/python2 .7 /site-packages/ansible executable location = /usr/bin/ansible python version = 2.7.5 (default, Apr 11 2018, 07:36:10) [GCC 4.8.5 20150623 (Red Hat 4.8.5-28)] |
linux主机性能变差 1、top htop 查看cup负载情况 2、free -h 查看内存负载情况 3. iotop 查看磁盘负载情况
ansible服务部署过程总结
a.安装服务软件
b.编写主机清单
c.进行管理测试
ansible服务特点说明
01.管理端不需要启动服务程序(no server)
02.管理端不需要编写配置文件(/etc/ansible/ansible.cfg)
03.受控端不需要安装软件程序
受控端selinux服务没有关闭---影响ansible软件的管理
libselinux-python让selinux开启的状态也可以使用ansible程序
04.受控端不需要启动服务程序(no agent)
05.服务程序管理操作模块众多(module)
06.利用剧本编写来实现自动化(playbook)
三、 Ansible常用命令简述
语法格式:
ansible <pattern_goes_here> -m <module_name> -a <arguments>
也就是:
ansible 匹配模式 -m 模块 -a '需要执行的内容'
解释说明:
匹配模式:即哪些机器生效 (可以是某一台, 或某一组, 或all) , 默认模块为command , 执行常规的shell命令.
-m name, --module-name=name: 指定执行使用的模块。
-u username, --user=username: 指定远程主机以username运行命令。
-s, --sudo: 相当于linux系统下的sudo命令。
-usudo_username, --sudo-user=sudo_username: 使用sudo, 相当于linux系统下的sudo命令。
-C, --check: 只检查不实际执行。
-e, 即extra_vars: 引用外部参数。
-i, 即inventory: 指定仓库列表, 默认/etc/ansible/hosts。
--list-host: 列出执行主机列。
补充说明:ansible执行结果输出的颜色说明 01.绿色信息:查看主机颜色/对主机未做改动 02.黄色信息:对主机数据信息做了修改 03.红色信息:命令执行出错了 04.粉色信息:忠告信息 05.蓝色信息:显示ansible命令执行的过程???
四、Ansible常用模块(23个)
ping 模块: 检查指定节点机器是否还能连通,用法很简单,不涉及参数,主机如果在线,则回复pong 。
raw 模块: 执行原始的命令,而不是通过模块子系统。
yum 模块: RedHat和CentOS的软件包安装和管理工具。
apt 模块: Ubuntu/Debian的软件包安装和管理工具。
pip 模块 : 用于管理Python库依赖项,为了使用pip模块,必须提供参数name或者requirements。
synchronize 模块: 使用rsync同步文件,将主控方目录推送到指定节点的目录下。
template 模块: 基于模板方式生成一个文件复制到远程主机(template使用Jinjia2格式作为文件模版,进行文档内变量的替换的模块。
copy 模块: 在远程主机执行复制操作文件。
user 模块 与 group 模块: user模块是请求的是useradd, userdel, usermod三个指令,goup模块请求的是groupadd, groupdel, groupmod 三个指令。
service 模块: 用于管理远程主机的服务。
get_url 模块: 该模块主要用于从http、ftp、https服务器上下载文件(类似于wget)。
fetch 模块: 它用于从远程机器获取文件,并将其本地存储在由主机名组织的文件树中。
file 模块: 主要用于远程主机上的文件操作。
lineinfile 模块: 远程主机上的文件编辑模块
unarchive模块: 用于解压文件。
command模块 和 shell模块: 用于在各被管理节点运行指定的命令. shell和command的区别:shell模块可以特殊字符,而command是不支持
hostname模块: 修改远程主机名的模块。
script模块: 在远程主机上执行主控端的脚本,相当于scp+shell组合。
stat模块: 获取远程文件的状态信息,包括atime,ctime,mtime,md5,uid,gid等信息。
cron模块: 远程主机crontab配置。
mount模块: 挂载文件系统。
find模块: 帮助在被管理主机中查找符合条件的文件,就像 find 命令一样。
selinux模块:远程管理受控节点的selinux的模块