Ansible случайное поколение UUID

в моем Ansible скрипте я хочу генерировать UUID на лету и использовать их позже.

вот мой подход:

- shell: echo uuidgen
  with_sequence: count=5
  register: uuid_list


  - uri: 
      url: http://www.myapi.com
      method: POST
      body: "{{ item.item.stdout }}"
    with_items: uuid_list.result

однако я получаю следующую ошибку:

fatal: [localhost] => One or more undefined variables: 'str object' has no attribute 'stdout'

Как я могу решить эту проблему?

5 ответов


в ansible 1.9 есть новый фильтр: to_uuid, который, учитывая строку, вернет UUID, специфичный для домена ansible, вы можете найти использование здесьhttps://docs.ansible.com/playbooks_filters.html#other-useful-filters


как metioned по Xingxing Гао, есть to_uuid который можно использовать с достаточно большим числом и random фильтр для получения случайного UUID. Чем больше число, тем больше случайность. например:

{{ 99999999 | random | to_uuid }}

или

{{ 9999999999999999999999 | random | to_uuid }}

это очень близко. Мне нужно было только кое-что изменить. Я понял это, используя задачу"debug: var=uuid_list" и выполняя.

- shell: uuidgen                # note 1
  with_sequence: count=5
  register: uuid_list
- uri:
    url: http://www.myapi.com
    method: GET
    body: "{{ item.stdout }}"    # note 2
    timeout: 1                   # note 3
  with_items: uuid_list.results  # note 4

Примечания:

  1. echo причинил строку uuidgen для печати. удалено echo, kept uuidgen.
  2. item.item.stdout должно быть item.stdout
  3. я использовал короткий тайм-аут, чтобы проверить это, не имея доступной конечной точки rest. Это дает сообщения об ошибках сбоя, но ясно, что это правильный.
  4. uuid_list.stdout должно быть uuid_list.results

одно решение, которое должно быть невосприимчивым к кэшированию / устаревшему сбору фактов и давать вам разумно случайный UUID каждый раз, когда вы его используете:

{{ 999999999999999999999 | random | string + (lookup('pipe', 'date +%s%N')) | to_uuid() }}

Он объединяет случайное число между 0 и 999999999999999999999 с текущими наносекундами с эпохи Unix и передает это через фильтр to_uuid() Ansible (доступный с версии 1.9). Кэширование фактов не должно вызывать проблем, поскольку поиск всегда оценивается каждый раз, когда они вызванный.

Если вы хотите UUID, который остается постоянным на протяжении всех пьес в playbook (но не сохраняется между несколькими вызовами playbook-даже при включенном кэшировании фактов), используйте:

set_fact: uuid={{ 999999999999999999999 | random | string + (lookup('pipe', 'date +%s%N')) | to_uuid() }}


имейте в виду, если вы используете решение Виллема, Jinja и Ansible будут кэшировать результат для нескольких исполнений одного и того же фильтра, поэтому вы должны каждый раз менять номер источника

  api_key_1: "{{ 999999999999999999995 | random | to_uuid }}"
  api_key_2: "{{ 999999999999999999994 | random | to_uuid }}"

и для ситуаций, когда вам нужен обычный md5 вместо to_uuid, хэш('md5') не принимает целое число. Самый удобный способ преобразовать random в строку, которую я нашел, - использовать to_uuid:

  api_key_3: "{{ 999999999999999999999 | random | to_uuid | hash('md5') }}"
  api_key_4: "{{ 999999999999999999998 | random | to_uuid | hash('md5') }}"