list - 在生成的数字在列表中时生成随机数 - ansible
问题描述
我正在尝试在 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),以及当生成的数字不在列表中时,如何在生成的数字存在时继续生成随机数列表,我想停止循环并将这个数字用于某些事情。
解决方案
这非常棘手,实际上我不能说我有一个干净的解决方案给你。首先,要获得从 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
列表中,则分配它到value
var。
任务代码:
---
- 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
shell_command.rc
很高兴看到这个问题的纯ansible实现(尽管我觉得它不会像这样简单)。
希望这些帮助
推荐阅读
- ios - 我可以创建一个只能访问特定 IP 的 IOS 应用程序吗?
- python - 按任意间隔对时间索引的 DataFrame 进行分组
- windows-10 - 在 Windows 10 IoT Core 中禁用自动隐藏滚动条
- restfb - RestFB - 如何从收到的用户访问令牌中验证应用程序 ID
- reactjs - undefined 不是对象(评估'_this2.props.navigation')或与其他导航相比结果不一致
- asp.net - PageAsyncTask 与仅调用 await
- css - 如何在不影响css网格中的其他行的情况下将行拉伸到屏幕的全尺寸
- java - JavaFX 一次运行大量倒数计时器?
- ios - 实现willDisplay功能时UITableViewCell没有取消选择
- javascript - 如何对具有提供/注入的 VUE 组件进行单元测试?