我想像这样在ansible中格式化一个字典,
从
{'a': 1, 'b': 2, 'c': 3}
Run Code Online (Sandbox Code Playgroud)
到
'a=1,b=2,c=3'
Run Code Online (Sandbox Code Playgroud)
并且必须将其设置为块中的环境变量,如下所示,
vars:
test_env:
a: 1
b: 2
c: 3
- block:
# tasks
environment:
SOME_ENV: 'a=1,b=2,c=3'
Run Code Online (Sandbox Code Playgroud)
这里我想将test_envdict 转换为'a=1,b=2,c=3'
我无法设置事实来修改 dict 然后将其设置为SOME_ENV因为environment是一个不同的子句,也许我可以修改子句中的 dictvars但还有其他解决方案吗?
将字典分解为键和值的列表。然后压缩列表并加入项目。例如,
- block:
- command: echo $SOME_ENV
register: result
- debug:
var: result.stdout
environment:
SOME_ENV: "{{ test_env.keys()|
zip(test_env.values())|
map('join', '=')|
join(',') }}"
Run Code Online (Sandbox Code Playgroud)
给
result.stdout: a=1,b=2,c=3
Run Code Online (Sandbox Code Playgroud)
更新
还有更多选择。您还可以使用Jinja或JMESPath。下面的表达式给出相同的结果
SOME_ENV: |-
{%- for k,v in test_env.items() %}
{{ k }}={{ v }}{% if not loop.last %},{% endif %}
{%- endfor %}
Run Code Online (Sandbox Code Playgroud)
SOME_ENV: "{{ test_env|dict2items|
json_query('[].join(`=`, [key, to_string(value)])')|
join(',') }}"
Run Code Online (Sandbox Code Playgroud)
用于测试的完整剧本示例
- hosts: all
vars:
test_env:
a: 1
b: 2
c: 3
tasks:
- block:
- command: "echo ${{ item }}"
register: result
loop: [SOME_ENV, SOME_EN2, SOME_EN3]
- debug:
msg: "{{ result.results|
items2dict(key_name='item', value_name='stdout') }}"
environment:
SOME_ENV: "{{ test_env.keys()|
zip(test_env.values())|
map('join', '=')|
join(',') }}"
SOME_EN2: |-
{%- for k,v in test_env.items() %}
{{ k }}={{ v }}{% if not loop.last %},{% endif %}
{%- endfor %}
SOME_EN3: "{{ test_env|dict2items|
json_query('[].join(`=`, [key, to_string(value)])')|
join(',') }}"
Run Code Online (Sandbox Code Playgroud)
给出(删节)
msg:
SOME_EN2: a=1,b=2,c=3
SOME_EN3: a=1,b=2,c=3
SOME_ENV: a=1,b=2,c=3
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
9233 次 |
| 最近记录: |