微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Ansible自动化运维工具

随着移动互联网、物联网、互联网+、大数据、云计算等大规模的应用,以及人们日常生活中的互联网化、互联网也逐渐地普及千家万户。互联网的发展不仅影响我们的生活,同时也影响了整个经济体。在体验互联网带来便利的同时,人们也不再满足于“可以用”,而“用的简单和方便”称为人们生活的标准。在国家政策、需求、利益的趋势下,互联网的发展 速度可想而知。众所周知,智能的背后意味着复杂、意味着运维工程师的工作量加大,这一现象在互联网的发展中体现的淋漓尽致!

在互联网迅速发展的同时,运维这个工作岗位也从无闻的后台逐步走向公众的视野,被更多人所知晓。早期的互联网公司中服务器数量有十台、几十台的规模已经非常庞大,运维工程师同时操作十几乃至二十台机器,勉强可以完成。但是如何保证每个人的操作都完全一致呢?又如何保证所有的操作都能准确无误?今天的互联网公司,像淘宝、京东、腾讯等这样的大企业,拥有几十台甚至上百台机器早已不是什么稀奇的事,再沿用传统的办法逐台维护已然不现实。在这样的背景下,运维自动化应运而生!

运维自动化工具有很多,不过现在使用最广泛的就是——Ansible

这篇博文主要介绍的内容有:

  • 理解Ansible工作机制;
  • 掌握Ansible的常用模块;
  • 编写Playbook文件实现自动化运维

理论部分初学者向来都是不愿了解的,大部分都是“我知道怎么配置,就行了!”、“等用到的时候再上网上查资料”。不过,真正能够掌握一个工具,最重要的就是了解它的工作原理,及相关的配置!如果不了解它的工作原理,如果某一天服务出现异常情况,哪些不明白其工作原理的人,就是“两眼一抹黑”,排错也不知道从何下手。所以,大家就知道了解并掌握工具背后的工作原理是多么重要了!

一、Ansible概述

Ansible是近年越来越火的一款开源运维自动化工具,通过Ansible可以实现运维自动化,提高运维工程师的工作效率,减少人为的失误。Ansible通过本身集成的非常丰富的模块实现各种管理任务,其自带模块超多上千个。更为重要的是,它的操作非常简单,即使新手也比较容易上手,但它提供的功能确实非常丰富,在运维领域,它几乎可以做任何事。

Ansible自2012年发布以来,很快在全球流行。其特点表现如下:

  • Ansible自动化运维工具是开源的;
  • Ansible操作非常简单,即使新手也非常容易上手;
  • Ansible基于Python开发,运维工程师对其二次开发相对较容易;
  • Ansible丰富的内置模块,基本上可以满足一切需求;
  • 管理模式非常简单,一条命令可以影响上千台机器;
  • 无客户端模式,底层通过SSH通信;
  • Ansible发布后,也陆续被AWS、Google Cloud Platform、Microsoft Azure、Cisco、HP、VMware、Twitter等大公司接纳并投入使用;

Ansible没有客户端,所以不需要在被管理主机添加代理程序,通过SSH完成底层通信,而SSH在Linux的发行版本中认已经安装并启用。而在Windows系统下,则依赖于PowerShell,Ansible要求管理端必须是Linux系统,在管理节点通过应用模块将指令发送到被管理主机上,并在执行完毕后自动删除产生的临时文件

根据Ansible使用霍城中的不同橘色,可将其分为以下三部分:

  • 使用者:如何使用Ansible实现自动化运维
  • Ansible工具集:Ansible可以实现的功能
  • 作用对象:Ansible可以影响哪些主机?

1.使用者

Ansible自动化运维工具

如图所示:Ansible使用者可以采用多种方式和Ansible交互,图中展示了四种方式:

  • CMDB:CMDB存储和管理者企业IT架构中的各项配置信息,是构建ITIL项目的核心工具,运维人员可以组合CMDB和Ansible,通过CMDB直接下发指令调用Ansible工具集完成操作者所希望达到的目标;
  • PUBLIC/PRIVATE方式:Ansible除了丰富的内置模块外,同时还提供丰富的API语言接口,如PHP、Python、PERL等多种流行语言,基于PUBLIC/PRIVATE,Ansible以API调用的方式运行;
  • Ad-Hoc命令集:Users直接通过Ad-Hoc命令集调用Ansible工具集来完成任务;
  • Playbooks:Users预先编写好Ansible Playbooks,通过执行Playbooks中预先编排好的任务集,按序执行任务;

2.Ansible工具集

Ansible工具集包含Inventory、Modules、Plugins和API。其中:

  • Inventory:用来管理设备列表,可以通过分组实现,对组的调用直接影响组内的所有主机;
  • Modules:是各种执行模块,几乎所有的管理任务都是通过模块执行的;
  • Plugins:提供了各种附加功能
  • API:为编程人员提供一个接口,可以基于此做Ansible的二次开发;

具体表现如下:

  • Ansible Playbooks:任务脚本,编排定义Ansible任务及的配置文件,由Ansible按序依次执行,通常是JSON格式的YML文件
  • Inventory:Ansible管理主机清单;
  • Modules:Ansible执行命令功能模块,多数为内置的核心模块,也可自定义
  • Plugins:模块功能的补充,如连接类型插件、循环插件、变量插件、过滤插件等,该功能不太常用;
  • API:供第三方程序调用的应用程序编程接口;
  • Ansible:该部分图中表现得不太明显,组合Inventory、API、Modules、Plugins可以理解为是Ansible命令工具,其为核心执行工具;

3.作用对象

Ansible的作用对象不仅仅是Linux和非Linux操作系统的主机,也可以作用于各类PUBLIC/PRIVATE、商业和非商业设备的网络设施。

使用者使用Ansible或Ansible-Playbooks时,在服务器终端输入Ansible的Ad-Hoc命令集或Playbooks后,Ansible会遵循预选安排的规则将Playbooks逐步拆解为Play,再将Play组织成Ansible可以识别的任务,随后调用任务涉及的所有模块和插件,根据Inventory中定义的主机列表通过SSH将任务集以临时文件或命令的形式传输到远程客户端执行并返回执行结果,如果是临时文件则执行完毕后自动删除

二、Ansible的配置

1.Ansible安装

Ansible的安装部署非常简单,以RPM安装为例,其依赖软件只有Python和SSH,且系统认均已安装。Ansible的管理端只能是Linux,如Redhat、Debian、Centos。本次实验以CentOS Linux release 7.3.1611 为例:

1)通过YUM安装Ansible

实验环境可以从互联网上直接下载所需软件包,本篇博客提供安装Ansible自动化运维工具所需的依赖软件包,网盘链接链接https://pan.baidu.com/s/1l47WxsEpq99lYmxsVTUQMg
提取码:axmg
如果使用本人提供的网盘链接,自己建立yum配置文件,挂载光盘这些就不说了啊,毕竟太基础了!使用互联网直接安装即可(实验环境建议防火墙和SELinux都关闭)!

[root@localhost ~]# yum -y install ansible
//安装Ansible自动化运维工具

2)验证安装结果

[root@localhost ~]# ansible --version
ansible 2.3.1.0
  config file = /etc/ansible/ansible.cfg
  configured module search path = Default w/o overrides
  python version = 2.7.5 (default, Nov  6 2016, 00:28:07) [GCC 4.8.5 20150623 (Red Hat 4.8.5-11)]
//如果命令可以正常执行,则表示Ansible工具安装成功!

3)创建SSH免交互登录

Ansible通过SSH对设备进行管理,而SSH包含两种认证方式:一种是通过密码认证,另一种是通过密钥对验证。密码验证必须和系统交互;而密钥对验证则是免交互式登录。如果希望通过Ansible自动管理设备,应该配置为免交互式登录被管理设备。如果对SSH免交互式登录不太了解的朋友可以参考博文:Linux远程访问及控制 里面有详细的介绍,这里就不详细介绍了!

