知识点:
大多数的Ansible模块在设计时保证了幂等性,幂等性保证了Ansible脚本多次执行情况下的相同结果,尽可能的避免使用那些不能满足幂等性的模块。

什么是幂等性

幂等性(Idempotency):
幂等性是数学和计算机科学上一个常见的概念,多次执行产生的结果不会发生改变,这样的特性就被成为幂等性。幂等性是Idempotency的中文翻译,幂在数学上表示乘方结果,乘方的结果相等可以简洁地描述多次执行后得到相同结果这一概念的意思。

  • 数学上符合幂等性的常见例子:

符合幂等性一元函数:
一元函数符合幂等性需要保证f(fx)) = f(x), 所以如下示例类型的函数都满足幂等性:

  • f(x) = x: 恒等函数:输入和输出相等的函数
  • f(x) = 常数: 常数函数:无论输入为什么,输出都是相同的结果
  • 计算机操作上符合幂等性的常见例子:

HTTP的GET和PUT方法符合幂等性:
HTTP提供GET/PUT/POST等操作,GET方法和PUT方法均保证多次执行产生相同结果的这一特性,所以是符合幂等性的,而POST则不符合

Ansible模块与幂等性

Ansible包含众多的模块,大部分模块都能够保证操作的幂等性,即相关操作的多次执行能够达到相同结果这一特性,但是也有不满足幂等原则的,比如shell模块和raw模块。

删除操作:file模块 vs rm命令

场景说明:
比如实现删除一个临时性的文件/tmp/testfile的操作,如果希望其在相同的条件下,多次执行能够保持相同的结果,至少需要保证此操作在/tmp/testfile文件存在和不存在的情况下都能正常动作。

很多熟悉脚本书写的开发者使用的最多的可能就是shell或者raw的模块,但是这样无法最大程度的利用Ansible的特性,比如删除/tmp/testfile这个操作,直接使用raw模块调用rm命令可以简单实现。

[root@host131 ~]# touch /tmp/testfile
[root@host131 ~]# ansible host131 -m raw -a "rm /tmp/testfile"
host131 | SUCCESS | rc=0 >>
Shared connection to host131 closed.[root@host131 ~]#

而考虑到删除操作的幂等性,多次执行和单次执行区别在什么地方,其中之一就是前次操作产生的结果可能是已经将此文件删除了,所以在文件已经被删除的情况下再进行重新执行的话,使用raw调用rm命令的方式就会失败,执行日志如下所示:

[root@host131 ~]# ansible host131 -m raw -a "rm /tmp/testfile"
host131 | FAILED | rc=1 >>
rm: cannot remove ‘/tmp/testfile’: No such file or directory
Shared connection to host131 closed.
non-zero return code[root@host131 ~]#

因为在文件不存在的情况下,删除命令rm执行失败返回了非零值,对于Ansible调用raw模块来说,这个结果是失败,而对于用户的操作来说,如果用户只是需要此文件被删除,关注的是文件不存在的结果,这就是业务需求上的幂等性要求,这种要求之下,按照传统的方式则需要在上述实现中添加条件判断了,这样的结果会导致Ansible写的比脚本还要麻烦和难以阅读。

  • 使用file模块进行文件删除
    如果直接使用file模块进行文件删除,相同的代码,多次执行,结果都会成功,而changed字段的结果则会反映出文件删除的操作到底有没有被进行。可以使用file模块进行删除操作是符合幂等性要求的,使用起来更加方便,只需要关注最终状态即可,这也是使用Ansible和Shell脚本编程的一个重要区别。
  • Ansible的提示
    如果使用shell模块调用rm命令,Ansible还会给出Warning的判断,比如如下所示
[root@host131 ~]# touch /tmp/testfile
[root@host131 ~]# ansible host131 -m shell -a "rm /tmp/testfile"[WARNING]: Consider using file module with state=absent rather than running rmhost131 | SUCCESS | rc=0 >>[root@host131 ~]#

总结

幂等性是在实际应用中经常需要考虑的概念,尤其是运维中。相较于将幂等性理解为各种异常情况的综合处理,将其理解为执行时需要考虑到在前次执行产生的影响的情况下能够正常执行则会更加容易接近业务需求。

其他内容

  • 实例学习Ansible:https://blog.csdn.net/liumiaocn/article/details/87273800

