最近有幸接触过一个自动化运维的项目,需要掌握的技术栈中就包括近年来越来越火的一款开源运维自动化工具——Ansible,通过Ansible可以实现运维自动化,提高运维工程师的工作效率,减少人为失误。因为小菌并不是运维方向的,所以在之前对Ansible了解几乎为零(主要还是因为自己菜),但这并不影响接下来,我以一个初学者的角度,为大家带来关于Ansible的入门教程。
看完本篇,你将收获:
在正式引入Ansible之前,我们先来看看传统运维和自动运维的差异。
运维工作是比较繁琐的,尤其是新系统上线的场景,一切都是从零开始。包括虚拟机的创建,主机名的修改,系统的初始化等等,在机器不多的情况下人工还能应付得过来,如果有上百台机器呢?最初也是用堆人的方法来做的。但这样的方式出错率高,而且有时还会有遗漏。只能通过相互检查的方式来验证,但这样就会花费更多的时间,相应的时间/人工成本也会上升。
人工的方式因个人部署习惯千差万别,导致一些项目难以维护。
运维自动化的目标也很明确,就是为了要实现这几件事:
配置自动化可以帮助企业在大量服务器存在的情况下,快速实现应用部署、软件配置等一大利器。通过配置自动化可以在如下方面有优异表现:
常见的配置自动化产品如下:
基于python语言。简单快捷,被管理端不需要启服务。直接使用ssh协议,需要验证所以机器多的话速度会较慢。
基于python语言。相对简单,大并发能力比ansible要好, 需要维护被管理端的服务。如果服务断开,连接就会出问题。它使用的协议是zeromq。
基于ruby语言,成熟稳定。适合于大型架构,相对于ansible和saltstack会复杂些。
有了一定的理论基础,接下来我们的Ansible就要隆重登场了
Ansible是一种由Python开发的自动化运维工具,集合了众多运维工具(puppet、cfengine、chef、func、fabric)的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能,是一款轻量级的配置自动化工具。
Ansible是基于模块工作的,本身没有批量部署的能力。真正具有批量部署的是ansible所运行的模块,ansible只是提供一种框架。主要包括:
(1) 连接插件 connection plugins:负责和被管控端实现通信;
(2) host inventory:指定操作的主机,是一个配置文件里面定义管控的主机;
(3) 各种模块核心模块、 command模块、自定义模块;
(4) 借助于插件完成记录日志邮件等功能;
(5) playbook:剧本执行多个任务时,可以让被管控端一次性运行多个任务;
(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:可实现多级指挥;
(1) 轻量级,无需在客户端安装 agent,更新时,只需在操作机上进行一次更新即可;
(2) 批量任务执行可以写成脚本,而且不用分发到远程就可以执行;
(3) 使用python编写,维护更简单,ruby语法过于复杂;
(4) 支持sudo;
Ansible的架构,主要分为以下几部分内容:
实现原理:ansible通过单个模块或者playbook转换成python程序经过ssh协议,推送到各个主机上
知晓了Ansible的原理介绍,我们来学习如何安装Ansible。
hostnamectl set-hostname node01
hostnamectl set-hostname node02
hostnamectl set-hostname node03
192.168.100.100 node01
192.168.100.110 node02
192.168.100.120 node03
firewalld
systemctl disable firewalld
systemctl stop firewalld
selinux
sed -ri 's/SELINUX=enforcing/SELINUX=disabled/'
/etc/selinux/config
# crontab -e 需安装ntpdate软件
0 */1 * * * ntpdate time1.aliyun.com
除自带YUM源外,需要为管理机(操作机)准备epel源
yum -y install epel-release
管理机(操作机)及被操作机均需开启ssh
systemctl status sshd
免密登录证书准备
# 生成密钥对
ssh-keygen
# 复制密钥对中的公钥到被操作机
ssh-copy-id node02
ssh-copy-id node03
ansible只需要在ansible controller节点(操作机)安装即可,其它节点可以直接通过SSH协议进行连接操作。
而安装有两种方式:
yum install ansible
pip install ansible
安装完毕,我们可以通过ansible --version
来查看我们的ansible的版本
[root@node01 ansible]# ansible --version
ansible 2.6.20
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.6/site-packages/ansible
executable location = /usr/bin/ansible
python version = 2.6.6 (r266:84292, Jun 20 2019, 14:14:55) [GCC 4.4.7 20120313 (Red Hat 4.4.7-23)]
到这里,我们的ansible就安装成功啦~
ansible controller在对主机进行操作时,仅认主机清单中定义的主机列表,即从主机清单中读取到主机列表时,才可进行配置。
所以接下来,我们要在管理机(被操作机)配置主机清单
/etc/ansible/hosts
配置的形式大家可以参照下面的例子:
[nginx1] 组名
apache[1:10].aaa.com 表示apache1.aaa.com到apache10.aaa.com这10台机器
nginx[a:z].aaa.com 表示nginxa.aaa.com到nginxz.aaa.com共26台机器
10.1.1.[11:15] 表示10.1.1.11到10.1.1.15这5台机器
[nginx2] 组名
10.1.1.13:2222 表示10.1.1.13这台服务器,但ssh端口为2222
需要注意的是,在Ansible的主机清单中配置组名的目的是为了我们执行ansible命令时,可以通过调用组名的方式,同时操作多台服务器。
ansible <host-pattern> [-f forks] [-module_name] [-a args]
说明:
host-pattern:host inventory文件的一个组名,可以为all
-f forks:并行处理的个数,默认为5
-m module_name:模块名,默认为command
-a args:参数
给大家举个栗子:
我在node01节点执行下面的命令,就可以把node02节点下/export/servers
下的文件或目录展示出来:
[root@node01 ansible]# ansible 192.168.100.110 -m command -a 'ls /export/servers/'
192.168.100.110 | SUCCESS | rc=0 >>
apache-flume-1.8.0-bin
flink-1.7.2
hadoop-2.6.0
hadoop-2.6.0-cdh5.14.0
hbase-1.2.0-cdh5.14.0
hive-1.1.0-cdh5.14.0
jdk1.8.0_144
kafka_2.11-1.0.0
redis-3.2.8
spark
zookeeper-3.4.5-cdh5.14.0
zookeeper.out
再来点有趣的,我们都知道 Ansible 是通过一个主机清单 功能来实现服务器分组,那如果我们除了用分组的方式操作多台服务器外,能否通过正则表达式的方式来对IP进行匹配呢?
毫无疑问,是可以的。
假设我们现在的host文件中有如下配置:
all
或 *
2.通配符*
和逻辑或 :
大家是不是一看见这么多模块都开始慌了~不要慌哈,在开始之前,菌哥来谈谈关于学习模块使用的经验分享:
说起来也很简单,就是先掌握常见的模块使用,其它模块用到时查询即可,主要掌握Ansible模块应用思路即可!
说了那么多,接下来让我们来看看关于Ansible模块的使用:
ansible-doc -l
ansible-doc ping
ansible all -m ping
ansible all -m command a "uptime"
ansible all -m shell -a "cat /dev/null > /var/log/nginx/access.log"
ansible all -m yum -a "name=telnet state=present"
ansible all -m service -a "name=nginx state=restarted"
echo master > /tmp/222
ansible group1 -m copy -a 'src=/tmp/222 dest=/tmp/333
ansible java -m file "src=/usr/java/jdk1.7 dest=/usr/java/jdk state=link owner=root group=root"
…
类似的模块还有非常多,这里就不一一为大家列举了,菌哥双手为大家奉上官方文档,感兴趣的朋友可以多了解一下。
测试网络连通性
ansible group1 -m ping
#或
ansible -m ping all
修改主机名
ansible 192.168.100.120 -m hostname -a 'name=agent1.alice.cn'
对文件或目录操作
创建一个目录
ansible group1 -m file -a 'path=/test state=directory'
创建一个文件
ansible group1 -m file -a 'path=/test/111 state=touch'
文件远程拷贝,把本地文件复制到远程主机。
echo master > /tmp/222
ansible group1 -m copy -a 'src=/tmp/222 dest=/tmp/333'
执行命令模块
ansible group1 -m command -a "ls /tmp"
1、https://docs.ansible.com/ansible/ Ansible官方网站 2、http://www.ansible.com.cn/docs/ Ansible权威指南(中文官方网站) 3、https://max.book118.com/html/2019/0906/8107016113002046.shtm Ansible自动化运维实践 4、http://yun.itheima.com/open/526.html 2小时玩转Ansible 企业级自动化运维工具 5、https://www.cnblogs.com/guxiong/p/7218717.html Ansible安装配置
相信看到这里的朋友,都是菌哥的真爱粉了,那不送小伙伴们点福利怎么行!关注『 猿人菌 』,后台回复“思维导图”,获取菌哥亲绘精美思维导图,货真价实,先到先得哦~
本篇文章到这里就结束了,说实话,为了准备这么一篇文章,笔者足足准备了好几台。希望各位朋友能三连支持一下,我们下一篇文章将介绍Ansible更深入的内容,具体是什么,留个悬念!你知道的越多,你不知道的也越多,我是Alice,我们下一期见!
文章持续更新,可以微信搜一搜「 猿人菌 」第一时间阅读,思维导图,大数据书籍,大数据高频面试题,海量一线大厂面经…期待您的关注!