Ansible 和企业级 Ansible 应用难点解读.docx
一、Ansible概述Ansible是近年来越来越火的一款开源运维自动化工具,通过Ansible可以实现运维自动化,提高运维工程师的工作效率,减少人为失误。Ansible通过本身集成的非常丰富的模块可以实现各种管理任务,其自带模块超过上千个。更为重要的是,它操作非常简单,即使小白也可以轻松上手,但它提供的功能又非常丰富,在运维领域,几乎可以做任何事。1、Ansible特点Ansible自2012年发布以来,很快在全球流行,其特点如下:Ansible基于Python开发,运维工程师对其二次开发相对比较容易;Ansible丰富的内置模块,几乎可以满足一切要求;管理模式非常简单,一条命令可以影响上千台主机;无客户端模式,底层通过SSH通信;AnSible发布后,也陆续被AWSGoogleCloudPlatformMicrosoftAzuresCisco、HP、VMware、Twitter等大公司接纳并投入使用;二、AnSible的角色使用者:如何使用Ansible实现自动化运维?Ansible工具集:AnSibIe可以实现的功能?作用对象:Ansible可以影响哪些主机?1、使用者如下图所示:AnSibIe使用者可以采用多种方式和Ansible交互,图中展示了四种方式:CMDB:CMDB存储和管理者企业IT架构中的各项配置信息,是构建ITIL项目的核心工具,运维人员可以组合CMDB和AnSible,通过CMDB直接下发指令调用Ansible工具集完成操作者所希望达到的目标;Publiczprivate方式:AnSible除了丰富的内置模块外,同时还提供丰富的api语言接口,如PHP、Python、PERL等多种流行语言,基于PUBLIC/PRIVATE,Ansible以API调用的方式运行;Ad-Hoc命令集:USerS直接通过Ad-HOC命令集调用AnSible工具集来完成任务;Playbooks:Users预先编写好AnsiblePlaybooks>通过执行Playbooks中预先编排好的任务集,按序执行任务;33BHOSTS2、Ansible工具集Ansible工具集包含InventoryModules>Plugins和APL其中:InVentory:用来管理设备列表,可以通过分组实现,对组的调用直接影响组内的所有主机;Modules:是各种执行模块,几乎所有的管理任务都是通过模块执行的;Plugins:提供了各种附加功能;API:为编程人员提供一个接口,可以基于此做AnSible的二次开发;具体表现如下:AnsiblePlaybooks:任务脚本,编排定义AnSible任务及的配置文件,由AnSible按序依次执行,通常是JSON格式的YML文件;Inventory:Ansible管理主机清单;Modules:Ansible执行命令功能模块,多数为内置的核心模块,也可自定义;Plugins:模块功能的补充,如连接类型插件、循环插件、变量插件、过滤插件等,该功能不太常用;API:供第三方程序调用的应用程序编程接口;Ansible:该部分图中表现得不太明显,组合Inventory、API、Modules、PlUginS可以理解为是Ansible命令工具,其为核心执行工具;3、作用对象Ansible的作用对象不仅仅是Linux和非Linux操作系统的主机,也可以作用于各类Publiczprivate、商业和非商业设备的网络设施,使用者使用AnSibIe或Ansible-Playbooks时,在服务器终端输入Ansible的Ad-Hoc命令集或Playbooks后,Ansible会遵循预选安排的规则将Playbooks逐步拆解为Play,再将Play组织成Ansible可以识别的任务,随后调用任务涉及的所有模块和插件,根据InVentory中定义的主机列表通过SSH将任务集以临时文件或命令的形式传输到远程客户端执行并返回执行结果,如果是临时文件则执行完毕后自动删除。三、Ansible的配置1、Ansible安装AnSible的安装部署非常简单,以RPM安装为例,其依赖软件只有Python和SSH,且系统默认均已安装。AnSibIe的管理端只能是LinUX,如Redhat、DebianCentos«1)通过YUM安装Ansible可以自行从互联网上直接下载AnSibIe所需软件包,本篇博客提供安装AnSibIe自动化运维工具所需的依赖软件包rootcentos01-#cdmntansiblerepoansiblereporepodatarootcentos01ansiblerepoj#vimetcyum.repos.dlocal.repolocalname=centosbaseurl=file:/mnt/ansiblerepo/ansiblerepo<!一修改yum路径->enabled=1gpgcheck=OrootcentosO1-#yum-yinstallansible<!-安装Ansible自动化运维工具->2)验证安装结果rootcentos01-#ansible-version<!-如果命令可以正常执行,则表示Ansible工具安装成功->ansible2.3.1.0configfile=etcansibleansible.cconfiguredmodulesearchpath=Defaultw/ooverridespythonversion=2.7.5(default,Nov62016,00:28:07)GCC4.8.520150623(RedHat4.8.5-11)3)创建SSH免交互登录Ansible通过SSH对设备进行管理,而SSH包含两种认证方式:一种是通过密码认证,另一种是通过密钥对验证。前者必须和系统交互,而后者是免交互登录。如果希望通过Ansible自动管理设备,应该配置为免交互登录被管理设备。rootcentos01-#ssh-keygen-trsa<!-生成密钥对->Generatingpublic/privatersakeypair.Enterfileinwhichtosavethekey(/root/.ssh/id_rsa):<!-密钥对存放路径->Createddirectory7root.ssh'.Enterpassphrase(emptyfornopassphrase):<!-输入私钥保护密码,直接按Enter键表示无密码Entersamepassphraseagain:<!-再次输入一Youridentificationhasbeensavedinroot.sshid-rsa.Yourpublickeyhasbeensavedinroot.sshid-rsa.pub.Thekeyfingerprintis:SHA256:cJz6NRTrvMDxX+Jpce6LRnWI3vVEl/zvARL7D10q9WYrootcentos01Thekey'srandomartimageis:+RSA2048-+I.I.+ooI.=oo.ooI=*o.+*I.s*.=+=*+I.o=+XooEI.II.o.I-o-1+SHA256-+rootcentos01-#ssh-copy-id-i.ssh/id_rsa.pubroot192.168.100.20<!一复制公钥到远端192.l68.100.20->rootcentos01-#ssh-copy-id-i.ssh/id_rsa.pubroot192.168.100.30<!一复制公钥到远端192.l68.100.30->至此,已经完成Ansible的部署,接下来就可以通过Ansible对设备进行管理了。2、Ansible配置Inventory是Ansible管理主机信息的配置文件,相当于系统Hosts文件的功能,默认存放在etcansiblehostsoffihosts文件中,通过分组来组织设备,Ansible通过EVentOry来定义主机和分组,通过在ansible命令中使用选项-i或一inventory-file来指定Inventory。rootcentos01-#ansible-ietcansiblehostsweb-mping如果使用默认的InVentOry文件(etcansiblehosts),也可以不指定Inventory文件,例如:rootcentos01-#ansibleweb-mpingAnsible通过设备列表以分组的方式添加到etcansiblehosts文件来实现对设备的管理,所以在正式管理之前,首先要编写好hosts文件。hosts文件中,以口包含的部分代表组名,设备列表支持主机名和IP地址。默认情况下,通过访问22端口(SSH)来管理设备。若目标主机使用了非默认的SSH端口,还可以在主机名称之后使用冒号加端口标明,以行为单位分隔配置。另外,hosts文件还支持通配符。rootcentos01Vimetcansiblehosts<!此处省略部分内容一>web192.168.100.20192.168.100.30test:222<!-通过222端口管理设备一>mailyj2:5<!一2:5表示25之间的所有数字,即表示、的所有主机一>可以将一个主机同时归置在不同的组中。配置完成之后,可以针对hosts定义的组进行远程操作,也可以针对组中的某一个或多个主机操作。例如:1)只对Web组中192.168.1.2主机操作,通过一Iimil参数限定主机的变更。rootcentos01-#ansibleweb-mcommand-a,'systemctlstatushttpd"limit"192.168.100.20"192.168.100.20SUCCESSrc=0»<!一看到SUCCESS就知道成功了,所以以下内容一><!-如果测试httpd服务,被测试主机必然已经安装并启动了httpd服务->2)只对192.168.100.20主机操作。通过IP限定主机的变更。rootcentos01-#ansible192.168.100.20-mcommand-a"systemctlstatushttpd"192.168.100.20SUCCESSrc=0»3)只对192.168.1OOQ网段主机操作,这就需要使用到通配符来限定主机的变更了。rootcentos01-#ansible192.168.L*-mcommand-a',systemctlstatushttpd"192.168.100.20SUCCESSrc=0».<!-此处省略部分内容192.168.100.30SUCCESSrc=0».<!-此处省略部分内容><!-实验环境,效果一样,这里就不多说了->3、Ansible命令Ansible的维护命令大多数是以ansible开头,在终端输入ansible后连续按两次Tab键,会补全所有跟ansible相关的命令。rootcentos01-#ansible<!一连续按Tab键一ansibleansible-console-2ansible-galaxyansible-playbook-2.7ansible-vault-2ansible-2ansible-console-2.7ansible-galaxy-2ansible-pullansible-vault-2.7ansible-2.7ansible-docansible-galaxy-2.7ansible-pull-2ansible-connectionansible-doc-2ansible-playbookansible-pull-2.7ansible-consoleansible-doc-2.7ansible-playbook-2ansible-vault1)ansibleansible是生产环境中使用非常频繁的命令之一,主要在以下场景使用:非固化需求;临时一次性操作;二次开发接口调用;非固化需求是指临时性的维护,如查看web服务器组磁盘使用情况、复制一个文件到其他机器等。类似这些没有规律的、临时需要做的任务,我们成为非固化需求,临时一次性操作,语法如下:Ansible<host-pattern>options- v(-verbose):输出详细的执行过程信息,可以得到执行过程所有信息;- iPATH(Inventory=PATH):指定inventory信息,默认为/etc/ansible/hosts;- fNUM(-forks=NUM):并发线程数,默认为5个线程;- private-key=PRIVATE_KEY_FILE:指定密钥文件;- mNAME,module-name=NAME:指定执行使用的模块;- MDIRECTORY(module-path=DIRECTORY):指定模块存放路径,默认为/usr/share/ansible;- aARGUMENTS(args=ARGUMENTS):指定模块参数;- uUSERNAME(-User=USERNAME):指定远程主机以USERNAME运行命令;- !subset(-Iimit=SUBSET):限制运行主机;检查所有主机是否存活,执行命令如下:rootcentos01-#ansibleall-f5-mping<!-调用ping模块,all表示/etc/ansible/hosts文件中的所有主机,不用创建all分组(默认存在)>192.l68.100.20SUCCESS=><!-表示执行成功一>"changed":false,<!-没有对主机做出更改,'pingu:"pong"<!-表示执行Ping命令的返回结果->)192.168.10030SUCCESS=>''changed":false,"ping":',pong,列出Web组所有的主机列表,执行命令如下:rootcentos01-#ansibleweb-list<!list:表示列出主机列表信息一>hosts(2):192.168.100.20192.168.100.30批量显示web组中的磁盘使用空间,执行命令如下:rootcentosO1-#ansibleweb-mcommand-a,df-hT"192.168.100.30SUCCESSrc=0»文件系统类型容量己用可用已用挂载点devmappercl-rootxfs17G4.4G13G26%/devtmpfsdevtmpfs897M0897M0%Zdevtmpfstmpfs912M84K9I2M1%devshmtmpfstmpfs912M0912M0%sysfscgroupdevsdalxfs1014M173M842M18%/boottmpfstmpfs183M16K183M1%runuser42tmpfstmpfs183M0183M0%runuser0192.168.100.20SUCCESSrc=0»文件系统类型容量己用可用己用%挂载点devmappercl-rootxfsI7G4.3G13G26%/devtmpfsdevtmpfs897M0897M0%devtmpfstmpfs912M84K9I2M1%devshmtmpfstmpfs912M0912M0%sysfscgroupdevsdal;KfSIO14M173M842M18%/boottmpfstmpfs183M16K183M1%runuser42tmpfstmpfs183MO183M0%runuserOdevsriso96604.IG4.1G0100%mntweb关键字需要提前在etcansiblehosts文件中定义组。Ansible的返回结果非常友好,一般会用三种颜色来表示执行结果:红色:表示执行过程出现异常;橘黄颜色:表示命令执行后目标有状态变化;绿色:表示执行成功且没有目标机器做修改;2) Ansible-docAnsible-doc用来查询ansible模块文档的说明,类似于man命令,针对每个模块都有详细的用法说明及应用案例介绍,语法如下:ansible-docoptionsmodule列出支持的模块:rootcentos01#ansible-doc-1查询Ping模块的说明信息:rootcentos01-#ansible-docping>PlNG(usrlibpython2.7site-packagesansiblemodulessystemping.py)Atrivialtestmodule,thismodulealwaysreturns'pong,onsuccessfulcontact.Itdoesnotmakesenseinplaybooks,butitisusefulfrom'usrbinansible,toverifytheabilitytologinandthatausablepythonisconfigured.ThisisNOTICMPping,thisisjustatrivialtestmodule.EXAMPLES:#Testwecanlogonto'webservers'andexecutepythonwithjsonlib.ansiblewebservers-mpingMAINTAINERS:AnsibleCoreTeam,MichaelDeHaanMETADATA:Status:'stableinterface'Supported_by:core3) Ansible-playbookAnsible-playbook是日常应用中使用频率最高的命令,类似于LinUX中的sh或source命令,用来执行系列任务。其工作机制:通过读取预先编写好的PlayboOk文件实现集中处理任务。Ansible-playbook命令后跟yml格式的playbook文件,playbook文件存放了要执行的任务代码,命令使用方式如下:Ansible-playbookplaybook.yml<!-playbook.yml文件要提前编写好,建议使用绝对路径->4) Ansible-ConsoleAnsible-Console是Ansible为用户提供的一款交互式工具,类似于Windows的cmd或者是LinUX中sheik用户可以在ansible-console虚拟出来的终端上像shell一样使用Ansible内置的各种命令,这为习惯于使用SheH交互式方式的用户提供了良好的使用体验。在终端输入ansible-console命令后,显示如下:rootcentos01-#ansible-consoleWelcometotheansibleconsole.Typehelpor?tolistcommands.<!输入help或?获取帮助一>rootall(2)f:5$cdweb<!-使用cd命令切换主机或分组>rootweb(2)f:5$list<!-列出当前的设备->192.168.100.20192.168.100.30<!-支持Tab键补全,快捷键Ctrl+D或Ctrl÷C即可退出当前的虚拟终端4、AnSible模块1) command模块COmmand模块在远程主机执行命令,不支持管道、重定向等Shen的特性。常用的参数如下:chdir:在远程主机上运行命令前要提前进入的目录;creates:在命令运行时创建一个文件,如果文件己存在,则不会执行创建任务;removes:在命令运行时移除一个文件,如果文件不存在,则不会执行移除任务;executeable:指明运行命令的shell程序;在所有主机上运行“1s.尸命令,运行前切换到/home目录下。操作如下:rootcentosO1-#ansibleweb-mcommand-a,chdir=/Is.2) SheIl模块shell模块在远程主机执行命令,相当于调用远程主机的Shell进程,然后在该Shell下打开一个子Shell运行命令。和COmmand模块的区别是它支持SheII特性:如管道、重定向等。示例如下:rootcentos01-#ansibleweb-mshell-a',echohelloworld”<!一输出到屏幕->192.168.100.20SUCCESSrc=O»helloworld192.168.100.30SUCCESSrc=O»helloworldrootcentosO1-J#ansibleweb-mshell-a"echohelloworld>l.txt"<!一输出至JLtxt文件中_>192.168.100.20SUCCESSrc=0»192.168.100.30SUCCESSrc=O»3) copy模块copy模块用于复制指定主机文件到远程主机的指定位置。常见的参数如下:dest:指出复制文件的目标目录位置,使用绝对路径。如果源是目录,则目标也要是目录,如果目标文件己存在,会覆盖原有内容;src:指出源文件的路径,可以使用相对路径和绝对路径,支持直接指定目录。如果源是目录,则目标也要是目录;mode:指出复制时,目标文件的权限,可选;owner:指出复制时,目标文件的属主,可选;group:指出复制时目标文件的属组,可选;content:指出复制到目标主机上的内容,不能和src一起使用,相当于复制Content指明的数据到目标文件中;示例如下:rootcentos01-#ansibleweb-mcopy-a,src=etchostsdest=rootal.hostsmode=777owner=rootgroup=rootM<!-/将本机的hosts文件第制到Web组中的所有主机上存放在家目录下的al.hosts目录,权限是777,属主是root,属组是root->4) hostname模块hostname模块用于管理远程主机上的主机名。常用的参数如下:name:指明主机名;示例如下:rootcentosOI-#ansible192.168.100.20-mhostname-a,name=test"<!-将192.168.100.20的主机名改为test,但是192.168.100.20需要敲一下bash才生效5) yum模块yum模块基于yum机制,对远程主机管理程序包。常用的参数如下:name:程序包名称,可以带上版本号。若不指明版本,则默认为最新版本;State=PresentIatestIabsent:指明对程序包执行的操作:PreSent表明安装程序包,latest表示安装最新版本的程序包,absent表示卸载程序包;disablerepo:在用yum安装时,临时禁用某个仓库的ID;enablerepo:在用yum安装时,临时启用某个仓库的1D;conf-file:yum运行时的配置文件,而不是使用默认的配置文件;disable_gpg_check=yes|no:是否启用完整性校验功能;示例如下:rootcentosO1-#ansibleweb-mshell-a'7usrbinrm-rfetcyum.repos.dCentOS-*"<!-批量化删除web组主机的yum源->rootcentosO1-#ansibleweb-mshell-a'7usrbinmountdevcdrommnt"<!-批量化挂载光盘WARNING:Considerusingmountmoduleratherthanrunningmount192.168.100.20SUCCESSrc=0»mount:devsr写保护,将以只读方式挂载192.168.100.30SUCCESSrc=0»mount:devsr写保护,将以只读方式挂载rootcentosO1-#ansibleweb-myum-a"name=httpdstate=present"<!一批量化安装httpd程序rootcentos01-#ansibleweb-mshell-a"rpm-qagrephttpd"<!-批量化查看安装的httpd程序包->WARNING:Considerusingyum,dnforzyppermoduleratherthanrunningrpm192.168.100.20SUCCESSrc=0»httpd-2.4.6-67.el7.centos.x86_64httpd-tools-2.4.6-67.el7.centos.x86_64192.168.100.30SUCCESSrc=0»httpd-2.4.6-67.el7.centos.x86_64httpd-tools-2.4.6-67.e17.centos.x86_64rootcentos01-#ansibleweb-mshell-a',syStemctlstarthttpd"<!一批量启动服务->rootcentos01-#ansibleweb-mshell-a"netstat-antugrephttpd"<!一批量化监听httpd服务是否启动成功->192.168.100.20SUCCESSrc=0»tcp600:80:*LISTEN2072/httpd192.168.100.30SUCCESSrc=0»tcp6O0:80:*LISTEN3098/httpd管理端只是发送yum指令到被管理端,被管理端要存在可用的yum仓库才可以成功安装。6) service模块service模块为用来管理远程主机上的服务的模块。常见的参数如下:name:被管理的服务名称;State=StartedlstoppedIrestarted:动作包含启动,关闭或重启;enable=yesno:表示是否设置该服务开机自启动;runlevel:如果设定了enabled开机自启动,则要定义在哪些运行目标下自动启动;示例如下:rootcentosO1-#ansibleweb-mservice-a"name=httpdenabled=yesstate=restarted"<!-设置血恻服务重新启动和开机自动启动7) USer模块user模块主要用于管理远程主机上的用户账号。常见的参数如下:name:必选参数,账号名称;State=PreSentlabSent:创建账号或者删除账号,PreSent表示创建,absent表示删除;SyStem=yesno:是否为系统账户;Uid:用户UlD;group:用户的基本组groups:用户的附加组;Shen:默认使用的shell;home:用户的家目录;mve_home=yes|no:如果设置的家目录已经存在,是否将己存在的家目录进行移动;PSSWord:用户的密码,建议使用加密后的字符串;comment:用户的注释信息;remore=yesno:当State=absent时,是否要删除用户的家目录;创建用户示例如下:rootcentosO1-#ansibleweb-muser-a,'name=userlsystem=yesuid=502group=rootgroups=rootshell=etcnologinhome=homeuserO1password=pwd123”<!-在web组的所有主机上新建一个系统用户,UID为502,属组是root,名字是userl,密码是pwd123->四、PlayboOk配置文件1、执行配置文件PlaybOok配置文件使用YAML语法,具有简洁明了、结构清晰等特点。PlaybOOk配置文件类似于SheH脚本,是一个YAML格式的文件,用于保存针对特定需求的任务列表。上面介绍的ansible命令虽然可以完成各种任务,但是当配置一些免杂任务时,逐条输入就显得效率非常低下。更有效的方案是在playbook配置文件中放置所有的任务代码,利用ansible-playbook命令执行该文件,可以实现自动化运维。YAML文件的扩展名通常为.yaml或.yml°YAML语法与其他高级语言类似,其结构通过缩进来展示,通过来代表项;“:”用来分隔键和值;整个文件以“一”开头并以“”结尾,如下所示:rootcentos01#grep-vA#etcansiblehostsgrep-v人$<!查看hosts中的分组信息->webl192.168.100.20web2192.168.100.30rootcentos01-#vimetcansiblea.yml<!一创建a.yml文件,写入以下内容>-hosts:weblremote_user:roottasks:-name:adduser<!-针对Webl组中的操作<!-远端执行用户身份为root-><!一任务列表-><!一任务名称一>user:name=userlstate=present<!-执行user模块,创建用户tags:-aaa-name:addgroup<!-创建tag标签<!-tag标签为aaa><!-任务名称group:name=rootsystem=yes<!一执行group模块,创建组一>tags:-bbb-hosts:web2remote_user:roottasks:<!一创建tag标签-><!-tag标签为bbb-><!-针对web2组中的操作<!-远端执行用户身份为root-><!-任务列表一>-name:copyfiletoweb<!一任务名称->copy:src=etcpasswddest=home<!一执行copy模块,复制文件tags:<!-创建tag标签-CCC<!-tag标签为ccc->所有的“-,和“:”后面均有空格,而且注意缩进和对齐,如下图所示:rootce-#rootcej#rootece-j#catetcansiblea.yml-hosts:webl|remote_user:rootname: adduseruser: ame=user2 state=present冒号和横杠后 面要有空格, 上同、下同(tasksname'agroup,一group:name=rootsystem三yestags:-bbb-hosts:Ueb2remoteser:roottasks:1-name:copyfiletowebcopy:src=etcpasswddest=hometags:-CCCrootce-#Iplaybook的核心元素包含:hosts:任务的目标主机,多个主机用冒号分隔,一般调用etcansiblehosts中的分组信息;remote_user:远程主机上,运行此任务的默认身份为root;tasks:任务,即定义的具体任务,由模块定义的操作列表;handlers:触发器,类似tasks,只是在特定的条件下才会触发的任务。某任务的状态在运行后为changed时,可通过“notify”通知给相应的handlers进行触发执行;roles:角色,将hosts剥离出去,由tasks、handlers等所组成的一种特定的结构集合;playbook文件定义的任务需要通过ansible-playbook命令进行调用并执行。ansible-playbook命令用法如F:ansible-playbookoptionPATHTOPLAYBOOK.yaml其中,option部分的功能包括:syntax-check:检测yaml文件的语法;-C(-check):预测试,不会改变目标主机的任何设置;一list-hosts:列出yaml文件影响的主机列表;一list-tasks:列出yaml文件的任务列表;一list-tags:列出yaml文件中的标签;-tTAGS(tags=TAGS):表示只执行指定标签的任务;-skip-tags=SKIP-TAGS:表示除了指定标签的任务,执行其他任务;start-at-task=START_AT:从指定的任务开始往下运行;执行Playbook的示例如下:rootcentos01ansible-playbook-syntax-checketcansiblea.yml<!一语法检测一playbook:etcansiblea.yml<!一表示没有报错一>rootcentos01ansible-playbook-Cetcansiblea.yml<!一对a.yml进行预测试一><!-省略部分内容一>192.168.100.20:ok=3changed=1Unreachable=OfaiIed=O192.168.100.30:ok=2changed=1Unreachable=OfaiIed=O<!-返回结果表示没有错误,全部可以执行成功。rootcentos01ansible-playbook-list-hostsetcansiblea.yml<!-列出a.yml文件中