实例学习Ansible系列:幂等性相关推荐

  1. 实例学习Ansible系列:颜色与设定

    知识点: Ansible执行的时候根据结果会显示为绿色(成功执行),黄色(成功伴随状态改变)和红色(执行失败)等颜色,颜色的显示与changed的状态相关联,并可以在ansible.cfg中进行定制颜 ...

  2. 实例学习Ansible系列:配置文件ansible.cfg的设定与使用

    知识点:Ansible中通过多层次的ansible.cfg的设定,利用不同目录结构下的配置文件的作用域,还可以结合ANSIBLE_CONFIG环境变量进行自行指定,较为方便和灵活. 环境准备 [roo ...

  3. 实例学习Ansible系列(19)drop-if-exist不出错的写法

    在脚本的世界里,数据库建表过程是最为常见的drop-if-exist的使用示例, drop-if-exist的使用场景 以数据库建表为例,无论事前存在与否都首先要Drop(删除原有表),然后创建新的表 ...

  4. 实例学习ansible系列(7)常用模块之ping/setup

    知识点:ping模块,用于确认和对象机器之间是否能够ping通,正常情况会返回pong 知识点:setup模块,用于收集对象机器的基本设定信息. ping使用实例 [root@host31 ansib ...

  5. 实例学习ansible系列(12)常用模块之docker

    知识点:ansible使用docker可以对其进行管理.基本接近docker-compose对docker的使用支持,非常接近.诸如从port的设定到volume_from都支持,但是需要docker ...

  6. 实例学习Ansible系列(21)从标准输出获取循环的列表

    在前面的文章中已经介绍过使用with_items进行循环控制,在静态的循环列表控制时非常方便,比如向某个特定目录下拷贝多个指定的文件.而如果对于动态的返回的列表则需要将参数传递给with_items, ...

  7. Ansible系列(六):循环和条件判断

    Ansible系列文章:http://www.cnblogs.com/f-ck-need-u/p/7576137.html 1. 循环 ansible中的循环都是借助迭代来实现的.基本都是以" ...

  8. Ansible系列-基础篇-Ansible Inventory的合理化配置

    欢迎关注个人公众号 DailyJobOps 原文地址:Ansible系列-基础篇-Ansible Inventory的合理化配置 这里写目录标题 Ansible Inventory内置参数 Inven ...

  9. Ansible系列之roles使用说明

    roles(角色)介绍 ansible自1.2版本开始引入的新特性,用于层次性,结构化地组织playbook.roles能够根据层次型结构自动装载变量文件.tasks以及handlers等.要使用ro ...

最新文章

  1. 一步一步教你如何向ALEXA提交网站介绍信息
  2. [Step By Step]SAP HANA创建层次结构的属性视图(Hierarchy Attribute View)
  3. SAP财务报表不平之分析
  4. boost的chrono模块运行时解析的测试程序
  5. 同一类的不同对象,在调用相同的成员函数时,入口地址是相同的
  6. 《全栈营销之如何制作个人博客》之二:php环境安装及个人博客后台搭建 让你的博客跑起来...
  7. LeetCode 3_Longest Substring Without Repeating Characters
  8. C++ Unicode和ANSII转换
  9. birt报表模板只打印了第一行_财务系统全套表格模板201个!成为同事眼中的红人!低调分享...
  10. MVC和WebApi中设置Area中的页为首页
  11. 源码实现 -- strdel
  12. 关于使用easyui dataGrid遇到的小bug问题
  13. (第24讲)java小程序——Applet
  14. Python IDE(集成开发工具)的下载安装教程
  15. NCBI Genbank核苷酸序列数据库检索基因序列解读
  16. 超平面(hyperplane)
  17. 使用svn向指定文件夹下载数据
  18. 计算机网络 路由器的端口ip,给路由器的一个接口上配置两个IP地址
  19. 2018年什么编程语言最值得学习
  20. zookeeper启动报错Exiting JVM with code 3

热门文章

  1. ‘adb‘ 不是内部或外部命令和Error while executing: am start -n的解决实践
  2. 个人全自动发卡网 完整版 附加 完整教程
  3. 保姆级JDK1.8安装教程(安装文件下载链接置于文章结尾)
  4. 从零开始学Java-Day01:Java常用计算机基础知识、JDk的下载与安装、环境变量的配置、IDEA的下载与安装
  5. 如何调整Linux系统为正确时区
  6. 新手站长如何选择服务器?
  7. 7年坚定投身“高清头显”,纳德光学聚焦打造高清头显领导品牌
  8. AutoCAD模型空间多视口之叠加视口应用
  9. 利用NCL和Shell制作动图
  10. python读取fiddler_大数据采集之python的docker爬虫技术-fiddler抓包软件详细配置(7)...