首页 > 解决方案 > 在生成的数字在列表中时生成随机数 - ansible

问题描述

我正在尝试在 ansible 中生成随机数,而生成的数字存在于数字列表中。

假设我的列表有这个值。

list = [1, 3, 5, 8, 9, 10]

我正在使用这样的模块set_fact

- set_fact:
    value: "{{ (1,10) | random }}"
  until: value not in list

使用随机规则生成的值总是生成数字110,我使用了debug类似下面代码的模块,它总是生成不同的数字。

- debug:
    msg: "{{ (1,10) | random }}"

我的问题是,如何在某个间隔内生成随机数,例如上面的(1,10),以及当生成的数字不在列表中时,如何在生成的数字存在时继续生成随机数列表,我想停止循环并将这个数字用于某些事情。

标签: listloopsrandomansible

解决方案


这非常棘手,实际上我不能说我有一个干净的解决方案给你。首先,要获得从 1 到 10 的随机数,您必须使用:

msg: "{{ 10 | random(start=1 }}"

问题是,这个任务没有像我们预期的那样工作,我猜这个until子句以神秘的方式工作(稍后会解释为什么):

- set_fact:
    value: "{{ 10 | random(start=1) }}"
  until: value not in list

运行它几次,你会意识到until循环被“绕过”了,有时你会得到排除列表list变量中的值。

您可以尝试include_tasks将循环扩展到 2 个任务(一个获取随机整数,然后分配给您的value变量,如果不在列表中,但任务的until子句include_tasks仍然不起作用。

我发现一种可行的解决方法是使用 shell 命令生成一个随机数,将该值作为命令“退出代码”(因为 stdout 将不起作用!!)如果退出代码不在list列表中,则分配它到valuevar。

任务代码:

---
- hosts: localhost
  connection: local
  gather_facts: false
  vars:
    my_list: [1, 3, 5, 7, 9, 10]  

  tasks:
    - name: run shell to get random number
      shell: exit `shuf -i 1-10 -n 1` 
      register: shell_command
      failed_when: shell_command.rc > 100
      until: shell_command.rc not in my_list
      retries: 1000
      delay: 1

    - name: print results
      debug:
        var: shell_command.rc

样品运行:

[root@optima-ansible ILIAS]# ansible-playbook testt.yml 

PLAY [localhost] ****************************************************************************************************************************************************************************************************

TASK [run shell to get random number] *******************************************************************************************************************************************************************************
FAILED - RETRYING: run shell to get random number (1000 retries left).
FAILED - RETRYING: run shell to get random number (999 retries left).
changed: [localhost]

TASK [print results] ************************************************************************************************************************************************************************************************
ok: [localhost] => {
    "shell_command.rc": "8"
}

PLAY RECAP **********************************************************************************************************************************************************************************************************
localhost                  : ok=2    changed=1    unreachable=0    failed=0   

[root@optima-ansible ILIAS]# 

如前所述,如果您在命令中使用echo而不是,而不是,直到将无法按预期工作。exitshellshell_command.stdoutshell_command.rc

很高兴看到这个问题的纯ansible实现(尽管我觉得它不会像这样简单)。

希望这些帮助


推荐阅读