Ansible随机UUID生成

时间:2015-05-28 19:58:43

标签: ansible

在我的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'

我该如何解决这个问题?

6 个答案:

答案 0 :(得分:14)

在ansible 1.9中有一个新的过滤器:to_uuid,它给出一个字符串,它将返回一个特定于ansible域的UUID,你可以在这里找到用法https://docs.ansible.com/playbooks_filters.html#other-useful-filters

答案 1 :(得分:10)

正如高兴兴所提到的,to_uuid可以使用足够大的数字和random过滤器来生成随机UUID。数字越大,随机性越大。例如:

{{ 99999999 | random | to_uuid }}

{{ 9999999999999999999999 | random | to_uuid }}

答案 2 :(得分:5)

这非常接近。我只需改变一些东西。我通过使用任务“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,已保留uuidgen
  2. item.item.stdout需要item.stdout
  3. 我使用了一个短暂的超时,所以我可以在没有休息端点的情况下测试它。这会给出失败错误消息,但很明显它是正确的。
  4. uuid_list.stdout需要uuid_list.results

答案 3 :(得分:3)

一个解决方案应该不受缓存/陈旧事实收集的影响,每次使用时都会给你一个合理的随机UUID:

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

它连接0到999999999999999999999之间的随机数,自Unix纪元以来的当前纳秒,并通过Ansible的to_uuid()过滤器(从版本1.9开始提供)。事实缓存不应该导致问题,因为每次调用它们时都会对查询进行评估。

如果你想让一个UUID在剧本中的整个剧本中保持不变(但是在剧本的多次调用之间不会持续存在 - 即使启用了事实缓存),也可以使用:

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

答案 4 :(得分:1)

请注意,如果您使用Willem的解决方案,Jinja和Ansible将缓存多次执行同一过滤器的结果,因此您必须每次更改源编号

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

对于需要普通md5而不是to_uuid的情况,hash(' md5')不接受整数。将随机转换为我发现的字符串最方便的方法是使用to_uuid:

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

答案 5 :(得分:0)

从20个字符的字符串(包含大小写字母和数字)生成随机UUID:

{{ lookup('password', '/dev/null chars=ascii_letters,digits') | to_uuid }}