我试图在ansible中生成随机数,而生成的数字存在于数字列表中。
假设我的列表中包含此值。
list = [1, 3, 5, 8, 9, 10]
我正在使用这样的模块set_fact
。
- set_fact:
value: "{{ (1,10) | random }}"
until: value not in list
使用随机规则生成的值始终生成数字1
或10
,我使用模块debug
,如下面的代码,它始终生成不同的数字。
- debug:
msg: "{{ (1,10) | random }}"
我的问题是,如何在一定的时间间隔内生成随机数,如上面的那个(1,10),如果生成的数字存在于列表中,当生成的数字为n时,如何生成随机数? #39;在列表中,我想停止循环并将此数字用于某事。
答案 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实现(尽管我觉得它不会像这样直接)。
希望这些帮助