在我的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'
我该如何解决这个问题?
答案 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
注意:
echo
导致字符串uuidgen
被打印。已移除echo
,已保留uuidgen
。item.item.stdout
需要item.stdout
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 }}