暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Ansible自动化运维

徐阿马 2020-12-18
652

会不会有那么一天,生活可以简单到每天清早踏上一辆载着鲜花的脚踏车,微笑着穿过窄窄的街巷,为爱花的人送去芬芳,为需要知识的你送去帮助。


简介

        随着移动互联网、物联网、互联网+、大数据、云计算等大规模的应用。以及人们日常生活中的互联网化,互联网也逐渐地普及千家万户。互联网的发展不仅影响我们的生活,同时也影响了整个经济体。在体验互联网带来便利的同时,人们也不再满足于“可以用”,而“用得简单和方便”成为人们生活的标准。在国家政策、需求、利益的趋势下,互联网的发展速度可想而知。众所周知,智能的背后意味着复杂,意味着运维工程师的工作量加大,这一现象在互联网的发展中体现得淋漓尽致。在互联网迅速发展的同时,运维这个工作岗位也从默默无闻的后台逐步走向公众的视野,被更多的人所知晓。早期的互联网公司中服务器数量有十台、几十台的规模已经非常庞大,运维工程师同时操作十几乃至二十台机器,勉强可以完成。但是如何保证每个人的操作都完全一致呢?又如何保证所有的操作都能准确无误?今天的互联网公司,像淘宝、京东、腾讯等企业,拥有几十台甚至上百台机器早已不稀奇,再沿用传统的办法逐台维护已然不现实。在这样的背景下,运维自动化应运而生,而Ansible则是实现运维自动化的非常优秀的一款工具。


本章重点

  • 理解Ansible工作机制

  • 掌握Ansible的常用模块

  • 编写Playbook文件实现自动化运维



                            理论讲解

一.Ansible 概述

        Ansible是近年越来越火的一款开源运维自动化工具,通过Ansible可以实现运维自动化,提高运维工程师的工作效率,减少人为的失误。Ansible通过本身集成的非常丰富的模块实现各种管理任务。

        其自带模块超过上千个。更为重要的是,它的操作非常简单,即使新手也比较容易上手,但它提供的功能却非常丰富,在运维领域,它几乎可以做任何事情。


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

  • Ansible基于Python开发,运维工程师对其二次开发相对较容易。

  • Ansibled丰富的内置模块,基本可以满足一切需求。

  • 管理模式非常简单,一条命令可以影响上千台机器。

  • 无客户端模式,底层通过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.使用者


  • CMDB:CVMDB存储和管理着企业IT架构中的各项配置信息,是构建ITL项目的核心工具,运维人员可以组合CMDB和Ansible,通过CMDB直接下发指令调用Ansible工具集完成操作者所希望达到的目标。

  • PUBLIC/PRIVATE方式:Ansible除了丰富的内置模块外,同时提供丰富的API语言接口,如PHP、Python、PERL等多种流行语言,基于PUBLIC/PRIVATE,Ansible以APl调用的方式运行。

  • Ad-Hoc 命令集:Users 直接通过Ad-Hoc命令集调用Ansible工具集来完成任务。

  • Playbooks:Users 预先编写好Ansible Playbooks,通过执行Playbooks中预先编排好的任务集,按序执行任务。


2.Ansible工具集

        Ansible 工具集包含hventory.Moodules.Plugins和APl.其中,Inventory用来管理设备列表,可以通过分组实现,对组的调用直接影响组内的所有主机;Modules是各种执行模块,几乎所有的管理任务都是通过模块执行的;Plugins提供了各种附加功能;APl为编程人员提供一个接口,可以基于此做Ansible的二次开发。具体表现如下。

  • Ansible Playbooks:任务脚本,编排定义Ansible任务集的配置文件,由Ansible 按序依次执行。通常是JSON格式的YML文件。

  • Inventory:Ansible管理主机清单。

  • Modules:Ansible执行命令功能模块,多数为内置的核心模块,也可以自定义。

  • Plugins:模块功能的补充,如连接类型插件、循环插件、变量插件、过滤插件等,该功能不常用。

  • APl:供第三方程序调用的应用程序编程接口。

  • Ansible:该部分图中表示得不明显,组合Inventory、APl、Modules,Plugins 可以理解为是Ansible命令工具,其为核心执行工具。



3.作用对象

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

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



实验环境:

主机名
IP地址角色
centos01
192.168.100.10Ansible服务器机
centos02192.168.100.20被动配置服务器
centos03192.168.100.30被动配置服务器
centos04192.168.100.40被动配置服务器


二,Ansible的配置

1.Ansible安装

        接下来我们来学习Ansible的安装部署。Ansible的安装部署非常简单,以RPM安装为例,其依赖软件只有Python和SSH,且系统默认均已安装。Ansible的管理端只能是Linux,如Redhat、Debian.

