自动化运维实践AnsibleIT运维管理Ansible介绍Ansible常用操作Ansible实例(playbooks)第一部分IT运维管理传统运维自动运维运维工作是比较繁琐的,尤其是新系统上线的场景,一切都是从零开始。包括虚机的创建,主机名的修改,系统的初始化等等,在机器不多的情况下人工还能应付的过来,如果有上百台机器呢?最初也是用堆人的方法来做的。但这样的方式出错率高,而且有时还会有遗漏。只能通过相互检查的方式来验证,但这样就会花费更多的时间,相应的时间/人工成本也会上升。人工的方式因个人部署习惯千差万别,导致一些项目难以维护。传统运维带来的坑传统运维nginxkeepalivednodejstomcatnginxtomcatnodejskeepalivedServer1Server2MySQLRedisMongodb……没有专门的工具为我们做这些事情,使用脚本语言(Python)逐渐有了运维自动化的一些工具,比如Fabric、Puppet、Chef、SaltStack、Ansible等自动化运维平台运维自动化的演进自动运维运维自动化的演进1、某某组件坏了可以不用管继续睡觉2、出现异常时点击一下就可立即恢复3、与监控配合,系统挂了可以自动恢复运维自动化的目标第二部分Ansible架构图Ansible介绍Ansible简介Ansible任务执行流程Ansible简介ansible是新出现的自动化运维工具,基于Python开发,集合了众多老牌运维工具(puppet、cfengine、chef、func、fabric)的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能。ansible是基于模块工作的,本身没有批量部署的能力。真正具有批量部署的是ansible所运行的模块,ansible只是提供一种框架。主要包括:(1)连接插件connectionplugins:负责和被管控端实现通信;(2)hostinventory:指定操作的主机,是一个配置文件里面定义管控的主机;(3)各种模块核心模块、command模块、自定义模块;(4)借助于插件完成记录日志邮件等功能;(5)playbook:剧本执行多个任务时,可以让被管控端一次性运行多个任务。(1)noagents:不需要在被管控主机上安装任何客户端;(2)noserver:无服务器端,使用时直接运行命令即可;(3)modulesinanylanguages:基于模块工作,可使用任意语言开发模块;(4)yaml,notcode:使用yaml语言定制剧本playbook;(5)sshbydefault:基于SSH工作;(6)strongmulti-tiersolution:可实现多级指挥。Ansible特性(1)轻量级,无需在客户端安装agent,更新时,只需在操作机上进行一次更新即可;(2)批量任务执行可以写成脚本,而且不用分发到远程就可以执行;(3)使用python编写,维护更简单,ruby语法过于复杂;(4)支持sudo。Ansible优点Ansible架构图Ansible任务执行流程第三部分Ansible安装配置Ansible主机清单Ansible的常用操作Ansible常用模块YAML介绍Ansible安装配置使用yum安装(推荐)-版本稍旧yuminstallansible使用pip安装(依赖pip,gcc等)-版本新pipinstallansible两种安装方式:/etc/ansible/ansible.cfgAnsible配置Ansible主机清单-Inventory/etc/ansible/hostsInventory默认文件Ansible主机清单-主机与组正则匹配1、表示所有的主机使用all或*Ansible主机清单-主机与组正则匹配2、通配符(*)和逻辑或(:)Ansible主机清单-主机与组正则匹配3、逻辑非和逻辑与Ansible常用模块Ad-hoc-ansible命令Playbook-YAMLAnsible运行任务的方式ansible主机或组-m模块名-a'模块参数'ansible参数•主机和组:是在/etc/ansible/hosts里进行指定的部分,动态Inventory使用的是脚本从外部应用里获取的主机•模块名:可以通过ansible-doc-l查看目前安装的模块,默认不指定时,使用的是command模块,具体可以查看/etc/ansible/ansible.cfg的“#module_name=command”部分,默认模块可以在该配置文件中进行修改•模块参数:可以通过“ansible-doc-s模块名”查看具体的用法及后面的参数•ansible参数:可以通过ansible命令的帮助信息里查看到,这里有很多参数可以供选择,如是否需要输入密码、是否sudo等。Ad-hocAnsible常用模块ansibleall-mpingping模块ansibleall-mcommand-auptimecommand模块ansibleall-mservice-aname=nginxstate=restartedservice模块ansibleall-myum-aname=telnetstate=presentyum模块ansibleall-mshell-acat/dev/null/var/log/nginx/access.logshell模块Ansible常用模块ansibleall-mcopy-asrc=/root/nginx.confdesc=/etc/nginx/nginx.confowner=nginxgroup=nginxmode=644copy模块ansiblejava-munarchive-asrc=java7.tar.gzcopy=yesdest=/usr/javaowner=rootgroup=rootunarchive模块ansibleall-mreplace-apath=/etc/hostsregexp='^10.10'replace='10.12'replace模块ansiblemysql-mlineinfile-adest=/etc/hostsline='10.10.31.181db1'lineinfile模块ansiblejava-mfilesrc=/usr/java/jdk1.7dest=/usr/java/jdkstate=linkowner=rootgroup=rootfile模块YAML介绍YAML是“YetAnotherMarkupLanguage”(仍是一种置标语言)的头字母简写,目前一般专门用来写配置文件的语言,对于人类很友好。YAMLYAML介绍•大小写敏感•使用缩进表示层级关系•缩进时不允许使用Tab键,只允许使用空格。•缩进的空格数目不重要,只要相同层级的元素左侧对齐即可基本语法规则•对象:键值对的集合,又称为映射(mapping)/哈希(hashes)/字典(dictionary)•数组:一组按次序排列的值,又称为序列(sequence)/列表(list)•纯量(scalars):单个的、不可再分的值支持的数据结构YAML介绍–数据结构一组键值对,使用冒号结构表示task:install对像depend:-gcc-openssl-devel列表(sequence)name:installjdk1.7hosts:test_hostremote_user:rootsudo:falsegather_facts:true字典(mapping)数值number:12float:12.30字符str:这是一行字符串布尔值表示true的值true,True,TRUE,yes,Yes,YES,on,On,ON,y,Y表示false的值false,False,FALSE,no,No,NO,off,Off,OFF,n,N纯量(标量)第四部分Ansibe实例(playbooks)playbooksjdk自动部署tomcat自动部署AnsiblerolesMysql主从自动部署Playbooks(剧本)剧本是Ansible的配置、部署语言,由它对描述你想要远程机器执行的策略或步骤,使用YAML编写。playbooks是由一个或多个“play”(task)组成的列表。从根本上讲task就是调用ansible的一个module。将多个play组织在一个playbook中,运行时就会根据自上而下的顺序依次执行。Playbooks(剧本)简介----hosts:alltasks:-name:testconnectionping:Playbooks(ping.yaml)#ansible-playbookping.yamlPlaybooks(jdk部署)----name:installjdk1.7hosts:javaremote_user:rootsudo:falsegather_facts:truevars:jdk_ver:'jdk1.7.0_79'jdk_pack:'jdk-7u79-linux-x64.tar.gz'tasks:-name:mkdir/usr/javafile:path=/usr/javastate=directoryowner=rootgroup=root-name:pushjdkpackageandunpackunarchive:src={{jdk_pack}}copy=yesdest=/usr/java/owner=rootgroup=root-name:makesoftlinkfile:src=/usr/java/{{jdk_ver}}dest=/usr/java/jdkstate=linkowner=rootgroup=root-name:setupjavaenvblockinfile:dest:/etc/profilemarker:#{mark}JAVAENVblock:|exportJAVA_HOME=/usr/java/jdkexportCLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jarexportPATH=$PATH:$JAVA_HOME/binPlaybooks(JDK部署)Playbooks(tomcat部署)----name:installtomcat7hosts:tomcatremote_user:rootsudo:falsegather_facts:truevars:tomcat_ver:'7.0.73'tomcat_pack:'{{tomcat_ver}}/bin/apache-tomcat-{{tomcat_ver}}.tar.gz'tomcat_dir:'/opt'tomcat_location:{{tomcat_dir}}/apache-tomcat-{{tomcat_ver}}tasks:-name:gettomcat7packageandunpackunarchive:src={{tomcat_pack}}dest={{tomcat_dir}}remote_src=yes-name:tomcatstartscriptaddutf8lineinfile:dest:{{tomcat_location}}/bin/catalina.shinsertafter:'^#JAVA_OPTS.*'line:{{item}}with_items:-JAVA_OPTS=$JAVA_OPTS-server-Xms512m-Xmx1024m-XX:PermSize=128m-XX:MaxPermSize=512m-JAVA_OPTS=$JAVA_OPTS-Dfile.encoding=UTF-8-Dsun.jun.encoding=UTF-8-name:tomcatc