零基础带你硬核了解并上手“Ansible“!

前言

        最近有幸接触过一个自动化运维的项目,需要掌握的技术栈中就包括近年来越来越火的一款开源运维自动化工具——Ansible,通过Ansible可以实现运维自动化,提高运维工程师的工作效率,减少人为失误。因为小菌并不是运维方向的,所以在之前对Ansible了解几乎为零(主要还是因为自己菜),但这并不影响接下来,我以一个初学者的角度,为大家带来关于Ansible的入门教程。

        看完本篇,你将收获:

  • 传统运维和自动运维的差异
  • 常见的运维配置自动化工具
  • Ansible的特点,架构,任务执行流程
  • Ansible的环境准备与安装配置
  • Ansible的语法
  • Ansible常用的模块及使用

在这里插入图片描述


IT运维管理

        在正式引入Ansible之前,我们先来看看传统运维和自动运维的差异。

传统运维

传统运维带来的坑

        运维工作是比较繁琐的,尤其是新系统上线的场景,一切都是从零开始。包括虚拟机的创建,主机名的修改,系统的初始化等等,在机器不多的情况下人工还能应付得过来,如果有上百台机器呢?最初也是用堆人的方法来做的。但这样的方式出错率高,而且有时还会有遗漏。只能通过相互检查的方式来验证,但这样就会花费更多的时间,相应的时间/人工成本也会上升

        人工的方式因个人部署习惯千差万别,导致一些项目难以维护。

在这里插入图片描述

自动运维

运维自动化的演进

  • 没有专门的工具为我们做这些事情,我们可以使用脚本语言(Python)
  • 逐渐有了运维自动化的一些工具,比如 Fabric,Puppet,Chef,SaltStack,Ansible等等
  • 逐渐形成一个自动化运维平台

在这里插入图片描述
        运维自动化的目标也很明确,就是为了要实现这几件事:

  • 某某组件坏了可以不用管继续睡觉
  • 出现异常时点击一下就可以立即恢复
  • 与监控配合,系统挂了可以自动恢复

        配置自动化可以帮助企业在大量服务器存在的情况下,快速实现应用部署、软件配置等一大利器。通过配置自动化可以在如下方面有优异表现:

  1. 提高配置效率
  2. 提高配置的准确性
  3. 降低人工参与度

        常见的配置自动化产品如下:

  • ansible

        基于python语言。简单快捷,被管理端不需要启服务。直接使用ssh协议,需要验证所以机器多的话速度会较慢。

  • saltstack

        基于python语言。相对简单,大并发能力比ansible要好, 需要维护被管理端的服务。如果服务断开,连接就会出问题。它使用的协议是zeromq。

  • puppet

        基于ruby语言,成熟稳定。适合于大型架构,相对于ansible和saltstack会复杂些

        有了一定的理论基础,接下来我们的Ansible就要隆重登场了

Ansible

初始Ansible

在这里插入图片描述
        Ansible是一种由Python开发的自动化运维工具,集合了众多运维工具(puppet、cfengine、chef、func、fabric)的优点,实现了批量系统配置批量程序部署批量运行命令等功能,是一款轻量级的配置自动化工具

        Ansible是基于模块工作的,本身没有批量部署的能力。真正具有批量部署的是ansible所运行的模块,ansible只是提供一种框架。主要包括:

        (1) 连接插件 connection plugins:负责和被管控端实现通信;

        (2) host inventory:指定操作的主机,是一个配置文件里面定义管控的主机;

        (3) 各种模块核心模块、 command模块、自定义模块

        (4) 借助于插件完成记录日志邮件等功能;

        (5) playbook:剧本执行多个任务时,可以让被管控端一次性运行多个任务;

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优点

        (1) 轻量级,无需在客户端安装 agent,更新时,只需在操作机上进行一次更新即可;

        (2) 批量任务执行可以写成脚本,而且不用分发到远程就可以执行;

        (3) 使用python编写,维护更简单,ruby语法过于复杂;

        (4) 支持sudo;

Ansible 架构

在这里插入图片描述

        Ansible的架构,主要分为以下几部分内容:

  • ansible:核心,提供一种框架
  • Connection Plugins:连接插件,负责和被操作端实现通信,可通过多种方式与被操作端连接,例如:local、ssh、zeromq,默认使用ssh;
  • Host Inventory:主机清单,指定被操作主机;
  • Core Modules:各种模块核心模块,Ansible已自带
  • Custom Modules:自定义模块,如果核心模块无法满足需求,可通过各种编程语言(Shell,Python或GoLang等)开发模块使用。
  • Plugins:借助于插件完成记录日志、邮件等功能;
  • Playbook:剧本,当执行多个任务时,可以对服务器角色及应用部署进行编排。

        实现原理:ansible通过单个模块或者playbook转换成python程序经过ssh协议,推送到各个主机上

