文档章节

Ansible随机数

大别阿郎
 大别阿郎
发布于 08/17 13:05
字数 551
阅读 37
收藏 0

想为你的Ansible剧本取一个随机数?还想在接下来的运行中保持系统的等幂性?这里有一个答案。

假如,你要为一大批服务器设置cron任务,却不想让它们同时启动,你可以这样设置分钟数:

minutes: "{{ 60 | random }}" 

但是,如此生成的随机(分钟)数在运行之后,会产生许多不必要的任务变化。到了Ansbile 2.3,事情有了改观。

Ansible 2.3的改进

在Ansible的2.3版本中,可以从一个“种子”里获取随机。这样就可以得到一个随机但等幂的数值:

"{{ 59 |random(seed=inventory_hostname) }} * * * * root /script/from/cron"

以前版本的Ansible怎么办?
你可以根据任何一个变量或真值(Ansible从主机上采集到的FACT数据)来编造一个伪随机数。如,你可以用inventory_hostname来在各不同的主机上生成“随机数”,还能保证剧本的运行等幂。在剧本中,这样写:

minutes: "{{ ( inventory_hostname | hash | list | map('int',0,16) | sum ) % 60 }}"  

魔术可以这样解释:

第1步:获取主机名 inventory_hostname,如:myserver

第2步:将其序列化,取得一个哈希数,如"c3a7a35a28dcce27daad3a7a90caad99b967a904"

第3步:将其拆分为单字数组[["c","3","a",...]

第4步:每个单字实际上是一个16进制数字

第5步:把这些数字转成十进制

第6步:将所有的数字加起来

第7步:总和除以60之后的余数,就是最终的“随机数”

于是,Ansible的剧本中,你的cron任务可能会这样写:

cron:
  name: myjob
  job: myscript.sh
  minute: "{{ ( inventory_hostname | hash | list | map('int',0,16) | sum ) % 60 }}"
  hour: "{{ (( inventory_hostname | hash | list | map('int',0,16) | sum ) % 2) + 6 }}"

这样,就可以在6:00 - 7:59之间随机一个分钟点运行myscript.sh程序,还能保证剧本运行结果的等幂性。

这篇文章是本人翻译过来的,原作请见链接。

本文转载自:https://ansibledaily.com/idempotent-random-number/

共有 人打赏支持
大别阿郎
粉丝 6
博文 44
码字总数 22964
作品 0
广州
个人站长
私信 提问
CentOS 6.5 Corosync + pacemaker实现httpd服务的高可用

Corosync:它属于OpenAIS(开放式应用接口规范)中的一个项目corosync一版本中本身不具备投票功能,到了corosync 2.0之后引入了votequorum子系统也具备了投票功能了,如果我们用的是1版本的,又...

wei0164
2014/04/23
0
0
翻译-Salt与Ansible全方位比较

原文链接:http://jensrantil.github.io/salt-vs-ansible.html 作者: Jens Rantil 之前某些时候我需要评估配置管理系统。结合从他人得到的意见,我认为Puppet及Chef在配置和运行方面过于复杂...

无敌西瓜
2015/07/21
0
0
centos7 ansible yum安装web软件

一、网站拓扑 ansible主机inventory的情况: # cat ansible_inventory.txt [front] 10.11.7.224 ansibleconnection=ssh ansiblesshuser=root ansiblessh_pass=xuAK 10.11.5.209 ansibleconn......

youkoudiancom
2017/04/15
0
0
自动化运维工具 Ansible

学习Ansible的系列文章 Ansible 介绍 Ansible 架构 Ansible 安装 Ansible 配置文件及参数 Ansible 常用模块 Ansible playbook 1. Ansible 介绍 Ansible 是一个配置管理和应用部署工具,只需要...

行者阿难
10/07
0
0
自动化运维ansible的介绍

Ansible的概念: ansible是新出现的自动化运维工具,基于Python开发,集合了众多运维工具(puppet、chef、func、fabric)的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能。 ...

Dysunshine
06/26
0
0

没有更多内容

加载失败,请刷新页面

加载更多

SpringBoot中使用@RequestBody时如何自定义需要转换的日期格式

SpringBoot序列化和反序列化Json时默认使用的是Jackson(例如使用@RequestBody反序列化前端传递过来的Json字符串时), 当我们前端使用Json字符串传递到后台时日期格式可能是时间戳(即long类...

帅得拖网速
35分钟前
0
0
可自定义扩展底部列表对话框ListBottomSheetDialogFragment

因为需要,为了方便,构建了一个可以自定义扩展的底部列表对话框,可以应付大部分场景。 效果图如下: 1.默认实现: 2.自定义列表实现 3.自定义头部和列表实现 一.可实现功能 1.默认可实现通...

明月春秋
今天
1
0
数据库---增删改查

增:insert into 表名(列名1,列名2) values(‘列值1’,‘列值2’) 多行数据处理:insert into 表名(列名1,列名2) select ‘列值1’,‘列值2’ union select ‘列值1.1’,‘列值2.2...

森林之下
今天
2
0
分布式/集群下session共享方案汇总

除去那些对容器依赖特别高的方案(如: 基于Tomcat的memcached-session-manager / tomcat-redis-session-manager,基于Jetty的jetty-nosql-memcache / jetty-session-redis ),自己整理了下...

哥本哈根的小哥
今天
2
0
Vue中的缩写:v-bind、v-on

v-bind 缩写:: 预期:any (with argument) | Object (without argument) 参数:attrOrProp (optional) 修饰符: .prop - 被用于绑定 DOM 属性。 .camel - (2.1.0+) 将 kebab-case 特性名转换......

文文1
今天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部