在Ansible中是否可以从字符串生成哈希值?

时间:2019-04-02 09:31:36

标签: ansible

为了为每个主机生成随机的cron执行,我想将要执行的时间随机化,以分散负载并避免所有主机同时运行艰巨的任务。

因此,如果可以为每个主机生成不同的小时和分钟,它将自动传播它。

示例:

cron:
  name: "Conquer the world"
  minute: "{{ ansible.hostname | str2num(0, 59) }}"
  hour: "{{ ansible.hostname | str2num(4, 6) }}"
  job: "conquer_the_world.sh"

我要命名为str2num的函数是,该函数应确定性地为同一主机生成相同的数字,并且每个主机可能有所不同。

已经有解决方案吗?还是应该为此创建自定义过滤器?

答案

由于博客文章https://ansibledaily.com/idempotent-random-number/,我终于自己找到了答案:

cron:
  name: "Conquer the world"
  minute: "{{ (59 |random(seed=ansible_hostname)) }}"
  hour: "{{ (2 |random(seed=ansible_hostname)) + 4  }}"
  job: "conquer_the_world.sh"

通常:{{ ( (MAX - MIN) | random(seed=ansible_hostname)) + MIN }}

1 个答案:

答案 0 :(得分:0)

使用Random Number Filter。有一个cron示例:

"{{ 60 | random }} * * * * root /script/from/cron"
# => '21 * * * * root /script/from/cron'

一个选择是创建一个“时间表”,然后使用它。例如下面的播放

- hosts: test_jails
  tasks:
    - set_fact:
        my_cron_schedule: "{{ my_cron_schedule|default([]) | combine(
                              {item :{
                                 'my_cron_hour':(24|random),
                                 'my_cron_minute':(60|random)}}) }}"
      loop: "{{ play_hosts }}"
      run_once: true
    - debug:
        var: my_cron_schedule
      run_once: true

给予:

"my_cron_schedule": {
    "test_01": {
        "my_cron_hour": 17, 
        "my_cron_minute": 43
    }, 
    "test_02": {
        "my_cron_hour": 2, 
        "my_cron_minute": 13
    }, 
    "test_03": {
        "my_cron_hour": 13, 
        "my_cron_minute": 0
    }
}