Centos。

1)通过YUM安装Ansible复制提供的ansiblerepo文件夹到Linux本地目录,并设置为yum仓库。然后安装软件。



2)验证安装结果

如上述命令能正常执行,表示Ansible安装成功,并可正常使用。

3)创建SSH免交互登录


        Ansible通过SSH对设备进行管理,而SSH包含两种认证方式:一种是通过密码认证,另一种是通过密钥对认证。前者必须和系统交互,而后者是免交互登录。如果希望通过Ansible自动管理设备。应该配置为免交互登录被管理设备。

测试是否能够远程登录    

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


2.Ansible安装


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

也可以使用如下方法:

192.168.100.[2:4]0的意思就是表示2~4之间的所有数字,也就是192.168.100.20  192.168.100.30  192.168.100.40

也可以使用域名来进行管理

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

配置完成后,可以针对hosts定义的组进行远程操作,也可以针对组中指定的某一个或多个主机操作。


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

如果使用默认的Inventory文件(/etc/ansible/hosts)也可以不指定hventory文件。例如:


(1)只对web组中192.168.100.20主机操作。通过--limit参数限定主机的变更。

(2)只对192.168.100.30主机操作。通过ip限定主机的变更。

(3)只对192.168.100.0网段主机操作。通过通配符限定主机的变更。

(4)只对web组中192.168.100.20和192.168.100.30主机操作。通过--limit参数限定主机的变更

(5)只对192.168.100.20和192.168.100.30主机操作。通过ip限定主机的变更。


三,Ansible命令

        Ansible的维护命令大多以ansible开头,在终端输入ansible后连续按两次Tb键,会补全所有以ansible字母开头的命令。下面介绍Ansible的一些常用命令。


1.ansible

        ansible是生产环境中使用非常频繁的命令之一,主要在以下场景使用。

  • 非固化需求。

  • 临时一次性操作。

  • 二次开发接口调用。


        非固化需求是指临时性的维护,如查看web服务器组磁盘的使用情况、复制一个文件到其他机器等。类似这些没有规律的、临时需要做的任务,我们称为非固化需求,临时一次性操作。语法如下。

可用选项如下:

  • -v(--verbose):输出详细的执行过程信息,可以得到执行过程所有信息。

  • -i PATH(--inventory=PATH):指定inventory 信息,默认为/etc/ansible/hosts。

  • -f NUM(--forks=NUM):并发线程数,默认为5个线程。

  • --private-key=PRIVATE_KEY_FLE:指定密钥文件。

  • -m NAME,--module-name=NAE:指定执行使用的模块。

  • -MDIRECTORY(--module-path=DIRECTORY):指定模块存放路径,默认为/usr/share/ansible,也可以通过ANSIBLE_LIBRARY 设定默认路径。

  • -a ARGUMENTS(--args=ARGUMENTS):指定模块参数。

  • -u USERNAVE(--user=USERNAME):指定远程主机以USERNAE运行命令。

  • -I subset(--limit=SUBSET):限制运行主机。>--list-hosts:列出符合条件的主机列表,不执行任何命令。

  • --list-hosts:列出符合条件的主机列表,不执行任何命令。



(1)检查所有主机是否存活。具体执行命令如下

其中,192.168.100.20和192.168.100.30是执行的主机,SUCCESS表示命令执行成功。“=>{}表示返回的结果。”changed”:false表示没有对主机做出更改。ping”:pong”表示执行了ping命令的返回结果。命令中all关键字是系统默认存在的,代表了/etc/ansible/hosts中的所有主机,不需要在hosts文件中定义all关键字。


(2)列出client组所有的主机列表。执行命令如下。


--list 选项列出web组所有主机列表信息,web组中包括192.168.100.20, 192.168.100.30和192.168.100.40三台主机。


(3)批量显示web组中的磁盘使用空间,执行命令如下。


web关键字需要提前在/etc/ansible/hosts文件中定义组。


Ansible的返回结果非常友好,一般会用三种颜色来表示执行结果:红色、绿色和橘黄色。其中红色表示执行过程有异常,橘黄色表示命令执行后目标有状态变化,绿色表示执行成功且没有对目标机器做修改。



2.Ansible-doc

Ansible-doc用来查询ansible模块文档的说明,类似于man命令,针对每个模块都有详细的用法说明及应用案例介绍。语法如下。

列出支持的模块的个数:

查询ping模块的说明信息:


