Сохранение строки случайного выбора в используемую переменную в ansible - PullRequest
0 голосов
/ 01 мая 2020

Надеясь, что кто-то может помочь мне понять, что, по моему мнению, должно быть простой проблемой вложенных строк. У меня есть следующие задачи, чтобы случайным образом выбрать строку, сохранить ее в переменной и распечатать:

  tasks:
    - name: Debug Section 1
      debug:
        msg: "{{ item }}"
      with_random_choice:
        - MY_CHOICE1
        - MY_CHOICE2
      register: choice

    - name: Set result to a fact
      set_fact:
        THE_CHOICE: "{{ choice.results }}"

    - name: Debug Section 3
      debug:
        msg: "{{ THE_CHOICE }}"

Результаты возвращаются с:

PLAY [Testing variable] **********************************************************************************************************************************************************************************************************************
TASK [Debug Section 1] ***********************************************************************************************************************************************************************************************************************ok: [localhost] => (item=MY_CHOICE1) => {
    "msg": "MY_CHOICE1"
}

TASK [Set result to a fact] ******************************************************************************************************************************************************************************************************************ok: [localhost]

TASK [Debug Section 3] ***********************************************************************************************************************************************************************************************************************ok: [localhost] => {
    "msg": [
        {
            "ansible_loop_var": "item", 
            "changed": false, 
            "failed": false, 
            "item": "MY_CHOICE1", 
            "msg": "MY_CHOICE1"
        }
    ]
}

PLAY RECAP ***********************************************************************************************************************************************************************************************************************************
localhost                  : ok=3    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

Я бы хотел, чтобы переменная THE_CHOICE просто верните предмет, но я не могу заставить его работать. В разделе set_fact я пробовал следующее:

THE_CHOICE: "{{ choice.results['item'] }}"
THE_CHOICE: "{{ choice.results.item }}"
THE_CHOICE: "{{ choice['results']['item'] }}"

Все попытки приводят к чему-то следующему:

"The task includes an option with an undefined variable. The error was: 'list object' has no attribute 'item'

Может ли кто-нибудь дать некоторое представление о том, что я отсутствует

1 Ответ

1 голос
/ 01 мая 2020

Было бы проще использовать фильтр random (начиная с Ansible 1.6):

  vars:
    choices:
      - MY_CHOICE1
      - MY_CHOICE2
  tasks:
    - name: Set fact random
      set_fact:
        THE_CHOICE: "{{ choices | random }}"

О вашей исходной пьесе choice.results - это список, содержащий один результат для каждого элемента Л oop. В вашем случае он содержит только один результат, потому что with_random_choice l oop повторяется только один раз. Итак, чтобы получить доступ к вашему предмету, вы должны выбрать первый результат списка с помощью [0]:

    - name: Set result to a fact
      set_fact:
        THE_CHOICE: "{{ choice.results[0].item }}"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...