Ansible自动化运维.ppt
自动化运维实践Ansible目录CONTENTS1IT运维管理2Ansible介绍3Ansible常用操作4Ansible实例(playbooks)第一部分IT运维管理p传统运维p自动运维 运维工作是比较繁琐的,尤其是新系统上线的场景,一切都是从零开始。包括虚机的创建,主机名的修改,系统的初始化等等,在机器不多的情况下人工还能应付的过来,如果有上百台机器呢?最初也是用堆人的方法来做的。但这样的方式出错率高,而且有时还会有遗漏。只能通过相互检查的方式来验证,但这样就会花费更多的时间,相应的时间/人工成本也会上升。人工的方式因个人部署习惯千差万别,导致一些项目难以维护。传统运维带来的坑传统运维带来的坑传统运维MySQLRedisMongodbu没有专门的工具为我们做这些事情,使用脚本语言(Python、shell)u逐渐有了运维自动化的一些工具,比如Fabric、Puppet、Chef、SaltStack、Ansible等u自动化运维平台运维自动化的演进自动运维运维自动化的演进运维自动化的演进1、某某组件坏了可以不用管继续睡觉 2、出现异常时点击一下就可立即恢复 3、与监控配合,系统挂了可以自动恢复运维自动化的目标运维自动化的目标第二部分pAnsible架构图Ansible介绍 pAnsible简介pAnsible任务执行流程Ansible简介 ansible是新出现的自动化运维工具,基于Python开发,集合了众多老牌运维工具(puppet、cfengine、chef、func、fabric)的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能。ansible是基于模块工作的,本身没有批量部署的能力。真正具有批量部署的是ansible所运行的模块,ansible只是提供一种框架。主要包括:(1)连接插件connection plugins:负责和被管控端实现通信;(2)host inventory:指定操作的主机,是一个配置文件里面定义管控的主机;(3)各种模块核心模块、command模块、自定义模块;(4)借助于插件完成记录日志邮件等功能;(5)playbook:剧本执行多个任务时,可以让被管控端一次性运行多个任务。u(1)no agents:不需要在被管控主机上安装任何客户端;u(2)no server:无服务器端,使用时直接运行命令即可;u(3)modules in any languages:基于模块工作,可使用任意语言开发模块;u(4)yaml,not code:使用yaml语言定制剧本playbook;u(5)ssh by default:基于SSH工作;u(6)strong multi-tier solution:可实现多级指挥。Ansible特性u(1)轻量级,无需在客户端安装agent,更新时,只需在操作机上进行一次更新即可;u(2)批量任务执行可以写成脚本,而且不用分发到远程就可以执行;u(3)使用python编写,维护更简单,ruby语法过于复杂;u(4)支持sudo。Ansible优点Ansible架构图Ansible任务执行流程第三部分pAnsible安装配置pAnsible主机清单Ansible的常用操作pAnsible常用模块pYAML介绍Ansible安装配置u 使用yum/apt安装(推荐)-版本稍旧 yum/apt-get install ansibleu 使用pip安装(依赖pip,gcc等)-版本新 pip install ansible两种安装方式:/etc/ansible/ansible.cfgAnsible配置Ansible主机清单-Inventory/etc/ansible/hostsInventory默认文件Ansible主机清单-主机与组正则匹配1、表示所有的主机使用all 或*Ansible主机清单-主机与组正则匹配2、通配符(*)和逻辑或(:)Ansible主机清单-主机与组正则匹配3、逻辑非和逻辑与Ansible常用模块uAd-hoc -ansible命令uPlaybook -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常用模块ansible all-m pingping模块ansible all-m command-a uptimecommand模块ansible all-m service-a name=nginx state=restartedservice模块ansible all-m yum-a name=telnet state=presentyum模块ansible all-m shell-a cat/dev/null /var/log/nginx/access.logshell模块Ansible常用模块ansible all-m copy-a src=/root/nginx.conf desc=/etc/nginx/nginx.conf owner=nginx group=nginx mode=644copy模块ansible java-m unarchive-a src=java7.tar.gz copy=yes dest=/usr/java owner=root group=rootunarchive模块ansible all-m replace-a path=/etc/hosts regexp=10.10 replace=10.12replace模块ansible mysql-m lineinfile-a dest=/etc/hosts line=10.10.31.181 db1lineinfile模块ansible java-m file src=/usr/java/jdk1.7 dest=/usr/java/jdk state=link owner=root group=rootfile模块YAML介绍 YAML 是“Yet Another Markup Language”(仍是一种置标语言)的头字母简写,目前一般专门用来写配置文件的语言,对于人类很友好。YAMLYAML介绍大小写敏感使用缩进表示层级关系缩进时不允许使用Tab键,只允许使用空格。缩进的空格数目不重要,只要相同层级的元素左侧对齐即可基本语法规则对象:键值对的集合,又称为映射(mapping)/哈希(hashes)/字典(dictionary)数组:一组按次序排列的值,又称为序列(sequence)/列表(list)纯量(scalars):单个的、不可再分的值支持的数据结构YAML介绍 数据结构一组键值对,使用冒号结构表示task:install对像depend:-gcc -openssl-devel列表(sequence)name:install jdk1.7 hosts:test_host remote_user:root sudo:false gather_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)pplaybookspjdk自动部署ptomcat自动部署pAnsible rolespMysql主从自动部署Playbooks(剧本)剧本是Ansible的配置、部署语言,由它对描述你想要远程机器执行的策略或步骤,使用YAML编写。playbooks是由一个或多个“play”(task)组成的列表。从根本上讲task就是调用ansible的一个module。将多个play组织在一个playbook中,运行时就会根据自上而下的顺序依次执行。Playbooks(剧本)简介-hosts:all tasks:-name:test connection ping:Playbooks(ping.yaml)#ansible-playbook ping.yamlPlaybooks(jdk部署)-name:install jdk1.7 hosts:java remote_user:root sudo:false gather_facts:true vars:jdk_ver:jdk1.7.0_79 jdk_pack:jdk-7u79-linux-x64.tar.gz tasks:-name:mkdir/usr/java file:path=/usr/java state=directory owner=root group=root -name:push jdk package and unpack unarchive:src=jdk_pack copy=yes dest=/usr/java/owner=root group=root -name:make soft link file:src=/usr/java/jdk_ver dest=/usr/java/jdk state=link owner=root group=root -name:setup java env blockinfile:dest:/etc/profile marker:#mark JAVA ENV block:|export JAVA_HOME=/usr/java/jdk export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar export PATH=$PATH:$JAVA_HOME/binPlaybooks(JDK部署)Playbooks(tomcat部署)-name:install tomcat7 hosts:tomcat remote_user:root sudo:false gather_facts:true vars:tomcat_ver:7.0.73 tomcat_pack:http:/ tomcat_ver/bin/apache-tomcat-tomcat_ver.tar.gz tomcat_dir:/opt tomcat_location:tomcat_dir/apache-tomcat-tomcat_ver tasks:-name:get tomcat7 package and unpack unarchive:src=tomcat_pack dest=tomcat_dir remote_src=yes -name:tomcat start script add utf8 lineinfile:dest:tomcat_location/bin/catalina.sh insertafter:#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:tomcat config file add utf8 replace:dest:tomcat_location/conf/server.xml regexp:redirectPort=8443 replace:redirectPort=8443 URIEncoding=UTF-8 useBodyEncodingForURI=truePlaybooks(tomcat部署)Ansible Roles Roles是ansible中playbooks的目录组织结构。如果把所有的东西都写到playbooks里面的话,就会导致我们这个playbooks很臃肿,不宜读。而模块化之后,成为roles的组织结构,易读,代码可重用,层次清晰等等好处。Ansible Roles简介nfiles:存放由copy或script等模块调用的文件ntempaltes:Jinja2模板文件ntasks:至少应该包含一个名为main.yml的文件,其定义了此角色的任务列表,些文件可以使用include包含其它的位于此目录中的task文件nhandlers:至少包含一个main.yml文件,用于定义此角色用到的各handler,在handler中使用include包含的其他handler文件也应该位于此目录nvars:应当包含一个main.yml文件,用于定义此角色用到的变量nmeta:应当包含一个main.yml文件,用于定义此角色的特殊设定及依赖关系等ndefault:为当前角色设定默认变量时使用些目录,包含一个main.yml文件Roles的目录作用Roles(tomcat部署)-hosts:tomcat remote_user:root sudo:false gather_facts:true roles:-role:tomcatRoles(tomcat部署)Roles(mysql主从部署)-hosts:10.10.31.181 remote_user:root sudo:false gather_facts:true roles:-role:mariadb_master-hosts:10.10.31.182 10.10.31.183 remote_user:root sudo:false gather_facts:true roles:-role:mariadb_slaveRoles(mysql主从部署)谢谢Q&A