3.Ansible-playbook 

        Ansible-playbook是日常应用中使用频率最高的命令,类似于Linux中的sh或source命令,用来执行系列任务。其工作机制是:通过读取预先编写好的playbook文件实现集中处理任务。

        Ansible-playbook 命令后跟yml格式的playbook 文件,playbook文件存放了要执行的任务代码,命令使用方式如下。

playbook.yml文件需要提前编写好,建议指定playbook.yml的绝对路径。


4.Ansible-console 

        Ansible-console是Ansible为用户提供的一款交互式工具,类似于Windows的cmd以及Linux中的Shell。用户可以在ansible-console虚拟出来的终端上像Shell一样使用Ansible内置的各种命令。

这为习惯于使用Shell交互方式的用户提供了良好的使用体验。在终端输入ansible-console命令后显示如下:

所有的操作与Shell类似,而且支持Tab键补全。按快捷键Crl+D或Crl+C即可退出当前的虚拟终端。


四,Ansible模块


1.command模块

        command 模块在远程主机执行命令,不支持管道、重定向等Shell的特性,常用参数如下。

  • chdir:在远程主机上运行命令前要提前进入的目录。

  • creates.在命令运行时创建一个文件,如果文件已存在,则不会执行创建任务。

  • removes:在命令运行时移除一个文件,如果文件不存在,则不会执行移除任务。

  • executeble.指明运行命令的shell程序。


在所有主机上运行“ls./”命令,运行前切换到/home目录。操作如下。

2.shell模块

        Shell 模块在远程主机执行命令,相当于调用远程主机的Shell进程,然后在该Shell下打开一个子Shell运行命令。和command模块的区别是它支持Shel特性,如管道、重定向等。

查看内容

3.copy模块

copy 模块用于复制指定主机文件到远程主机的指定位置,常见参数如下。


  • dest;指出复制文件的目标目录位置,使用绝对路径。如果源是目录,则目标也要是目录,如果目标文件已存在,会覆盖原有内容。

  • src:指出源文件的路径,可以使用相对路径和绝对路径,支持直接指定目录。如果源是目录,则目标也要是目录。

  • mode:指出复制时,目标文件的权限,可选。

  • content:指出复制到目标主机上的内容,不能与src一起使用,相当于复制content 指明的数据到目标文件中。

  • owner:指出复制时,目标文件的属主,可选。

  • group:指出复制时,目标文件的属组,可选。



查看复制的目标文件:


4.hostname模块

hostname模块用于管理远程主机上的主机名,常用参数如下。


  • name:指明主机名。

查看主机名


5.yum模块

        yum模块基于yum机制,对远程主机管理程序包,常用参数如下。


  • name:程序包的名称,可以带上版本号。若不指明版本,则默认为最新版本。

  • state=presentllatestlabsent:指明对程序包执行的操作,present 表示安装程序包,latest表示安装最新版本的程序包,absent 表示卸载程序包。

  • disablerepo:在用yum安装时,临时禁用某个仓库的ID。

  • enablerepo:在用yum安装时,临时启用某个仓库的ID。

  • conf_file:yum运行时的配置文件,而不是使用默认的配置文件。

  • diable_gpg_check=yeslno:是否启用完整性校验功能。


挂载光盘


6.service模块

service模块为用来管理远程主机上的服务的模块,常见参数如下。

  • name:被管理的服务名称。

  • state=startedlstoppedlrestarted:动作包含启动.关闭或重启。

  • enabled=yeslno:表示是否设置该服务开机自启动。

  • runlevel:如果设定了enabled开机自启动,则要定义在哪些运行目标下自动启动。



7.user模块

user 模块用于管理远程主机上的用户账号,常见参数如下。

  • name;必选参数,账号名称。

  • state=presentlabsent:创建账号或者删除账号,present 表示创建,absent表示删除。

  • system=yeslno:是否为系统账号。

  • uid:用户UD。

  • group:用户的基本组。

  • groups:用户的附加组。

  • shell:默认使用的shell。

  • home;用户的家目录。

  • move home=yeslno;如果设置的家目录已经存在,是否将已存在的家目录进行移动。

  • password:用户的密码,建议使用加密后的字符串。

  • comment:用户的注释信息。

  • remove=yeslno:当state=absent时,是否要删除用户的家目录。


查看bob用户

删除bob用户

再次查看


五.playbook配置文件

    1.执行配置文件

        playbook 配置文件使用YAM语法,具有简洁明了、结构清晰等特点。playbook配置文件类似于Shell脚本,是一个YAML格式的文件,用于保存针对特定需求的任务列表。前面介绍的ansible命令虽然可以完成各种任务,但是当配置一些复杂任务时,逐条输入命令就显得效率非常低下。更有效的方案是在playbook配置文件中放置所有的任务代码,利用ansible-playbook命令执行该文件,可以实现自动化运维。YAML文件的扩展名通常为.yaml或.yml。YAML语法和其他高级语言类似,其结构通过缩进来展示,通过“一来代表项,通过冒号:

