我想像这样在ansible中格式化一个字典,
从
{'a': 1, 'b': 2, 'c': 3}
到
'a=1,b=2,c=3'
并且必须将其设置为块中的环境变量,如下所示,
vars:
  test_env:
    a: 1
    b: 2
    c: 3
- block:
    # tasks
  environment:
    SOME_ENV: 'a=1,b=2,c=3'
这里我想将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(',') }}"
给
  result.stdout: a=1,b=2,c=3
更新
还有更多选择。您还可以使用Jinja或JMESPath。下面的表达式给出相同的结果
  SOME_ENV: |-
    {%- for k,v in test_env.items() %}
    {{ k }}={{ v }}{% if not loop.last %},{% endif %}
    {%- endfor %}
  SOME_ENV: "{{ test_env|dict2items|
                json_query('[].join(`=`, [key, to_string(value)])')|
                join(',') }}"
用于测试的完整剧本示例
- 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(',') }}"
给出(删节)
  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
| 归档时间: | 
 | 
| 查看次数: | 9233 次 | 
| 最近记录: |