阿里技术专家:持续交付与微服务背后的实践逻辑
第二个重要的点叫做变更操作的幂等性.举个例子,某一次对机器的变更是在~/.bash_profile中添加一行对JAVA_HOME的配置:“export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk1.8.0_71.jdk/Contents/Home/”.那么我可以写一个shell脚本完成这件事情:“echo export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk1.8.0_71.jdk/Contents/Home/ >> ~/.bash_profile”.但是如果下次我的shell脚本里面多了安装apache web server的代码.我就需要把这整个脚本再对目标机器运行一次.那么就会出现~/.bash_profile中出现两行JAVA_HOME的配置的问题.虽然不至于引入错误,但也是很没有必要的操作. 所谓幂等性,就是同一个脚本对同一台机器运行多次后,机器的状态应该都是一致的.Ansible中模块(module)的概念就覆盖了“幂等性”这个概念.所谓模块是预先写好的一些库,然后可以在Ansible的脚本中进行调用.上面的在一个文件中添加一行的操作就可以使用“lineinfile”这个module来做.在Ansible脚本中的写法是:“lineinfile: dest=~/.bash_profile line=/Library/Java/JavaVirtualMachines/jdk1.8.0_71.jdk/Contents/Home/”.再比如还有一个module,叫做service,Ansible脚本中对于service的一个调用示例是这样的: “service: name=httpd state=started”.这个描述的含义就是:“保证名为httpd的service是started状态”.所以你可以想象到它的具体实现就是先检查下httpd这个service的状态,如果已经是started的就什么都不做,否则就启动它. 这种幂等性在配置管理方面是非常有用的,这样我就可以放心的运行这些脚本,知道最终一定可以得到某个一致的状态.而且可以节省运行这些脚本的时间,比如发现JDK已经装好了,就不需要再装一遍. 上面提到的Ansible编写的脚本被称作Playbook,下面是几个playbook的例子: 这个playbook是一个完整的例子,其中包括了我要部署那些机器(hosts).是用什么账户登录(root),运行哪些任务(tasks)等等.task中的name只是描述信息. 但是遗憾的是这种幂等性是不能完全保证的,有的module可以保证,比如上面提到的service和lineinfile.但有些是不行的,比如command module,它做的事情就是运行一条命令.Ansible无法判断这条命令是否执行过. 所以在使用Ansible的过程中需要尽量使用能够保证幂等性的module.这样才能保证所有的机器在运行一段时间之后配置是相同的,避免“配置漂移”.当然还有一个避免配置漂移的方法就是每次都重新申请一台新的机器,然后对着它运行一遍这些脚本.这也是可行的,我们后面对此进行讨论. Ansible作为一个完备的工具,在错误处理,回滚,调试等方面也都提供了便利的支持.详情大家可以参看Ansible的官网.上面有关于Ansible本身的介绍,和一系列的扩展module. 最后再看一看Ansible整体的结构: (编辑:淮北站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |