Генерация случайного числа, в то время как сгенерированное число находится в списке - ответ - PullRequest
0 голосов
/ 28 мая 2018

Я пытаюсь сгенерировать случайные числа в ansible, пока сгенерированное число существует в списке чисел.

Предположим, что в моем списке есть эти значения.

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

IЯ использую модуль set_fact следующим образом.

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

Значение, генерируемое с использованием правила случайного выбора, всегда генерирует число 1 или 10, я использовал модуль debug каккод ниже, и он всегда генерирует разные числа.

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

Моя проблема здесь в том, как я могу генерировать случайное число в некотором интервале, как показано выше (1,10), и как я могу генерировать случайное числочисла, в то время как сгенерированный номер существует в списке, когда сгенерированный номер отсутствует в списке, я хочу остановить цикл и использовать этот номер для чего-то.

1 Ответ

0 голосов
/ 29 мая 2018

Это очень сложно, и на самом деле я не могу сказать, что у меня есть чистое решение для вас.Прежде всего, чтобы получить случайное число от 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 будет работать не так, как ожидалось.

Был бы рад увидеть чисто ответную реализацию этого вопроса (хотя у меня было ощущение, что это будет не так просто, как это).

надеюсь, что это поможет

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...