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
Примечания:
-
echo
причинил строкуuuidgen
для печати. удаленоecho
, keptuuidgen
. -
item.item.stdout
должно бытьitem.stdout
- я использовал короткий тайм-аут, чтобы проверить это, не имея доступной конечной точки rest. Это дает сообщения об ошибках сбоя, но ясно, что это правильный.
-
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') }}"