,自动化运维工具之一,什么样的情况需要批量部署?2、常见的操作系统配置有cfengine、puppet、chef、func。其中puppet***3.部署批处理程序4.运行批处理命令查看状态信息2.ansible简介ansible的结构大致如下优势批量操作系统配置,批处理程序部署,以及实现批量运行命令。运维工具常用工作模式1、代理模式:基于ssl实现。代理在被监控端工作。像木偶。2、Agentless模式:基于ssh服务,工作在被监控端。监控端是ssh的客户端。在无代理模式下工作时,Ansible是幂等的。Ansible在控制端只需要告诉监控终端想要的状态就可以实现批量部署。GlossaryExplanation幂等性不会重复执行相同的指令。比如软件不会重复安装。期望状态只需要告诉被监控端的期望状态即可。Ansible基于模块工作。Ansible本身不具备批量部署的能力。真正具有批量部署的是模块ansibleruns只是提供了一个框架。该体系结构包括连接插件连接插件负责与被监控端通信。HostInventory:指定操作的主机是配置文件中定义的用于监控的主机。各种模块、核心模块、命令模块、自定义模块、插件用于完成记录日志邮件等功能。PlayBooks:当脚本执行多个任务时。没有必要让节点一次运行多个任务。3.ansible的基本使用安装软件yuminstalllansible-y#对应的软件也可以在epel仓库手动编译#源码地址https://pypi.python.org/packages/source/a/ansible/ansible-1.5.tar.gz2,定义HostInventory#vim/etc/ansible/hosts[webhosts]172.16.10.22ansible_ssh_user=rootansible_ssh_pass=guoting172.16.10.33ansible_ssh_user=rootansible_ssh_pass=guotingsh_yes#ansible_s登录用户#ansible_ssh_pass=guoting3.ssh登录密码每个模块#注意可以使用ansible-docMOD查看每个模块的使用情况。MOD_ARV'支持的模块可以使用ansible-doc-l查看ansible示例1,查看时间信息。command,shellmodule2.在控制端添加用户。用户模块3.实现sshkey认证。Shell,复制模块#p#,此时可以实现基于ssh秘钥的通信。这时候可以修改/etc/ansible/hosts如下######/etc/ansible/hosts[webhosts]172.16.10.22172.16.10.334,安装软件,启动服务。yum,服务模块5.支持管道命令。raw模块类似于shell模块四、YAML语言介绍1.YAML介绍YAML是一种可读性很强的数据序列表达格式。YAML参考了许多其他语言,包括XML、C语言、Python、Perl和电子邮件格式RFC2822。ClarkEvans于2001年在***发表了该语言。此外,IngydtNet和OrenBen-Kiki也是该语言的共同设计者。YAMLAin'tMarkupLanguage意味着YAML不是XML。但是,在开发这种语言的时候,YAML其实就是“YetAnotherMarkupLanguage”的意思,仍然是一种标记语言。其特点YAML可读性强YAML与脚本语言交互性好YAML使用实现语言的数据类型YAML具有一致的信息模型YAML易于实现YAML可基于流进行处理YAML具有很强的表现力和良好的可扩展性更多的内容和规范请参阅http://www.yaml.org。#############################YAML语法YAML的语法类似于其他高级语言,可以方便的表达数据结构如作为列表、哈希表和标量。其结构体Structure用空格显示序列中的项Sequence用“-”表示Map中的键值对,用“:”分隔。YAML文件扩展名通常是.yaml或.yml。下面是一个例子。name:JohnSmithage:41gender:Malespouse:name:JaneSmithage:37gender:Femalechildren:-name:JimmySmithage:17gender:Male-name:JennySmithage13gender:FemaleYAML2重要结构组件列表和目录#####################################这个元素使用“-”-Strawberry-Mango################################dictionary字典由key和value来标识f例如---#Anemployeerecordname:ExampleDeveloperjob:Developerskill:Elite您也可以将key:value放在{}中进行表示。例如---#Anemployeerecord{name:ExampleDeveloper,job:Developer,skill:Elite}多个映射组成一个字典,一个列表可以包含多个字典。2.ymal中的变量####################################变量命名变量名只能由以下组成字母和数字以及下划线,并且只能以字母开头。######################################facts事实是远程目标主机发回的信息正在通信这些信息存储在ansible变量中。要获取指定远程主机支持的所有事实,可以使用如下命令#ansiblehostname-msetup该命令可以获取被监控主机的各种信息,获取后将信息保存到变量中。####################################自定义变量可以在yaml中使用vars关键字来定义变量vars:var_name:值###############################变量引用{{var_name}}#############################特殊变量迭代当有任务需要重复执行时,可以使用迭代机制。它的使用格式是将要迭代的内容定义为item变量引用,并使用with_items语句指定要迭代的元素列表。##########################################例如,在受控上添加2个用户side1一般做法-name:addusertestuser1user:name=testuser1state=presentgroups=wheel-name:addusertestuser2user:name=testuser2state=presentgroups=wheel方法2使用变量method-name:addseveralusersvars:user1:testuser1user2:testuser2user:name={{user1}}state=presentgroups=wheeluser:name={{user2}}state=presentgroups=wheel方法三使用迭代法-name:addseveralusersuser:name={{item}}state=presentgroups=wheelwith_items:-testuser1-testuser2其实with_items中可以使用的元素也可以是hash,比如-name:addseveralusersuser:name={{item.name}}state=presentgroups={{item.groups}}with_items:-{name:'testuser1',groups:'wheel'}-{name:'testuser2',groups:'root'}3.Inentory文件的格式。清单文件遵循INI文件样式。括号中的字符是组名。同一主机可以同时合并到多个不同的组中。另外,如果目标主机使用非默认的SSH端口,可以在主机名后用冒号和端口号来标记。[webservers]www1.magedu.com:2222www2.magedu.com[dbservers]db1.magedu.comdb2.magedu.comdb3.magedu.com如果主机名遵循类似的规则,您还可以使用列表来识别每个主机命名模式例如[网络服务器]www[01:50].example.com[数据库]db-[a:f].example.com####################hostvariables您可以在清单中定义主机时将主机变量添加到主机,以便于在playbook中使用。例如[webservers]www1.magedu.comhttp_port=80maxRequestsPerChild=808www2.magedu.comhttp_port=303maxRequestsPerChild=909####################组变量组变量赋值给指定groups剧本中所有主机上剧本中可用的变量。例如[webservers]www1.magedu.comwww2.magedu.com[webservers:vars]ntpntp_server=ntp.magedu.comnfsnfs_server=nfs.magedu.com##################Group嵌套的Inventory组也可以包含其他组,也可以为组中的主机分配变量。但是这些变量只能在ansible-playbook中使用,ansible不支持。例如[apache]httpd1.magedu.comhttpd2.magedu.com[nginx]ngx1.magedu.comngx2.magedu.com[webservers:children]apachenginx[webservers:vars]ntpntp_server=ntp.magedu.com##########################inventory参数ansible是基于ssh连接到inventory中指定的远程主机,也可以通过参数指定其交互方式.常用参数如下ansible_ssh_host#要连接的主机名ansible_ssh_port#默认端口号为22ansible_ssh_user#ssh连接的默认用户名ansible_ssh_pass#ssh连接的密码ansible_sudo_pass#使用sudo连接用户的密码ansible_ssh_private_key_file#secretkeyfileifyoudon'twanttousessh-agentmanagement这个选项可以在ansible_shell_type时使用#shelltypedefaultsh###########################################################################################Ansible的loop机制有更多高级功能,具体请参考官方文档http://docs.ansible.com/playbooks_loops.html.#p#4。剧本剧本是一个或多个“剧本”的列表。play的主要作用是将预先合并到一个group中的hosts打扮成ansible中task预先定义的角色。从根本上说,所谓任务无非就是调用ansible的模块。将多个剧本组织成一个剧本,让他们按照事先安排好的机制,合唱一出大戏。############################playbook基本组成1、Hosts和Usersplaybook中每一个play的目的是让一个或某些主机作为指定用户执行任务。hosts用于指定执行指定任务的主机,可以是一个或多个以冒号分隔的主机组。remote_user用于指定在远程主机上执行任务的用户。但是,remote_user也可以在每个任务中使用。它还可以用于通过sudo指定它来在远程主机上执行任务。它可以用来播放全局或某个特定的任务。此外,你甚至可以使用sudo_user来指定sudo时切换的用户。-hosts:webnodesremote_user:mageedutasks:-name:testconnectionping:remote_user:mageedusudo:yes2.任务列表和动作播放的主要部分是tasklist。tasklist中的每一个任务在hosts中指定的所有主机上依次执行,即第一个任务在所有主机上完成后,第二个任务开始。运行bottom-downplaybook时,如果中途出错,所有执行的任务都会回滚,修改playbook后再执行即可。该任务的目的是执行具有指定参数的模块,并且可以在模块参数中使用变量。模块执行是幂等的,这意味着多次执行是安全的,因为结果是相同的。每个任务都应该有它的名称,用于playbook的执行结果输出。建议其内容尽可能清楚地描述任务执行步骤。如果未提供名称,则操作结果将用于输出。“action:moduleoptions”或“module:options”的格式可以用来定义任务。建议使用后者以实现向后兼容性。如果一行动作内容过多,可以在行首使用几个空白字符来换行。tasks:-name:makesureapacheisrunningservice:name=httpdstate=running在众多模块中,只有command和shell模块只需要给出一个列表即可,无需使用“key=value”格式。例如,任务:-name:disableselinuxcommand:/sbin/setenforce0如果命令或脚本的退出代码不为零,则可以使用以下命令代替任务:-name:runthiscommandandignoretheresultshell:/usr/bin/somecommand||/bin/true或使用ignore_errors忽略错误消息tasks:-name:runthiscommandandignoretheresultshell:/usr/bin/somecommandignore_errors:True3.处理程序用于在相关资源发生变化时采取某些操作。可以使用“notify”动作在每次播放结束时触发,这样可以避免每次发生多次变化时都执行指定操作,而不是在所有变化发生后才执行一次指定操作。notify中列出的操作称为handlers,即在notify中调用handlers中定义的操作。-name:templateconfigurationfiletemplate:src=template.j2dest=/etc/foo.confnotify:-restartmemcached-restartapachehandler是任务列表这些任务与前面提到的任务没有本质区别。handlers:-name:restartmemcachedservice:name=memcachedstate=restarted-name:restartapacheservice:name=apachestate=restarted5,tagtags用来让用户选择运行或者传递playbook中的一些代码。Ansible是幂等的,所以它会自动跳过没有变化的部分。即便如此,有些代码仍然需要很长时间才能测试它们没有改变。这时候如果确定没有变化,可以通过标签跳过这些代码片段。基于playbooks实现web服务部署的例子1.ProvideInventoryfile#/etc/ansible/hostsbasedonsecretkeyauthentication[webhosts]172.16.10.22172.16.10.332.编辑palybooks脚本#vim/root/web.yaml-name:webserviceremote_user:roothosts:webhostsvars:packages:httpdtasks:-name:installhttpdyum:name={{packages}}state=presenttags:install-name:configurationhttpdcopy:src=/root/httpd.confdest=/etc/httpd/conf/httpd.conftags:conf通知:-restarthttpd-name:servicehttpdstartservice:name=httpenabled=nostate=startedtags:start-name:addcentosandhadoopuseruser:name={{item}}state=absenttags:adduserwith_items:-centos-hadoophandlers:-name:restarthttpdservice:name=httpdstate=restarted3.准备好配置文件,将web配置放到指定目录src=/root/httpd.conf4.开始部署ansible-playbooks/root/web.yml结果示例查看端口如果此时配置文件发生变化,则基本使用配置完成。博客地址:http://guoting.blog.51cto.com/8886857/1553446