[root@localhost ~]# ssh-keygen -t rsa                            //生成密钥对
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):                //密钥对存放路径
Created directory '/root/.ssh'.
Enter passphrase (empty for no passphrase):                           
//输入私钥保护密码,直接按Enter键表示无密码
Enter same passphrase again:                                      //再次输入
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
36:9f:34:06:b2:d4:7d:64:81:34:9e:8c:a2:fd:6b:27 [email protected]
The key's randomart image is:
+--[ RSA 2048]----+
|         .o.+.   |
|       . =.=     |
|      + + = .    |
|     + + . .     |
|    . o S +      |
|       o = o     |
|        . o      |
|        E..      |
|       ..o       |
+-----------------+
[root@localhost ~]# ssh-copy-id [email protected]               //复制公钥到远端192.168.1.2
The authenticity of host '192.168.1.2 (192.168.1.2)' can't be established.
ECDSA key fingerprint is 25:54:5c:d5:ce:e1:04:9f:25:19:be:73:ce:93:86:54.
Are you sure you want to continue connecting (yes/no)? yes
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted Now it is to install the new keys
[email protected]'s password:                              //输入远端root密码

Number of key(s) added: 1

Now try logging into the machine, with:   "ssh '[email protected]'"
and check to make sure that only the key(s) you wanted were added.

[root@localhost ~]# ssh-copy-id [email protected]
The authenticity of host '192.168.1.3 (192.168.1.3)' can't be established.
ECDSA key fingerprint is 2b:03:6d:2b:d0:14:69:35:8b:7f:44:80:9a:a5:94:8a.
Are you sure you want to continue connecting (yes/no)? yes
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted Now it is to install the new keys
[email protected]'s password: 

Number of key(s) added: 1

Now try logging into the machine, with:   "ssh '[email protected]'"
and check to make sure that only the key(s) you wanted were added.

[root@localhost ~]# ssh 192.168.1.2                           //测试是否可以不需要密码直接登录
Last login: Wed Oct  9 21:26:24 2019 from 192.168.1.200
[root@localhost ~]# exit
登出
Connection to 192.168.1.2 closed.
[root@localhost ~]# ssh 192.168.1.3
Last login: Wed Oct  9 21:26:28 2019 from 192.168.1.200
[root@localhost ~]# exit
登出
Connection to 192.168.1.3 closed.

至此,已经完成Ansible的部署,接下来就可以通过Ansible对设备进行管理了。

2.Ansible配置

Inventory是Ansible管理主机信息的配置文件,相当于系统Hosts文件功能认存放在/etc/ansible/hosts。在hosts文件中,通过分组来组织设备,Ansible通过Inventory来定义主机和分组,通过在ansible命令中使用选项-i或--inventory-file来指定Inventory。比如:

[root@localhost ~]# ansible -i /etc/ansible/hosts web -m ping

如果使用认的Inventory文件(/etc/ansible/hosts),也可以不指定Inventory文件,比如:

[root@localhost ~]# ansible web -m ping

Ansible通过设备列表以分组的方式添加到/etc/ansible/hosts文件来实现对设备的管理,所以在正式管理之前,首先要编写好hosts文件。hosts文件中,以[ ]包含的部分代表组名,设备列表支持主机名和IP地址。认情况下,通过访问22端口(SSH)来管理设备。若目标主机使用了非认的SSH端口,还可以在主机名称之后使用冒号加端口标明,以行为单位分隔配置。另外,hosts文件支持通配符。如下:

[root@localhost ~]# vim /etc/ansible/hosts
                                                                …………                 //省略部分内容,根据实际情况填写以下内容
[web]
192.168.1.2
192.168.1.3
[test]
www.benet.com:222                              //通过222端口管理设备

如果只是域名中的数字不一样,其他都一样可以使用[2:5]来表示从2到5的主机!

可以将一个主机同时归置在不同的组中。

配置完成之后,可以针对hosts定义的组进行远程管理,也可以针对组中的某一个或多个主机操作。比如:
(1)只对web组中192.168.1.2主机操作,通过--limit参数限定主机的变更:

[root@localhost ~]# ansible web -m command -a "systemctl status httpd" --limit "192.168.1.2"
192.168.1.2 | SUCCESS | rc=0 >>
//看到SUCCESS就知道成功了,所以以下内容
//如果测试httpd服务,被测试主机必然已经安装并启动了httpd服务

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