Это очень сложно, и на самом деле я не могу сказать, что у меня есть чистое решение для вас.Прежде всего, чтобы получить случайное число от 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
по-прежнему не будет работать.
Одно из решений, которое я нашел для работы, заключается в использовании команды оболочки для генерации случайного числа, имеющего это значение в качестве команды "код выхода"(так как просто 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
, оператор then будет работать не так, как ожидалось.
Был бы рад увидеть чисто ответную реализацию этого вопроса (хотя у меня было ощущение, что это будет не так просто, как это).
надеюсь, что это поможет