生成的数字在列表中时生成随机数 - ansible

时间:2018-05-28 16:57:55

标签: list loops random 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),如果生成的数字存在于列表中,当生成的数字为n时,如何生成随机数? #39;在列表中,我想停止循环并将此数字用于某事。

1 个答案:

答案 0 :(得分:0)

这非常棘手,实际上我不能说我有一个干净的解决方案。首先,要获得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变量(如果不在列表中),但是{{1} until任务的}子句仍然不起作用。

我发现一个可行的解决方案是使用shell命令生成随机数,将该值作为命令"退出代码" (因为只是stdout不起作用!!)如果退出代码不在include_tasks列表中,则将其分配给list var。

任务代码:

value

示例运行:

---
- 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代替exit,而shell代替shell_command.stdout,则直到不起作用如预期的那样。

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

希望这些帮助