来分隔键和值,整个文件以“-—-”开始并以…”结束


所有的“-”和“:后面均有空格,而且要注意缩进和对齐,

playbook的核心元素包含:

  • hosts:任务的目标主机,多个主机用冒号分隔,一般调用/etc/ansible/hosts中的分组信息。

  • remote_user;远程主机上,运行此任务的身份默认为root。

  • tasks;任务,即定义的具体任务,由模块定义的操作列表。

  • handlers:触发器,类似tasks.只是在特定的条件下才会触发的任务。某任务的状态在运行后为changed时,可通过“notify"通知给相应的handlers 进行触发执行。

  • roles;角色,将hosts剥离出去,由tasks,handlers等所组成的种特定的结构集合。


编写具体如下:

注意:要严格按照语法格式编写,一个空格分配不均匀都可能全军覆没


        playbook 文件定义的任务需要通过ansible-playbook 命令进行调用并执行,ansible-playbook命令用法如下。

其中,[option]部分的功能包括:

  • --syntax-check.检测yaml文件的语法。

  • -C(--check);预测试,不会改变目标主机的任何设置。>--list-hosts:列出yaml文件影响的主机列表。

  • --list-tasks:列出yaml文件的任务列表。

  • --list-tags:列出yaml文件中的标签。

  • -t TAGS(--tags=TAGS):表示只执行指定标签的任务。

  • --skip-tags=SKP_TAGS:表示除了指定标签的任务,执行其他任务。

  • --start-at-task=START_AT:从指定的任务开始往下运行。




2.触发器

        需要触发才能执行的任务,当之前定义在tasks中的任务执行成功后,若希望在此基础上触发其他的任务,这时就需要定义handlers。例如,当通过ansible的模块对目标主机的配置文件进行修改之后,如果任务执行成功,可以触发一个触发器,在触发器中定义目标主机的服务重启操作,以使配置文件生效。handlers触发器具有以下特点。

>handlers是Ansible提供的条件机制之一。handlers和task很类似,但是它只在被task通知的时候才会触发执行。

>handlers 只会在所有任务执行完后执行。而且即使被通知了多次,它也只会执行一次。handlers按照定义的顺序依次执行。

handlers触发器的使用示例如下。



3.角色

将多种不同的tasks的文件集中存储在某个目录下,则该目录就是角色。角色一般存放在

/etc/ansible/roles/目录,可通过ansible的配置文件来调整默认的角色目录,/etc/ansible/roles/目录下有很多子目录,其中每一个子目录对应一个角色,每个角色也有自己的目录结构


/etc/ansible/roles/为角色集合,该目录下有自定义的各个子目录:

  • mariadb:mysql角色。

  • Apache:httpd角色。

  • nginx:nginx角色。


每个角色的定义,以特定的层级目录结构进行组织。以Mariadb(mysql角色)为例:

  • files:存放由copy 或script 等模块调用的文件。

  • templates:存放template模块查找所需要的模板文件的目录,如mysql配置文件等模板。

  • tasks;任务存放的目录。

  • handlers:存放相关触发执行器的目录。

  • vars:变量存放的目录。

  • meta:用于存放此角色元数据。

  • default:默认变量存放的目录,文件中定义了此角色使用的默认变量。



上述目录中,tasks、handlers、vars、meta、default至少应该包含一个main.yml文件,该目录下也可以有其他.yml文件,但是需要在main.yml文件中用include指令将其他.yml文件包含进来。

有了角色之后,可以直接在yaml文件(playbook配置文件)中调用角色,示例如下。

可以只调用一个角色,也可以调用多个角色。当定义了角色后,用ansible-playbook PLAYBBOOK文件执行即可。此时ansible会到角色集合的目录(/etc/ansible/roles)去找mysql和httpd目录,然后依次运行mysql目录和httpd目录下的所有代码。


        下面通过一个实例配置数据库角色,要求被管理主机上自动安装Mariadb,安装完成之后上传提前准备好的配置文件至远端主机,重启服务,然后新建testdb数据库,并允许test 用户对其拥有所有权限。

1)被管理主机配置yum源

复制提供的ansiblerepo文件夹至Linux虚拟机,并配置yum仓库文件,指向该文件夹。

2)配置数据库角色


至此,结束~~

故事很短,道理很长,学无止境,不忘初心,砥砺前行  

微信搜索 “徐阿马”  关注公众号,期待你的关注!


文章转载自徐阿马,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论