Ansible 随机UUID生成

Ansible 随机UUID生成,ansible,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 但是,我

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

如何解决这个问题?

这很接近。我只需要改变一些事情。我通过使用任务“
debug:var=uuid\u 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
    ,保留
    uuidgen
  • item.item.stdout
    需要是
    item.stdout
  • 我使用了一个很短的超时,这样我就可以在没有rest端点可用的情况下测试它。这会给出失败错误消息,但很明显它是正确的
  • uuid\u列表。标准输出
    需要是
    uuid\u列表。结果

  • 在ansible 1.9中有一个新的过滤器:to uuid,给定一个字符串,它将返回一个ansible域特定的uuid,您可以在这里找到用法

    ,如高兴兴所述,to uuid可以与足够大的数字一起使用,
    随机
    过滤器生成一个随机uuid。数字越大,随机性越大。例如:

    {{ 99999999 | random | to_uuid }}
    


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

      api_key_1: "{{ 999999999999999999995 | random | to_uuid }}"
      api_key_2: "{{ 999999999999999999994 | random | to_uuid }}"
    
    对于需要普通md5而不是to_uid的情况,哈希('md5')不接受整数。将随机数转换为字符串最方便的方法是使用to_uuid:

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

    有一种解决方案应该不受缓存/陈旧事实收集的影响,并在每次使用时为您提供一个合理的随机UUID:

    {(999999999999999999999 |随机|字符串+(查找('pipe','date+%s%N'))|到uid()}

    它将0到999999999999999999之间的随机数与自Unix epoch以来的当前纳秒数连接起来,并通过Ansible的to_uuid()过滤器(自版本1.9起提供)将其提供给用户。事实缓存不应引起问题,因为每次调用查找时都会对其进行评估

    如果您希望UUID在剧本中的整个剧本中保持不变(但在剧本的多次调用之间不保持不变-即使事实缓存已打开),请使用:


    set_-fact:uuid={(999999999999999999 | random | string+(lookup('pipe','date+%s%N'))|到_-uuid()}

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

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

    使用相同的输入,结果总是相同的,因此您需要类似于
    {{ansible_date_time.iso8601_micro|to_uuid}}
    的东西来获得真实的uuid.J0hnG4lt这种方法不会产生随机的uuid.Yes。删除该评论,bcz。您在一些GITHUB可扮演角色中发现了这种方法,人们认为它是准备好的:UUID的点不仅是为了安全而随机化,更重要的是,不管它在何处生成,都确保跨多个服务器的唯一ID。是的,如果特定表/资源上存在安全问题,那么请务必使用spec()将其随机化,否则,如果管理员只寻找唯一性,则这没有问题。虽然Jinja通常会按照您描述的方式缓存筛选结果,与Ansible一起使用时,情况似乎并非如此。例如,我尝试了这种技术来定义一个特定于运行的随机变量,并在不同的模板中为相同变量的位置获取不同的值。在本例中,我使用Ansible 2.3.0。在
    9999…)
    周围缺少括号,因此它会抛出连接到uuid的日期,而不是从日期+随机数生成uuid<代码>{(999999999999999999999 |随机|字符串+ansible_日期_时间.iso8601_micro)|到_uuid()}在没有这个无用管道的情况下对我有效lookup@Misko查找是为了破坏事实缓存(我写这个答案时不知道ansible_date_time.iso8601_micro)。很好的括号捕捉(将编辑)。批准:这确实比其他基于随机过滤器的解决方案好;您也可以只给出所需的长度(因此熵)作为参数;e、 g.
    查找('password','/dev/null length=32')|到uuid
    。(
    /dev/null
    因为我们不需要将生成的“密码”存储在文件中)更多
    {{ lookup('password', '/dev/null chars=ascii_letters,digits') | to_uuid }}