在脚本的世界里,数据库建表过程是最为常见的drop-if-exist的使用示例,

drop-if-exist的使用场景
以数据库建表为例,无论事前存在与否都首先要Drop(删除原有表),然后创建新的表。实际上跟Ansible中的幂等性的原则基本上是一致的,无论是之前表存在还是不存在,用户所关心的是这个task执行之后表的存在。但是问题在于如果在于首次执行表不存在的时候会出现删除出错,然后需要用户自行判断原因是否还有其他可能,所以drop if exist的写法就是为了判断是否之前是否存在此表,这种方式在很多情况下都存在,比如创建database、tablespace,以及kubernetes中的namespace、clusterrolebinding等。

使用示例

比如如下写法就是一个clusterrolebinding的典型写法,先删除,然后再创建。原因就是如果不先删除,如果事前此clusterrolebinding存在的话就会无法创建。但是如果首次执行或者执行时不存在clusterrolebinding,删除的任务就会失败,但是结合ignore_errors的写法至少能够对应clusterrolebinding存在和不存在的两种情况。

- name: delete clusterrolebindingshell: "kubectl delete clusterrolebinding {{ var_kubeconfig_client_kubelet }}"ignore_errors: true- name: create clusterrolebindingshell: "kubectl create clusterrolebinding {{ var_kubeconfig_client_kubelet }} \--clusterrole={{ var_kubeconfig_role_bootstrapper }} \--user={{ var_kubeconfig_client_kubelet }}"ignore_errors: true

这种情况多次执行时能正常运行,但是首次执行时删除的任务则会提示如下类似的错误信息

"stderr": "Error from server (NotFound): clusterrolebindings.rbac.authorization.k8s.io \"kubelet-bootstrap\" not found", "stderr_lines": ["Error from server (NotFound): clusterrolebindings.rbac.authorization.k8s.io \"kubelet-bootstrap\" not found"]

drop-if-exist的写法

简单来说就是事前检查,结合脚本的|| 和&&的小技巧,可以非常容易的在Ansible脚本中实现这个功能,比如可将上述写法改为:

- name: drop if exist clusterrolebinding then create clusterrolebindingshell: "( ! kubectl get clusterrolebinding {{ var_kubeconfig_client_kubelet }}      \|| kubectl delete clusterrolebinding {{ var_kubeconfig_client_kubelet }} ) \&& kubectl create clusterrolebinding {{ var_kubeconfig_client_kubelet }}   \--clusterrole={{ var_kubeconfig_role_bootstrapper }} \--user={{ var_kubeconfig_client_kubelet }}"

总结

检查是否存在,如果存在然后删除既有的再创建,如果不存在直接创建,这种类似的场景都可以使用本文示例中的(||)&&的写法来完成。

实例学习Ansible系列(19)drop-if-exist不出错的写法相关推荐

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

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

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

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

  3. 实例学习Ansible系列:幂等性

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

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

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

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

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

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

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

  7. SAP PM 初级系列19 - IP10为维修计划触发维修工单的同时也自动触发了维修通知单!

    SAP PM 初级系列19 - IP10为维修计划触发维修工单的同时也自动触发了维修通知单! 执行事务代码IP10, 输入维修计划代码,回车, 点击Manual call按钮,如上图.进入如下界面, ...

  8. 机器学习系列19:将核函数应用于支持向量机

    https://www.toutiao.com/a6701463387273953806/ 机器学习系列19:将核函数应用于支持向量机 当我们在已知参数的情况下,如何用带有核函数的支持向量机(SVM) ...

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

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

最新文章

  1. 推荐25款很棒的 HTML5 前端框架和开发工具【下篇】
  2. 大数据平台的整体架构由哪些组成
  3. 51nod1394 差和问题 值域线段树
  4. windows下双击可运行的Java软件打包方案
  5. Ajax:异步JavaScript和XML的笔记略解,不作为知识参考
  6. java实现dex转jar_dex转jar工具
  7. [转载]关于wm系统同步时ActiveSync出现85010014错误号的解决办法
  8. iTunes Windows 历史版本下载
  9. 彻底清除计算机磁盘上的病毒,电脑硬盘病毒无法彻底删除怎么办
  10. 【破解】PyCharm2018专业版激活(激活到2100年)
  11. javax.persistence.EntityNotFoundException: Unable to find 类 with id ?
  12. 2021.11.28
  13. 3D立体相册,一个可旋转的立体相册
  14. 大数据分布式数据库系统介绍
  15. twitter账户受限_如何为您的企业设置Twitter帐户
  16. 苹果xsmax怎么开机_粉丝水洗苹果XS MAX手机不开机,Face ID报废,你还这么做吗?...
  17. 微信小程序样式-元素选择器的使用
  18. 128.OpenLDA安装并配置客户端-1
  19. 国内云计算的下半场机遇在哪里?
  20. 炒鸡简单的javaScript的call和apply方法

热门文章

  1. 短视频测试——腾讯大牛分享短视频测试经验
  2. 【React】React官方文档学习小记
  3. [Kaggle比赛] 高频股价预测小结
  4. Spring 事务管理简介
  5. Qt5.6.1移植海思Hi3521d(三)
  6. 录音如何转换成mp3格式
  7. 【云原生】k8s 管理平台 rancher
  8. 精彩回顾 | 华为 HDG 成都站霸气上演 蓉城风云再起
  9. Machine Learning for Encrypted Malware Traffic Classification Accounting for...阅读笔记
  10. 云计算机如何装系统,云净装机大师使用教程