Ansible任务执行流程

在这里插入图片描述

        知晓了Ansible的原理介绍,我们来学习如何安装Ansible。

环境准备

  • 主机ip配置,主机名设置
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源

        除自带YUM源外,需要为管理机(操作机)准备epel源

yum -y install epel-release
  • 提示

        管理机(操作机)及被操作机均需开启ssh

systemctl status sshd

        免密登录证书准备

# 生成密钥对
ssh-keygen
# 复制密钥对中的公钥到被操作机
ssh-copy-id node02
ssh-copy-id node03

Ansible的安装配置

        ansible只需要在ansible controller节点(操作机)安装即可,其它节点可以直接通过SSH协议进行连接操作。

        而安装有两种方式:

  • 使用 yum 安装(推荐)- 版本稍旧

        yum install ansible

  • 使用 pip 安装(依赖pipi,gcc等)- 版本较新
    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在对主机进行操作时,仅认主机清单中定义的主机列表,即从主机清单中读取到主机列表时,才可进行配置。

        所以接下来,我们要在管理机(被操作机)配置主机清单

  • Ansible通过一个主机清单功能来实现服务器分组
  • Ansible的默认主机清单配置文件为/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的语法

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文件中有如下配置:

在这里插入图片描述

  1. 表示所有的主机使用 all*

在这里插入图片描述

2.通配符*和逻辑或 :

在这里插入图片描述

  1. 逻辑非和逻辑与

在这里插入图片描述

Ansible模块

  • ansible是基于模块工作的。
  • ansible本身没有批量管理的能力, 真正具有批量管理的是ansible所运行的模块。
  • ansible支持的模块非常的多,目前版本3000多个。

        大家是不是一看见这么多模块都开始慌了~不要慌哈,在开始之前,菌哥来谈谈关于学习模块使用的经验分享:

        说起来也很简单,就是先掌握常见的模块使用,其它模块用到时查询即可,主要掌握Ansible模块应用思路即可!

        说了那么多,接下来让我们来看看关于Ansible模块的使用:

查看支持模块

ansible-doc -l

支持的模块非常多,这里只截取部分

获取模块帮助

ansible-doc ping

在这里插入图片描述

常用模块

  • ping 测试网络连通性

        ansible all -m ping

  • command 执行命令(不能执行$HOME,>,<,|)

        ansible all -m command a "uptime"

  • shell 执行命令(不能执行vim、ll别名等)

        ansible all -m shell -a "cat /dev/null > /var/log/nginx/access.log"

  • yum 软件包管理

        ansible all -m yum -a "name=telnet state=present"

  • service 服务管理

        ansible all -m service -a "name=nginx state=restarted"

  • copy 模块 复制本地文件到远程主机

        echo master > /tmp/222
        ansible group1 -m copy -a 'src=/tmp/222 dest=/tmp/333

  • file 对文件或目录操作

        ansible java -m file "src=/usr/java/jdk1.7 dest=/usr/java/jdk state=link owner=root group=root"

        类似的模块还有非常多,这里就不一一为大家列举了,菌哥双手为大家奉上官方文档,感兴趣的朋友可以多了解一下。

官方文档地址:https://docs.ansible.com/ansible/latest/index.html

初露锋芒

ping 模块

测试网络连通性

ansible group1 -m ping
#或
ansible -m ping all

hostname模块

修改主机名

ansible 192.168.100.120 -m hostname -a 'name=agent1.alice.cn'

file模块

对文件或目录操作

创建一个目录

ansible group1 -m file -a 'path=/test state=directory'

创建一个文件

ansible group1 -m file -a 'path=/test/111 state=touch'

copy模块

文件远程拷贝,把本地文件复制到远程主机。

echo master > /tmp/222
ansible group1 -m copy -a 'src=/tmp/222 dest=/tmp/333'

command模块

执行命令模块

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,我们下一期见!

文章持续更新,可以微信搜一搜「 猿人菌 」第一时间阅读,思维导图,大数据书籍,大数据高频面试题,海量一线大厂面经…期待您的关注!

大数据梦想家 CSDN认证博客专家 CSDN博客专家 大数据学者 追梦人
大数据学者,坚信技术成就自我。
个人原创公众号「 大数据梦想家 」,每日更新大数据干货,欢迎上车!
一天的生活就是一生的缩影。在最美的年华,做最好的自己!!!
已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 代码科技 设计师:Amelia_0503 返回首页